std :: map在插入时的某些情况下覆盖元素

时间:2013-09-12 09:38:08

标签: c++ map stl duplicates comparator

假设我有一张地图,其键是一对,其自定义比较器可以保证对该对的第一个元素的单一性。

class comparator 
{
    public:
        bool operator()(const std::pair<std::string, std::int>& left,
                        const std::pair<std::string, std::int>& right) 
        { 
            return left.first < right.first;
        }
};

std::map<std::pair<std::string, std::int>, foo, comparator>;

如果可能的话,现在我希望这张地图比这更智能 如果具有与该对的第一个元素相同的字符串的键已经存在,则不会在插入时被拒绝,如果该对的整数(.second)“可能将是”,则我将覆盖“已存在的元素”。插入元素“更大。

当然,我可以通过查看地图中的密钥,获取密钥详细信息并在必要时覆盖它来完成此操作。 或者,我可以采用一种带有多图的插入后方法,我会迭代清理重复项,只保留带有最大对整数的密钥。

问题是:我可以通过覆盖部分stl实现([]运算符 - 插入方法)或改进我的自定义比较器然后简单地依赖map的insert方法来原生吗?

我不知道这是否被接受但是我们可以想象有一个非const comprator,它能够在某些情况下更新已经存储的(key,value)对。

1 个答案:

答案 0 :(得分:0)

价值你问题的答案是你不能这样做。 您提出的实施有两个问题:

  1. 键必须保持const,因为它们是地图的索引
  2. 独立于比较器对比较的元素,std::map仍然会根据比较器的返回在left之前或之后插入项目
  3. 问题的解决方案是@MvG建议的。您的密钥不应该配对,这是您应该配对的价值。

    这样做的另一个好处是您不需要自定义比较器。

    问题是你需要一个自定义插件:

    std::pair< int, foo >& tempValue = _myMap[ keyToInsert ];
    if( valueToInsert.first >= tempValue.first )
    {
        tempValue = valueToInsert;
    }
    

    请注意,只有当您使用的所有valueToInsert.first都为正时才会有效,导致int的默认构造函数为0.如果您有valueToInsert.first个否定的默认值将插入构造值对而不是您的元素。