我是一名新的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)
答案 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个)元素,你不会采用数组的size
或n
(向量),而是少一个,例如。
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()可用于检查停止条件。