如何修改std :: map容器中的键值

时间:2010-10-07 18:13:51

标签: c++ stdmap

鉴于

std::map<int,std::string> myMap;
fillMyMapWithStuff(myMap);

// modify key values - I need to add a constant value to each key
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi)
{
    // ...
}

什么方法可以应用一些重新索引?我必须删除旧条目并使用新密钥和旧值添加新条目吗?

5 个答案:

答案 0 :(得分:8)

看起来你最好建立一张新地图并在之后交换它。您将只有n次插入操作,而不是n次删除和n次插入。

答案 1 :(得分:5)

是的,您必须删除旧条目并使用新密钥添加新条目。密钥不可修改。

如果您只修改一个或几个元素,则可以通过使用新元素的位置提示map::insert来有效地执行此操作。由于您的新密钥肯定位于之后旧密钥的某处,因此您可以使用指向旧元素的迭代器进行提示。但是,您必须注意不要重新评估新插入的键(例如,通过迭代从头到尾),并且在修改整个地图的情况下,建立一个新地图会更有效。

答案 2 :(得分:3)

是的,你必须。当它在地图中时,键是const。

答案 3 :(得分:2)

我认为你必须构建一张新地图。如果在循环中删除并添加新键,则可能会破坏迭代旧键集的完整性,而不会触及刚刚插入的键。 (除非你知道如何分配密钥并将自己的逻辑放在那里。)

std::map<int,std::string> myMap;
fillMyMapWithStuff(myMap);

std::map<int,std::string> newMap;

// modify key values - I need to add a constant value to each key
for (std::map<int,std::string>::iterator mi=myMap.begin(); mi != myMap.end(); ++mi)
{
    newMap[mi->first] = mi->second;
}

答案 4 :(得分:2)

还有一个选择。如果此操作是集合的重要功能,并且性能很重要,则可以避免完全复制地图。您可以创建一个重载operator[]的类,以及其他访问器和增变器,并添加键值的当前偏移。