7

给定

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)
{
    // ...
}

什么是应用重新索引的好方法?我必须删除旧条目并使用新键和旧值添加一个新条目吗?

4

5 回答 5

8

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

于 2010-10-07T18:23:35.853 回答
5

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

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

于 2010-10-07T18:21:15.697 回答
3

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

于 2010-10-07T18:20:30.497 回答
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;
}
于 2010-10-07T18:26:38.320 回答
2

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

于 2010-10-07T18:34:44.557 回答