您的位置:首页 > 编程语言 > C语言/C++

C++ 使用vector 出现"vector iterator not incrementable"或"vector iterator + offset out of range"错误的情况

2017-05-18 21:48 711 查看
测试代码1: 

vector<CString> g_vtStr1;

vector<CString> g_vtStr2;

vector<CString> g_vtStr3;

  g_vtStr1.push_back(_T("Test1"));

    g_vtStr1.push_back(_T("Test2"));

    g_vtStr1.push_back(_T("Test3"));

    g_vtStr1.push_back(_T("Test0"));

    sort(g_vtStr1.begin(),g_vtStr1.end());

    g_vtStr2.push_back(_T("data1"));

    g_vtStr2.push_back(_T("data2"));
    g_vtStr3.resize(g_vtStr2.size());
//如果g_vtStr3 的  size要小于 g_vtStr1-g_vtStr2的差值 下面会报错奔溃,因此必须保证g_vtStr3 的size大小足够容纳差值

   vector<CString>::const_iterator it = set_difference(g_vtStr1.begin(),g_vtStr1.end(),g_vtStr2.begin(),g_vtStr2.end(),g_vtStr3.begin());

测试代码2:

    for (vector<CString>::const_iterator i = g_vtStr1.begin();i != g_vtStr1.end();++i)

    {

        if ( i->CompareNoCase(_T("Test0")) == 0 )

        {

            i = g_vtStr1.erase(i);//此处会报错

        }

    }

代码在处理Iterator的earse的时候有点问题。当执行了一次earse操作之后,原来用来遍历的iterator就失效了。同时earse操作会返回一个指向r下一个元素的iterator,如果想继续遍历,就得用返回的iterator继续操作。

改成:

    for (vector<CString>::const_iterator i = g_vtStr1.begin();i != g_vtStr1.end();)

    {

        if ( i->CompareNoCase(_T("Test0")) == 0 )

        {

            i = g_vtStr1.erase(i);

        }

        else

        {

            ++i;

        }

    }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐