在任一方向上迭代容器并擦除元素
Iterate over container in either direction AND erase elements
我有两个标准::地图:
std::map<int,int> map1;
std::map<int,int> map2;
我需要向后迭代一个,另一个向前迭代(因为这是数据访问的模式(。在迭代时,我希望能够擦除元素继续迭代。
我想使用相同的方法。
我已经看到了使用模板的示例,展示了如何双向迭代,但没有演示擦除元素(这很重要,因为 erase(( 仅适用于前向迭代器(:
双向迭代容器
我见过reverse_iterator擦除的例子,但它们不是双向的:
如何使用 for 循环使用反向迭代器调用擦除
但我想双向迭代并擦除?
你可以为std::map
、std::set
或std::list
编写一个函数:
template<typename Cont, typename Pred>
void bidir_remove_if( Cont &c, Pred p, bool forward )
{
auto b = c.begin();
auto e = c.end();
while( b != e ) {
auto it = forward ? b++ : --e;
if( p(*it) ) {
auto end = b == e;
( forward ? it : e ) = c.erase( it );
if( end ) break;
}
}
}
现场示例
注意 - 由于迭代器失效,您不能将此功能用于std::vector
(并且您不应该使用它,因为您最好使用擦除删除习惯用语(。
相关文章:
- 调用 erase() 函数是否也会在擦除元素之前更改迭代器值?
- 为什么在功能内擦除元素后不列出更新?
- 在任一方向上迭代容器并擦除元素
- 从向量和对向量中擦除元素的差异
- 从地图上擦除元素,然后将其放回原处
- 迭代一组和擦除元素
- 使用常量键从集合中擦除元素
- 从向量中擦除元素是否也会擦除元素中存在的所有成员向量
- 如何更有效地从向量或集合中擦除元素?
- 在尝试擦除元素之前,我们是否需要检查unordered_set是否包含元素
- 从矢量中最快的擦除元素或更好地利用内存(排序基数)
- 迭代地图和擦除元素
- 迭代时从 STL 容器中查找并擦除元素
- 在 c++ 中从列表中擦除元素时出现问题
- C++嵌套的带有擦除元素的循环
- 矢量2D擦除元素并保持字段为空
- 比较第一个向量的不同矢量迭代器和擦除元素
- 从多维矢量中擦除元素
- 根据属性值在结构向量中擦除元素
- 从hash_map内的列表中擦除元素