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

gpnt7bae  于 2024-01-09  发布在  其他
关注(0)|答案(7)|浏览(112)

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

字符串

dgsult0t

dgsult0t1#

这里有一个例子,

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

字符串
其中front()back()分别返回第一个和最后一个元素的(const)引用,end()返回一个 iterator(指针类型),指向vector最后一个元素之外的元素。begin()返回一个迭代器,指向vector的第一个元素。
这些也在std::vector中进行了解释
front访问第一个元素
back访问最后一个元素
end / cend返回一个迭代器到末尾
begin / cbegin返回一个迭代器到开头
通常,你从1开始计数。这在C或C中是不同的,在C或C中,数组或序列的索引(或从开始的偏移量)从零开始。这就是为什么你必须从大小中减去1的原因。这意味着,为了访问数组的第一个元素,或者在这种情况下是向量,你说

v[0]


而不是

v[1]


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

v[size() - 1]


v[n - 1]

vxqlmq5t

vxqlmq5t2#

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

mzaanser

mzaanser3#

回答你的标题问题:
函数调用开始(),end()将返回一个迭代器位置。back()简单地返回Vector中的最后一个元素。通常开始()和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所述。

fcwjkofz

fcwjkofz4#

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

yv5phkfx

yv5phkfx5#

cplusplus
back()返回vector中最后一个元素的引用。
与成员vector::end不同,它返回一个刚好经过此元素的迭代器,此函数返回一个直接引用。
在空容器上调用此函数会导致未定义的行为。

js81xvg6

js81xvg66#

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

fykwrbwg

fykwrbwg7#

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

相关问题