以一个字符串数组为例.
#include <vector>
using namespace std;
typedef vector<CString> VEC_STRING;
VEC_STRING vecStr;
vecStr.push_back( _T( "str1" ) );
vecStr.push_back( _T( "str2" ) );
vecStr.push_back( _T( "str3" ) );
有错误的方法:
VEC_STRING::iterator iter;
VEC_STRING::iterator iterDel;
iter = vecStr.begin();
for ( ; iter != vecStr.end(); )
{
CString strTemp = *iter;
if ( strTemp.Compare( _T( "qin" ) ) == 0 )
{
iterDel = iter;
iter++;
vecStr.erase( iterDel );
continue;
}
iter++;
}
本以为这样在删除后,迭代器的指针指向被删除的下一个元素。可是在进行下一次循环时就会异常。
正确的方法
VEC_STRING::iterator iter;
iter = vecStr.begin();
for ( ; iter != vecStr.end(); )
{
CString strTemp = *iter;
if ( strTemp.Compare( _T( "str1" ) ) == 0 )
{
iter = vecStr.erase( iter );
continue;
}
iter++;
}
说明:
iterator erase ( iterator position );
函数调用后使指向position和first之后的所有迭代器失效,也就造成了异常。
返回值则是一个指向删除的最后一个元素后面的元素的迭代器。
本文介绍在C++中使用迭代器从vector容器中删除元素时的正确做法与常见错误。通过对比两种不同方法,解释了为何直接递增迭代器会导致程序异常,并展示了如何正确更新迭代器以避免此类问题。
2626

被折叠的 条评论
为什么被折叠?



