鉴于
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)
{
// ...
}
什么方法可以应用一些重新索引?我必须删除旧条目并使用新密钥和旧值添加新条目吗?
答案 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[]
的类,以及其他访问器和增变器,并添加键值的当前偏移。