0

假设我有一个映射,其键是一对,并且其自定义比较器保证了该对的第一个元素的唯一性。

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 的插入方法来原生地做到这一点吗?

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

4

1 回答 1

1

价值你的问题的答案是你做不到。您提出的实施存在两个问题:

  1. 键必须保持不变,因为它们是地图的索引
  2. 独立于比较器对它正在比较的元素所做的事情,仍然会根据比较器的返回在std::map之前或之后插入项目left

该问题的解决方案如@MvG 所建议的那样。您的密钥不应该配对,应该配对的是您的值。

这具有额外的好处,您不需要自定义比较器。

问题是您将需要一个自定义插入器:

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

请注意,这仅在valueToInsert.first您使用的所有 s 都是正数时才有效,因为 an 的默认构造函数为int0。如果您有负数valueToInsert.first,则将插入默认构造的值对而不是您的元素。

于 2013-09-25T11:59:53.667 回答