簡體   English   中英

vector.back() 和 vector.end() 有什么區別?

[英]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 個)元素,您不會采用數組(向量)的sizen ,而是少一個,例如

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM