vector.back()和vector.end()有什么区别

What is the difference between vector.back() and vector.end()?

本文关键字:vector 什么 区别 back end      更新时间:2023-10-16

我是一个新的C 学习者,我读了一个有关C STL访问Vector的代码块。

为什么第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() iterator (有点像指针(返回到向量的最后一个元素之外的一个。begin()将迭代器返回到向量的第一个元素。

这些也可以在std::vector

上解释

front访问第一个元素
back访问最后一个元素
end/cend将迭代器返回到结束
begin/cbegin将迭代器返回到开始


通常,您开始计数一个。这在C或C 中有所不同,索引成阵列或序列的地方从零开始。这是原因,为什么您必须从大小中减去一个。这意味着,为了访问数组的第一个元素,或者在这种情况下,您会说

v[0]

而不是

v[1]

同样,对于最后一个(nth(元素,您不会服用数组(向量(的sizen,而是少一个,例如,例如。

v[size() - 1]

v[n - 1]
5. int j = v.back();

std::vector::back被定义为返回向量中的最后一个元素。这很简单。

7. int j = v.[size-1]

索引为0基于C 。如果顺序容器具有N元素,则有效索引包含在0和N-1之间。最后一个元素是N-1或size()-1

8. int j = *(v.end()-1)

std::vector::end将迭代器返回到容器的一正末端。之前的元素是向量中的最后一个元素。

回答您的标题问题:

函数调用begin((,end((将返回迭代器位置。Back((只需返回向量中的最后一个元素。通常使用以这种方式使用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);

回答您的内容问题:我们从0开始计数如 @franks101所述。

vector.end(( - 返回迭代器,涉及向量容器中的过去元素。vector.back(( - 返回对向量中的最后一个元素的引用。

来自cplusplus:

back((返回对向量中的最后一个元素的引用。

与成员vector ::结束不同 元素,此功能返回直接参考。

在空容器上调用此功能会导致不确定的行为。

std::vector::end()是迭代器之外的一个,它包含std::vector::back()

back((只是返回对最后一个元素的引用。而 end((将指针或迭代器返回到最后一个元素。另外, end((可以使用 begin((

相关文章: