擦除vector.end()失败

Abh*_*yal 2 c++ iterator stl vector

为什么 using 会vector.erase(vector.end())产生

Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)

使用此代码时:

#include <iostream>
#include <vector>
using namespace std;

void printMe(vector<int>& v){ for(auto &i:v) cout<<i<<" "; cout<<"\n"; }

int main() {
    vector<int> c = { 1,2,3,4,5,6,7,8};
    printMe(c);
    c.erase(c.begin());
    printMe(c);
    c.erase(c.begin());
    printMe(c);
    // c.erase(c.end()); //will produce segmentation fault
    // printMe(c);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我对这些迭代器有点陌生,所以这让我措手不及。虽然我知道存在vector.pop_back()。我很想知道到底是什么原因造成的。

程序的链接

sha*_*ats 5

vector::end()不指向最后一个元素,它指向最后一个元素之后的元素。

引用cplusplus.com

std::vector::end

返回引用向量容器中末尾元素的迭代器。

尾后元素是向量中最后一个元素之后的理论元素。它不指向任何元素,因此不应取消引用。

由于标准库函数使用的范围不包括其闭迭代器所指向的元素,因此该函数通常与 结合使用来vector::begin指定包括容器中所有元素的范围。

因此,它没有任何内容erase(),因此会出现错误。


代替

c.erase(c.end());
Run Code Online (Sandbox Code Playgroud)

c.erase(c.end() - 1);
Run Code Online (Sandbox Code Playgroud)