C++注意事项-----------删除,添加等操作可能会使当前迭代器失效
2015-10-13 22:49
405 查看
erase ,pop_front,pop_back 函数会使指向被删除元素的所有迭代器失效
对于vector 容器来说,指向删除节点后面的元素的迭代器也会失效
对于deque容器,如果删除时不包含第一个或最后一个元素,那么该deque容器相关的所有迭代器都会失效
eg1. 实现函数,删除vector<int> 容器中的偶数元素
由于迭代器失效的原因,单纯的遍历一次整个容器不能达到目标, 每次发生erase操作后,都需要从头开始使用新的迭代器进行遍历,故考虑使用递归实现:
void deleteVectorOdd(vector<int> & ivec)
{
for(vector<int>::iterator i = ivec.begin() ; i!= ivec.end(); ++i)
{
if( (*i) %2 ==0)
{
ivec.erase(i);
deleteVectorOdd(ivec);
break;
}
}
}
eg2. 实现函数,删除list 容器中的奇数元素
与上面类似,也使用递归实现
void deleteListeven(list<int> & ilist)
{
for(list<int>::iterator i = ilist.begin() ; i!= ilist.end() ; ++i)
{
if( (*i) %2 !=0)
{
ilist.erase(i);
deleteListeven(ilist);
break;
}
}
}
对于vector 容器来说,指向删除节点后面的元素的迭代器也会失效
对于deque容器,如果删除时不包含第一个或最后一个元素,那么该deque容器相关的所有迭代器都会失效
eg1. 实现函数,删除vector<int> 容器中的偶数元素
由于迭代器失效的原因,单纯的遍历一次整个容器不能达到目标, 每次发生erase操作后,都需要从头开始使用新的迭代器进行遍历,故考虑使用递归实现:
void deleteVectorOdd(vector<int> & ivec)
{
for(vector<int>::iterator i = ivec.begin() ; i!= ivec.end(); ++i)
{
if( (*i) %2 ==0)
{
ivec.erase(i);
deleteVectorOdd(ivec);
break;
}
}
}
eg2. 实现函数,删除list 容器中的奇数元素
与上面类似,也使用递归实现
void deleteListeven(list<int> & ilist)
{
for(list<int>::iterator i = ilist.begin() ; i!= ilist.end() ; ++i)
{
if( (*i) %2 !=0)
{
ilist.erase(i);
deleteListeven(ilist);
break;
}
}
}
相关文章推荐
- ULBP(uniform LBP) c++代码
- POCO C++框架:Application
- C++中,将class转换成函数指针(运用运算符重载实现,即operator函数)
- Item 39:明智地使用private继承 Effective C++笔记
- 项目37.2 单位转换对照表
- 逃出迷宫完整算法C++
- C++中String类的实现
- sizeof和C++类的问题
- 【LeetCode从零单刷】Rotate Image
- More Effective C++ 条款33 将非尾端(non-leaf classes)设计为抽象类(abstract classes)
- poco c++框架:定时器
- c++ primer 笔记
- C++/Java__中类模板中的静态成员变量和静态成员函数
- c++类static成员
- BZOJ水题
- 【LeetCode从零单刷】Spiral Matrix II
- cin、cin.get()、cin.getline()、getline()
- 小小君的C语言第四课
- C++ string简介及常见用法
- c++关键字详解