为什么使用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。
答案 0 :(得分:3)
vector::end()
未指向最后一个元素,它指向后面的元素最后一个元素。
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);