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

时间:2017-06-29 17:45:04

标签: c++ vector

我是一名新的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)

7 个答案:

答案 0 :(得分:8)

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将迭代器返回到容器的一端。之前的元素是向量中的最后一个元素。

答案 1 :(得分:6)

以下是

的说明
v: [ 1 | 2 | 3 | 4 | ... | 999 ]
                                
   front()                back() end()
     
   begin()

其中front()back()分别返回对第一个和最后一个元素的(const)引用,end()返回迭代器(一种指针) )超出向量的最后一个元素。 begin()将向迭代器返回向量的第一个元素。

这些也在std::vector

解释
  

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

从大小中减去一个是因为C或C ++中的索引从零开始,而不是通常的一个。这意味着,为了访问数组的第一个元素,或者在这个向量的情况下,你说

v[0]

而不是

v[1]

同样对于最后一个(第n个)元素,你不会采用数组的sizen(向量),而是少一个,例如。

v[size() - 1]

v[n - 1]

答案 2 :(得分:3)

回答你的标题问题:

函数调用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);

回答您的内容提问: 我们从0开始计算,就像@ FrankS101所说的那样。

答案 3 :(得分:2)

vector.end() - 返回一个迭代器,引用向量容器中的past-the-end元素。 vector.back() - 返回对向量中最后一个元素的引用。

答案 4 :(得分:1)

来自cplusplus

  

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

     

与成员vector :: end不同,它返回一个迭代器   element,此函数返回直接引用。

     

在空容器上调用此函数会导致未定义的行为。

答案 5 :(得分:0)

std::vector::end()是超出包含std::vector::back()的迭代器之一。

答案 6 :(得分:-1)

back()仅返回对最后一个元素的引用。而 end()返回指向最后一个元素的指针或迭代器。另外,当使用 begin()从头开始执行迭代时, end()可用于检查停止条件。