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;