我是一个新的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条答案
按热度按时间dgsult0t1#
这里有一个例子,
字符串
其中
front()
和back()
分别返回第一个和最后一个元素的(const)引用,end()
返回一个 iterator(指针类型),指向vector最后一个元素之外的元素。begin()
返回一个迭代器,指向vector的第一个元素。这些也在
std::vector
中进行了解释front
访问第一个元素back
访问最后一个元素end
/cend
返回一个迭代器到末尾begin
/cbegin
返回一个迭代器到开头通常,你从1开始计数。这在C或C中是不同的,在C或C中,数组或序列的索引(或从开始的偏移量)从零开始。这就是为什么你必须从大小中减去1的原因。这意味着,为了访问数组的第一个元素,或者在这种情况下是向量,你说
型
而不是
型
同样,对于最后一个(第n个)元素,你不会取数组(向量)的
size
或n
,而是少一个,例如。型
或
型
vxqlmq5t2#
字符串
std::vector::back
被定义为返回向量中的最后一个元素。这是直接的。型
在c++中,索引是0。如果顺序容器有N个元素,则有效索引介于0和N-1之间(包括0和N-1)。因此,最后一个元素是N-1,或
size()-1
。型
std::vector::end
返回一个迭代器到容器的末尾。之前的元素是向量中的最后一个元素。mzaanser3#
回答你的标题问题:
函数调用开始(),end()将返回一个迭代器位置。back()简单地返回Vector中的最后一个元素。通常开始()和end()是这样使用的。
字符串
正如其他人所提到的,.end()是最后一个元素后的1个位置。距离取决于数据结构实现和数据类型。在您的情况下,您甚至可以将迭代器视为指向int的指针。(但它们不是!)因此,如果您解引用它,它将给予您一个值。事实上,`
型
是一样的
型
为了回答您的内容问题:我们从0开始计数,如@FrankS101所述。
fcwjkofz4#
vector.end()-返回一个指向vector容器中最后一个元素的迭代器。vector.back()-返回一个指向vector中最后一个元素的引用。
yv5phkfx5#
从cplusplus:
back()返回vector中最后一个元素的引用。
与成员vector::end不同,它返回一个刚好经过此元素的迭代器,此函数返回一个直接引用。
在空容器上调用此函数会导致未定义的行为。
js81xvg66#
std::vector::end()
是包含std::vector::back()
的迭代器之外的一个。fykwrbwg7#
**back()只返回最后一个元素的引用。而end()**返回最后一个元素的指针或迭代器。此外,**end()可以用来检查当使用begin()**从头开始执行迭代时的停止条件。