擦除vector.end()失败

时间:2015-04-09 05:06:43

标签: c++ vector

为什么使用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

4 个答案:

答案 0 :(得分:3)

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

引用cplusplus.com

  

std::vector::end

     

返回一个迭代器,引用该中的past-the-end元素   矢量容器。

     

过去的元素是随后的理论元素   向量中的最后一个元素。它没有指向任何元素,和   因此不得解除引用。

     

因为标准库函数使用的范围不符合   包括它们的闭合迭代器指向的元素,这个函数   通常与vector::begin结合使用以指定范围   包括容器中的所有元素。

因此,它没有erase(),因此错误。


替换

c.erase(c.end());

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

答案 1 :(得分:0)

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

因此它没有指向一个元素。

因此,没有什么可以删除。

如果您想删除最后一个元素,则需要删除之前的元素,就像在ideone链接中一样。

答案 2 :(得分:0)

Vector end()返回一个迭代器,引用应该在容器中的最后一个元素之后的元素。

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

答案 3 :(得分:0)

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