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

Nin*_*ang 7 c++ vector

我是一个新的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)
Run Code Online (Sandbox Code Playgroud)

Fra*_*eux 9

5. int j = v.back();
Run Code Online (Sandbox Code Playgroud)

std::vector::back被定义为返回向量中的最后一个元素.这是直截了当的.

7. int j = v.[size-1]
Run Code Online (Sandbox Code Playgroud)

指数是基于c ++的0.如果顺序容器具有N个元素,则有效索引包含在0和N-1之间.最后一个元素就是N-1,或者size()-1.

8. int j = *(v.end()-1)
Run Code Online (Sandbox Code Playgroud)

std::vector::end将迭代器返回到容器的一端.之前的元素是向量中的最后一个元素.


Ola*_*che 7

这是哪个的说明

v: [ 1 | 2 | 3 | 4 | ... | 999 ]
                                
   front()                back() end()
     
   begin()
Run Code Online (Sandbox Code Playgroud)

其中front(),分别back()返回第一个和最后一个元素的(const)引用,并end()返回一个迭代器(某种指针),该迭代器指向向量的最后一个元素之外的元素。begin()将迭代器返回到向量的第一个元素。

这些也解释在 std::vector

front访问第一个元素
back访问最后一个元素
end/cend将迭代器返回到结尾
begin/cbegin将迭代器返回到开头


从大小中减去一个是因为C或C ++中的索引从零开始,而不是通常的一个。这意味着,为了访问数组的第一个元素,或者在这种情况下为向量,您说

v[0]
Run Code Online (Sandbox Code Playgroud)

并不是

v[1]
Run Code Online (Sandbox Code Playgroud)

同样,对于最后一个(nth)元素,您不会采用sizen作为数组(向量),而是少一个,例如

v[size() - 1]
Run Code Online (Sandbox Code Playgroud)

要么

v[n - 1]
Run Code Online (Sandbox Code Playgroud)


Aak*_*rma 2

来自cplusplus

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

与成员 vector::end 返回刚刚经过此元素的迭代器不同,此函数返回直接引用。

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

  • @user4581301 只是在 cppreference.com 上看到 std::move 的最后编辑让我觉得,它们没有什么不同。只是没有人需要在 SO 上写这件事。如果我想要真正可靠的信息,那么我会转向标准本身。对于初学者来说 cplusplus.com 就足够了。如果您发现错误,可以修复它。 (2认同)