iterator的陷阱
来源:互联网 发布:为什么mac不安装flash 编辑:程序博客网 时间:2024/04/30 11:03
比如某个std::vector<x>,我们对它的一个实例对象进行遍历,找到一个元素,删除之:
std::vector<x> some_vector;
for(std::vector<x>::iterator it = some_vector.begin(); it != some_vector.end(); ++it)
{
if(...)
{
some_vector.erase(it); // 这里删除了vector的一个元素,导致it失效!!循环无法继续
}
}
想必这个错误我们都不会犯。请看下面“正确”的做法:
std::vector<x>::iterator it = some_vector.begin();
whiler(it != some_vector.end())
{
if(...)
{
std::vector<x>::iterator temp = it++; // 我们先把it保存到temp,然后移动it,使其指向下一个“有效”的元素
some_vector.erase(temp); // “放心”地删除这个元素
}
else
{
++it;
}
}
呵呵,it真的“有效”吗?真的可以“放心”删除吗?仔细想想。你会犯这个错误吗?反正我今天是犯了…… :(
一般地,对于vector这样“连续存储”(有没有想到上面的代码有什么错误?:))的容器,正确的做法是:
std::vector<x>::iterator it = some_vector.begin();
whiler(it != some_vector.end())
{
if(...)
{
some_vector.erase(it); // it失效了
it = some_vectorect.begin(); // 修正it,使其有效,然后重新开始遍历
}
else
{
++it;
}
}
类似地,在遍历过程中插入元素的情况也要仔细处理。
std::vector<x> some_vector;
for(std::vector<x>::iterator it = some_vector.begin(); it != some_vector.end(); ++it)
{
if(...)
{
some_vector.erase(it); // 这里删除了vector的一个元素,导致it失效!!循环无法继续
}
}
想必这个错误我们都不会犯。请看下面“正确”的做法:
std::vector<x>::iterator it = some_vector.begin();
whiler(it != some_vector.end())
{
if(...)
{
std::vector<x>::iterator temp = it++; // 我们先把it保存到temp,然后移动it,使其指向下一个“有效”的元素
some_vector.erase(temp); // “放心”地删除这个元素
}
else
{
++it;
}
}
呵呵,it真的“有效”吗?真的可以“放心”删除吗?仔细想想。你会犯这个错误吗?反正我今天是犯了…… :(
一般地,对于vector这样“连续存储”(有没有想到上面的代码有什么错误?:))的容器,正确的做法是:
std::vector<x>::iterator it = some_vector.begin();
whiler(it != some_vector.end())
{
if(...)
{
some_vector.erase(it); // it失效了
it = some_vectorect.begin(); // 修正it,使其有效,然后重新开始遍历
}
else
{
++it;
}
}
类似地,在遍历过程中插入元素的情况也要仔细处理。
- iterator的陷阱
- Iterator的用法陷阱
- reduce中Iterator<ritable>的循环陷阱
- 一种删除集合List数据元素的陷阱,论Iterator的重要性
- '\'的陷阱
- :?的陷阱
- const iterator ,iterator 和const_iterator的区别
- iterator、const_iterator和const iterator的区别
- const_iterator, iterator和const iterator的区别
- Delphi的接口陷阱
- TWebBrowser的Cache陷阱
- groovy 的陷阱
- 决策者的七大陷阱
- 公司政治的陷阱
- typedef的两个陷阱
- assert的陷阱
- 盖茨的陷阱
- EULA的陷阱
- 你养着工作还是工作养着你
- xml操作类
- winform跨线程调用控件
- 第二周实习记
- 马上博士要考了,驾校也要考了
- iterator的陷阱
- 游乐园的同心锁
- Java对象的强、软、弱和虚引用
- 标准库中的搜索算法
- typedef的四个用途和两个陷阱
- 关于robots.txt的书写
- 提高yahoo排名的搜索引擎优化技术
- Hibernate的缓存机制介绍
- Ioc模式