【问题标题】:How to modify key values in std::map container如何修改 std::map 容器中的键值
【发布时间】:2010-10-07 18:13:50
【问题描述】:

给定

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

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

【问题讨论】:

    标签: c++ stdmap


    【解决方案1】:

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

    【讨论】:

    • +1,在这种情况下,当整个地图重建时,甚至比带有提示的擦除+插入要好。
    • 公平地说,它的n次插入操作+1次交换操作。
    • @Justin:但是交换应该花费毫无意义的时间。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        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;
        }
        

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-05-08
            • 2016-09-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-19
            • 2011-10-28
            相关资源
            最近更新 更多