2010-01-21 73 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現在可以作爲我的隊列類的一個插入替換。我必須改變的唯一代碼是我的算法中容器的類型。

相關問題