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

 

posted @ 2017-01-14 21:18  huluBrother  阅读(220)  评论(0)    收藏  举报