我是一名新 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()
返回指向向量最后一个元素之外的元素的 iterator (某种指针)。 begin()
返回指向向量第一个元素的迭代器。
std::vector
访问第一个元素front
访问最后一个元素back
/end
返回一个迭代器到末尾cend
/begin
将迭代器返回到开头cbegin
通常,您从一开始数。这在 C 或 C++ 中是不同的, 其中数组或序列的索引(或从头开始的偏移量)从零开始。这是 原因,为什么你必须从大小中减去一。这意味着, 为了访问数组的第一个元素,或者在本例中是向量,你可以说
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 之间(包括 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() 返回对向量中最后一个元素的引用。
与成员向量::end不同,它返回一个刚刚过去的迭代器 元素,该函数返回直接引用。
在空容器上调用此函数会导致未定义的行为。
std::vector::end()
是包含 std::vector::back()
的迭代器之外的一个。
back()仅返回对最后一个元素的引用。而 end() 返回指向最后一个元素的指针或迭代器。此外,当使用 begin() 从头开始迭代时,end() 可用于检查停止条件。