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

问题描述 投票:0回答:7

我是一名新 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)
c++ vector
7个回答
28
投票

这是一个说明哪个是哪个

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]

12
投票
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
返回一个迭代器到容器的末尾。前面的元素就是向量中的最后一个元素。


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);

回答您的内容问题: 正如 @FrankS101 所说,我们从 0 开始计数。


2
投票

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


1
投票

来自cplusplus

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

与成员向量::end不同,它返回一个刚刚过去的迭代器 元素,该函数返回直接引用。

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


0
投票

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


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.