在任一方向上迭代容器并擦除元素

Iterate over container in either direction AND erase elements

本文关键字:擦除 元素 迭代 任一 方向      更新时间:2023-10-16

我有两个标准::地图:

std::map<int,int> map1;
std::map<int,int> map2;

我需要向后迭代一个,另一个向前迭代(因为这是数据访问的模式(。在迭代时,我希望能够擦除元素继续迭代。

我想使用相同的方法。

我已经看到了使用模板的示例,展示了如何双向迭代,但没有演示擦除元素(这很重要,因为 erase(( 仅适用于前向迭代器(:

双向迭代容器

我见过reverse_iterator擦除的例子,但它们不是双向的:

如何使用 for 循环使用反向迭代器调用擦除

但我想双向迭代并擦除?

你可以为std::mapstd::setstd::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(并且您不应该使用它,因为您最好使用擦除删除习惯用语(。