假设我有一张地图,其键是一对,其自定义比较器可以保证对该对的第一个元素的单一性。
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)对。
答案 0 :(得分:0)
价值你问题的答案是你不能这样做。 您提出的实施有两个问题:
std::map
仍然会根据比较器的返回在left
之前或之后插入项目问题的解决方案是@MvG建议的。您的密钥不应该配对,这是您应该配对的价值。
这样做的另一个好处是您不需要自定义比较器。
问题是你需要一个自定义插件:
std::pair< int, foo >& tempValue = _myMap[ keyToInsert ];
if( valueToInsert.first >= tempValue.first )
{
tempValue = valueToInsert;
}
请注意,只有当您使用的所有valueToInsert.first
都为正时才会有效,导致int
的默认构造函数为0.如果您有valueToInsert.first
个否定的默认值将插入构造值对而不是您的元素。