关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
来源:互联网 发布:程序员有黑客的技术? 编辑:程序博客网 时间:2024/05/20 00:17
做个测试,随便搞个类,头文件加入
#include <vector>
#include <list>
using namespace std;
typedef std::vector<CString> CStringVector;
然后在一个可执行到的方法中加入如下代码:
CStringVector vctCString;
vctCString.push_back(_T("1111"));
vctCString.push_back(_T("2222"));
vctCString.push_back(_T("3333"));
vctCString.push_back(_T("4444"));
vctCString.push_back(_T("5555"));
CStringVector::iterator it = vctCString.begin();
for (; it != vctCString.end(); it++)
{
CString strTemp = *it;
if (strTemp == _T("1111"))
{
vctCString.erase(it);
}
}
很明显,当erase那个it后,再执行it++就会失败,这是最常见的问题,erase之后会导致it失效,怎么解决呢?
erase的返回值是下一个元素的位置,让这个值重新付给it就行了。但是粗心的人会这么写:
CStringVector vctCString;
vctCString.push_back(_T("1111"));
vctCString.push_back(_T("1111"));
vctCString.push_back(_T("3333"));
vctCString.push_back(_T("4444"));
vctCString.push_back(_T("5555"));
CStringVector::iterator it = vctCString.begin();
for (; it != vctCString.end(); it++)
{
CString strTemp = *it;
if (strTemp == _T("1111"))
{
CStringVector::iterator itTemp = vctCString.erase(it);
it = itTemp;
}
}
这么写对吗?也不对,但不会崩溃,也就是解决了前面的问题,但是带来了新的问题,这样写的话会导致这个for循环少循环一次,也就少判断了一次,哪一次呢?就是if成立后的下一个元素,没有判断到,原因就不用说了吧。
最正确的写法是:
CStringVector vctCString;
vctCString.push_back(_T("1111"));
vctCString.push_back(_T("1111"));
vctCString.push_back(_T("3333"));
vctCString.push_back(_T("4444"));
vctCString.push_back(_T("5555"));
CStringVector::iterator it = vctCString.begin();
for (; it != vctCString.end(); )
{
CString strTemp = *it;
if (strTemp == _T("1111"))
{
CStringVector::iterator itTemp = vctCString.erase(it);
it = itTemp;
}
else
{
it++;
}
}
什么意思?for小括号里的it++不写了,放到里面来,这样当if有效的时候,其实已经是it++过了,所以这种情况不需要小括号内再++了,再++就加多了,当if无效的时候正常执行else的it++。明白了不?不明白给我发邮件吧。haoxing168@163.com
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- 关于STL erase的iterator失效问题
- 关于STL erase的iterator失效问题
- stl的vector,map,list删除元素
- stl:vector erase 时的元素析构问题
- 关于vector中erase,删除元素的考量
- 关于STL容器中vector特定元素的删除问题
- 关于vector中使用erase删除元素后导致越界的问题
- C++/STL用erase删除元素(vector,deque),(list,set,map)
- STL中用erase()方法遍历删除元素注意的问题
- STL vector的之erase应用iterator
- STL vector的erase操作问题
- STL vector的erase操作问题
- STL vector的erase操作问题
- STL vector的erase操作问题
- STL 中vector的erase问题
- STL vector的erase操作问题
- 模拟屏和数字屏的区别
- 转:解决Maven中OutOfMemory错误
- 网络编程学习小结
- pku 3308 Paratroopers(带权二分图最小点覆盖)
- 做好十件事,便是聪明人。
- 关于STL的list,vector等用迭代器iterator,用erase删除元素出现的问题。
- jQuery-单选框取值
- 查看comment
- 软件公司的商业模式与招聘
- GDI+画可变大小的坐标轴
- Facebook的可扩展性体系结构
- jQuery-使用选择器注意事项
- 统一的UI编程:Silverlight (RIA) 和 WPF (Windows UI)
- 类模板与模板类