![](/img/trans.png)
[英]Difference between vector.back() and vector[vector.size() - 1]?
[英]What is the difference between vector.back() and vector.end()?
我是一個新的 C++ 學習者,我閱讀了一個關於 C++ STL 從向量訪問最后一個元素的代碼塊。
為什么第 6、7 和 8 行的代碼需要減 1 才能等於第 5 行的代碼?
1. std::vector<int> v;
2. v.push_back(999);
3. //fill up the vector
4. //...
5. int j = v.back();
6. int j = v.[size-1]
7. int j = v.at(v.size()-1)
8. int j = *(v.end()-1)
這是一個說明哪個是哪個
v: [ 1 | 2 | 3 | 4 | ... | 999 ]
🡑 🡑 🡑
front() back() end()
🡑
begin()
其中front()
和back()
返回對第一個和最后一個元素的 (const) 引用,而end()
返回一個迭代器(某種指針),指向向量的最后一個元素之外的一個元素。 begin()
返回指向向量第一個元素的迭代器。
這些也在std::vector
解釋
front
訪問第一個元素back
訪問最后一個元素
end
/cend
返回一個迭代器到最后
begin
/cbegin
返回一個迭代器到開頭
從 size 中減去 1 是因為 C 或 C++ 中的索引從 0 開始,而不是通常的 1。 這意味着,為了訪問數組的第一個元素,或者在這個向量的情況下,你說
v[0]
並不是
v[1]
同樣,對於最后一個(第 n 個)元素,您不會采用數組(向量)的size
或n
,而是少一個,例如
v[size() - 1]
或
v[n - 1]
5. int j = v.back();
std::vector::back
被定義為返回向量中的最后一個元素。 這是直截了當的。
7. int j = v.[size-1]
索引是基於 c++ 的 0。 如果順序容器有 N 個元素,則有效索引介於 0 和 N-1 之間。 因此,最后一個元素是 N-1 或size()-1
。
8. int j = *(v.end()-1)
std::vector::end
返回一個迭代器到容器的最后一個。 之前的元素是向量中的最后一個元素。
要回答您的標題問題:
函數調用 begin(), end() 將返回一個迭代器位置。 back() 只是返回 Vector 中的最后一個元素。 通常以這種方式使用 begin() 和 end()。
vector<int>::iterator i = someVector.begin(); //or someVector.end();
while(i != someVector.end()){
//do something;
i++;
} //this will loop through all elements in the vector;
正如其他人所提到的, .end() 是最后一個元素之后的 1 個位置。 距離取決於數據結構實現和數據類型。 在您的情況下,您甚至可以將迭代器視為指向 int 的指針。 (但它們不是!!!)所以如果你取消引用它,它會給你一個值。 事實上,`
someVector.back();
是相同的
*(someVector.end()-1);
回答您的內容問題:我們從@FrankS101 所說的 0 開始計數。
vector.end() - 返回一個迭代器,引用向量容器中的最后元素。 vector.back() - 返回對向量中最后一個元素的引用。
從cplusplus :
back() 返回對向量中最后一個元素的引用。
與成員 vector::end 不同,它返回一個剛剛經過這個元素的迭代器,這個函數返回一個直接引用。
在空容器上調用此函數會導致未定義的行為。
std::vector::end()
是一個超越包含std::vector::back()
的迭代器。
back()只返回對最后一個元素的引用。 而end()返回指向最后一個元素的指針或迭代器。 此外,當使用begin()從頭開始執行迭代時, end()可用於檢查停止條件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.