std::vector::front()是用来做什么的?

31

非常抱歉如果之前已经有人问过这个问题,但是我想知道std::vector::front()的用途。

使用myvector.front()相比于使用myvector[0]或者myvector.at(0)是否有什么原因?


更有趣的是,既然已经有begin(),为什么还需要front()呢? - Inverse
@Inverseпјље› дёєе®№е™ЁйЂ‚й…Ќе™Ёstd::queueе’Њstd::stackе…·жњ‰front()дЅ†жІЎжњ‰begin()гЂ‚ - Steve Jessop
为了与 back() 保持一致,myvector[myvector.size() - 1] 并不是那么简单明了的。 - dalle
3个回答

28

有些通用算法也可以在列表上使用。

这是一个通用原则的例子:如果您为支持的所有语义提供访问器,而不仅仅是支持的实现,那么编写通用代码就更容易,因此重用代码也更容易。


2
啊,所以这更多是与其他容器类的一致性有关。 只是出于好奇:vector::front() 相当于 [0] 还是 at(0)? 我的意思是,如果向量为空会发生什么? - Tim
1
@Tim:好问题。维基百科说未定义行为:http://en.wikipedia.org/wiki/Vector_(C%2B%2B),而http://fredosaurus.com/notes-cpp/stl-containers/sequence-functions.html也说了同样的事情,就像[0]一样,如果向量为空,那么这也是未定义的。 - dmckee --- ex-moderator kitten
看起来我的问题现在完全得到了解答。谢谢大家的帮助! - Tim
如果向量为空,则 at(0) 会抛出异常。 - luizfls

17
如果myvector类型更改为另一种不可索引的数据类型,比如list,访问容器前端的代码无需更改。

2
你和之前的回答者的答案应该结合起来。抽象概念+具体例子,胜利在握。 - Omnifarious

6

这样做提供了一种称为静态多态性的东西。

假设我使用队列类编写了一个算法。它有一个front()函数来获取队列的下一个元素,以及一个enqueue()函数来添加到队列的末尾。现在假设我发现这个队列类编写得很差,并且非常慢,我更想使用std::vector,因为它更快(我知道有一个std::queue,这只是一个例子)。如果要使用v[0]才能获得std::vector的第一个元素,那么我必须查找我的代码并将所有front()调用替换为[0]。但通过实现front(),std::vector现在可以成为我的队列类的即插即用替代品。我唯一需要改变的代码是算法中容器的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接