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;
}
}
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;
}
}
相关文章推荐
- C++学习之路(14)---vector报错:vector iterator not incrementable"或"vector iterator + offset out of range"
- 使用容器出现vector subscript out of range等类似错误
- C++ 中的vector iterator offset out of range问题
- 使用vector出现的错误 subscript out of range
- C++泛型指针的正向与逆向循环读取时报错Expreeeion:vector iterator + offset out of range问题
- c++执行程序出现"unable to find a version of the runtime"的错误提示
- 使用Openjdk7编译android源码出现"Could not initialize NSS"错误的解决办法
- java使用Iterator迭代出现"java.uitl.ConcurrentModificationException"错误原因及解决方法概述
- .NET中使用GridView控件输入数据时出现“ Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index"的问题
- 操作XmlDocument时,出现"System.OutOfMemoryException"异常,如何解决加载大数据的情况?
- MySQL5错误 #1264 "Out of range value adjusted for column ..."
- python 处理中文时出现的错误'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决方法
- MAVEN2使用mvn install命令出现java.lang.OutOfMemoryError错误解决办法
- MPI编译C++程序出现#error "SEEK_SET is #defined but must not be for the C++ binding of MPI" 的解决方法
- python处理字符串时出现的错误'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)" 解决方法
- VS2010出现"_ITERATOR_DEBUG_LEVEL"不匹配项的错误原因
- 类语句.NET下编译C++代码时出现"error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int"错误的解决方法。
- GridView输入Excel时出现"System.OutOfMemoryException: Out of memory"及其解决方案。
- 忆龙2009:使用ACS进行机器跨域认证出现错误:"NTLIB: Could not find machine host"
- 忆龙2009:使用ACS进行机器跨域认证出现错误:"NTLIB: Could not find machine host"