vector的erase() 导致 Expression: vector iterator not incrementable
C++标准容器vector的erase方法和错误
Expression: vector iterator not incrementable
对于vector容器的迭代器指针,vector给出的标准删除操作是
iterator erase( iterator loc );
iterator erase( iterator start, iterator end );
中文解释是erase函数要么删作指定位置loc的元素,要么删除区间[start, end)的所有元素.返回值是指向删除的最后一个元素的下一位置的迭代器。
也就是说对于
vector<char>::iterator it;
for (it = vec.begin(); it != vec.end(); it++)
{
vec.erase(it);
}
要格外注意
因为这样操作后,容器内容已经改变了,it所在的位置已经删除了,此时的it已经变为一个野指针了,不能执行地址操作了
正确的格式应该是
vector<char>::iterator it;
for (it = vec.begin(); it != vec.end();)
{
if()
{
it = vec.earse(it);
}
else
{
it ++;
}
}
例子:
#include <iostream> #include <vector> using namespace std; int main() { vector<char> vec; for (int i = 48; i < 125; i++) { vec.push_back((char)i); } vector<char>::iterator it; for (it = vec.begin(); it != vec.end(); it++) { cout << *it << " "; } cout << endl; for (it = vec.begin(); it != vec.end();) { if (( (*it) < 58) || ((*it) > 64 && (*it) < 91) || ( ((*it) > 96) && ((*it) <123) )) { it++; } else { it = vec.erase(it); } } cout << "删除非数字和字母" << endl; cout << endl; for (it = vec.begin(); it != vec.end(); it++) { cout << *it << " "; } cout << endl; //错误删除 for (it = vec.begin(); it != vec.end(); it++) { if ((*it) == 'A' ) { vec.erase(it); //break; } } system("pause"); return 0; }

浙公网安备 33010602011771号