【发布时间】:2015-04-09 05:06:42
【问题描述】:
为什么使用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()是过去的迭代器。它不指向可以擦除的元素。 -
因为 C++ 的约定是范围是半开的:
[begin, end)。 -
Begin 是您从第一个元素开始的地方。 End 是你结束的地方,当你过去最后一个元素时。 (您可能需要
rbegin,这是元素序列以相反顺序开始的位置,即最后一个元素。)如果begin是第一个元素,end是最后一个元素,那么插入函数将如何工作?如果它在指定的迭代器之后插入,则不能将某些内容放在开头。如果它之前插入,你不能把东西放在最后。 -
@DavidSchwartz ,我明白了 :) 对于空范围, begin() 将等于 end() ,这是有道理的。