擦除 vector.end() 失败

Erasing vector.end() fails

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

Segmentation fault (core dumped)

使用此代码时:

#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;
}

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

一个link到程序。

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

因此它不指向元素。

因此,没有要删除的内容。

如果你想删除最后一个元素,你需要删除之前的元素,就像你在你的ideone中所做的那样link。

Vector 的 end() returns 一个迭代器,指向容器中最后一个元素之后的元素。

所以你试图擦除不属于你的内存,这会产生 SIGSEGV (11)。

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

引用 cplusplus.com,

std::vector::end

Returns an iterator referring to the past-the-end element in the vector container.

The past-the-end element is the theoretical element that would follow the last element in the vector. It does not point to any element, and thus shall not be dereferenced.

Because the ranges used by functions of the standard library do not include the element pointed by their closing iterator, this function is often used in combination with vector::begin to specify a range including all the elements in the container.

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


替换

c.erase(c.end());

c.erase(c.end() - 1);

如上面提到的volerag只是替换 c.erase(c.end()); 和 c.erase(c.end()-1);