从地图上擦除元素,然后将其放回原处
Erase an element from a map then put it back
假设我有一个回溯算法,我需要从地图上删除元素,做某事,然后将其放回原处。我不确定是否有一个好方法:
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忽略"怎么样,然后跳过该对的函数?如果破坏其他代码或超载函数,则可以在声明中给它一个默认值。
相关文章:
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 在C++中将矢量转换为嵌套地图
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- boost::asio如何生成多个协同程序,然后加入它们
- 如何将图像传输到c++(dll)中的缓冲区,然后在c#的缓冲区中读/写
- 在std::thread中,joinable()然后join()线程安全吗
- C++:如何读取分离变量,然后读取向量
- 替换基于地图的所有引用
- 如何区分地图中的 0 和 false?
- 地图计数确实很重要,或者只是检查是否存在
- 如何从地图中删除矢量对象
- 为什么我的递归函数按降序打印,然后按升序打印?
- 是否有任何C++功能可以对地图进行排序?
- 等待整个 omp 块完成,然后再调用第二个函数
- CMake:如何将库 A 链接到库 B,然后将可执行文件链接到库 A
- 从地图上擦除元素,然后将其放回原处
- 如何在给定任意数量的整数的情况下创建一个唯一键?并使用该键存储,然后从地图中查找