如果密钥及其值是同一类型,std::multimap
是否有意义?
真正的代码要复杂得多,但是例如,我有一个类Point
,我想找到这种类型的类似对象:
bool
ComparePoints::operator()(Point* const p1, Point* const p2) const {
if (p1->x > p2->x) return false;
if (p1->x < p2->x) return true;
...
return false;
}
为此,我可以使用带有比较功能的std::multimap
,然后使用MultiMap :: equal_range获取一组对象。
std::multimap<Point*, Point*, ComparePoints> pointsMap;
这对我来说很好,但我觉得价值领域变得多余了。我是否需要寻求更好的解决方案?
编辑:
我正在从一个对象映射到完全相同的对象
pointsMap.insert(std::pair<Point*, Point*>(p, p));
使值多余,所以我可能应该使用std :: multiset代替@john提及。
答案 0 :(得分:1)
如果在您的计划中有意义,那么它确实有意义。
如果您的multimap
有重复值,则标准不介意:
1 / multimap是一种支持的关联容器 等效键(可能包含相同键的多个副本) 值)并提供快速检索另一种类型T的值 基于键。
multimap类支持双向迭代器。
所以问题不在于从语言的角度来看这是否合理 - 问题是你在尝试做的事情上是否有意义?
如果您想要计算与单个键相关联的特定值的项目数,我可以看到这是有意义的。也许每个值可能比较平等但仍然具有不同的属性(例如:学生名单,其中基于名称确定相等。愚蠢,也许,但可能。)
在我看来,具有重复值的地图与哈希映射之间至少存在一些相似性。还有一些明显的差异,其中最少的是域适用性,但足够的相似性让我想到如果你考虑让multimap
具有重复值,你可能实际上需要一个哈希映射(unordered_map
在C ++ 11)。
答案 1 :(得分:1)
这是有道理的。
例如,我想交叉引用我所拥有的餐馆附近某个城市的所有餐馆。此数据结构中的数据类型将相同,但是,实体的分组在我的业务逻辑和标准中非常重要。
当您使用哈希数据类型时,您实际上是通过公共密钥对对象进行分组。密钥是否是相同类型无关紧要。要说,“我想通过这一个参考点对所有点进行分组”,这是对该数据类型的合法使用。