2010-01-21 76 views
17

对不起,如果这之前已经问过,但我想知道std::vector::front()是什么使用。什么是std :: vector :: front()用于?

是否有理由使用例如myvector.front()而不是myvector[0]myvector.at(0)

+0

更有趣...为什么有一个前()时已经有一个begin()? – Inverse 2010-01-21 21:36:55

+0

@反过来:因为容器适配器'std :: queue'和'std :: stack'具有'front()'而不是'begin()'。 – 2010-01-22 00:38:40

+0

为了与back()一致,myvector [myvector.size() - 1]并不是那么直截了当。 – dalle 2012-05-04 21:22:52

回答

17

一些也可用于列表的通用算法使用它。

这是一般原则的例子:如果你对所有的语义您的支持,而不仅仅是实施您的支持提供访问器,它更容易编写一般,因此更易于重用代码。

+1

+1:实体编辑。 – 2010-01-21 18:22:27

+1

啊,所以它更多的是与其他容器类的一致性。 出于好奇:vector :: front()等于[0]还是等于(0)? 我的意思是,如果矢量是空的,会发生什么? – Tim 2010-01-21 20:45:23

+1

@Tim:好问题。维基百科说未定义的行为:http://en.wikipedia.org/wiki/Vector_(C%2B%2B)和http://fredosaurus.com/notes-cpp/stl-containers/sequence-functions.html说相同作为[0],如果矢量是空的,我想也是不确定的。 – dmckee 2010-01-21 21:37:42

13

如果myvector的类型更改为另一种不可索引的数据类型,例如列表,则不必更改访问容器前端的代码。

+2

您和上一张海报的答案应该合并。抽象概念+获胜的具体例子。 – Omnifarious 2010-01-21 17:49:55

4

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

比方说,我已经写了一个使用队列类的算法。它有一个front()函数来获取队列的下一个元素,以及一个enqueue()函数来添加到队列的末尾。现在让我们说,我发现这个队列类写得很差很慢,我宁愿使用速度更快的std :: vector(我知道有一个std ::队列,这只是一个例子)。如果获得std :: vector的第一个元素的唯一方法是使用v [0],那么我必须通过我的代码,并用[0]替换所有对front()的调用。但通过实现front(),std :: vector现在可以作为我的队列类的一个插入替换。我必须改变的唯一代码是我的算法中容器的类型。

相关问题