从地图上擦除元素,然后将其放回原处

Erase an element from a map then put it back

本文关键字:然后 地图 擦除 元素      更新时间:2023-10-16

假设我有一个回溯算法,我需要从地图上删除元素,做某事,然后将其放回原处。我不确定是否有一个好方法:

func(std::<K, V> map &dict) {
    for (auto i : dict) {
       remove i from dict;
       func(dict);
       put i back to dict;
    }
}

我知道有一些方法可以从此处的地图中删除元素,但是我不确定是否有实现我上面描述的方法。我知道我可以为循环创建一个新的命令并将其传递到弹药中,但我想知道它是否可以使用相同的dict进行。

您问的绝对可能是可能的。这是尝试保持简单有效的一种方法:

void func(std::map<K, V> &dict) {
    for (auto i = dict.cbegin(); i != dict.cend(); ) {
       auto old = *i;
       i = dict.erase(i);   // i now points to the next element (or dict.end())
       some_other_func(dict);
       dict.insert(i, old); // i is used a hint where to re-insert the old value
    }
}

通过用迭代仪参数调用std::map::erase和带有提示的std::map::insert,通过此循环的每个迭代的复杂性是摊销常数。请注意,我以为您在第5行中对func的呼叫实际上应该是some_other_func,因为递归调用func会使您仔细地设置在第4行中的迭代器无效。

但是,这不是执行此类处理的最有效方法(@rakurai有一个建议(。

这个问题在这里有一个答案。

但是,您的问题可能是您希望该函数在处理dict时忽略键K。第二个参数" k忽略"怎么样,然后跳过该对的函数?如果破坏其他代码或超载函数,则可以在声明中给它一个默认值。