C++ 如何使用extract和insert更改std::map中的一些键

C++ 如何使用extract和insert更改std::map中的一些键,c++,c++17,C++,C++17,我最近阅读了关于节点类型的问题,我了解到如果我需要修改映射中特定节点的键,我可以提取节点,修改键并插入映射中的节点(如中) 现在,假设我需要更改这个映射的多个节点的键,为了知道需要修改哪些节点,我必须迭代这些值。我想我不应该在迭代时将节点插入地图(但可能我错了,请看问题的结尾),所以我想我可以在第一次迭代地图,提取需要修改的节点,将它们存储在向量中,然后在第二次插入节点,当我完成迭代贴图和修改节点时 我想我可以通过将密钥存储在向量中而不是节点中来实现这一点,但因为关键是要更改密钥,所以我认为使用

我最近阅读了关于节点类型的问题,我了解到如果我需要修改映射中特定节点的键,我可以
提取
节点,修改键并
插入
映射中的节点(如中)

现在,假设我需要更改这个映射的多个节点的键,为了知道需要修改哪些节点,我必须迭代这些值。我想我不应该在迭代时将节点插入地图(但可能我错了,请看问题的结尾),所以我想我可以在第一次迭代地图,提取需要修改的节点,将它们存储在向量中,然后在第二次插入节点,当我完成迭代贴图和修改节点时

我想我可以通过将密钥存储在向量中而不是节点中来实现这一点,但因为关键是要更改密钥,所以我认为使用节点可能会很方便,因为节点似乎是为此目的而设计的

所以,基本上,到目前为止,我得到的是:


std::vector向量类型很容易寻址,因为
std:map
专门化公开了类型别名

std::vector<std::map<K,V>::node_type> tmp;

可以在迭代时插入(因为它不会使迭代器无效)。但是,如果迭代顺序很重要(即使只是为了可调试性),我认为您使用的辅助向量是合适的。

StoryTeller的答案是正确的,但是如果您不必知道如何拼写整个类型,那就太好了。有几种方法可以简化
tmp
的声明。第一种方法是通过使用以下方法避免重复类型的
myMap


正如您所看到的,不幸的是,输入时间要长一点,但是除了如何在
for
-循环中实际使用它之外,您不必使用任何有关
myMap
的知识。

我想您可以始终使用node_type=decltype(myMap.extract(myMap.begin())来获取节点类型。另一个选项是代替矢量将它们放在另一个贴图中,然后使用合并函数将它们放回。
for (auto it = myMap.begin() ; it != myMap.end();) {
    if(it->second->needsToBeModified()){
      auto out = it++;
      tmp.push_back(myMap.extract(out));
    }
    else
      ++it;
}
std::vector<decltype(myMap)::node_type> tmp;
std::vector<decltype(myMap.extract(myMap.begin()->first))> tmp;