具有键和值的相同类型的多图是否有意义?

时间:2013-10-03 12:53:39

标签: c++ stl multimap

如果密钥及其值是同一类型,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提及。

2 个答案:

答案 0 :(得分:1)

如果在您的计划中有意义,那么它确实有意义。

如果您的multimap有重复值,则标准不介意:

23.3.2类模板多图

  

1 / multimap是一种支持的关联容器   等效键(可能包含相同键的多个副本)   值)并提供快速检索另一种类型T的值   基于键。

     

multimap类支持双向迭代器。

所以问题不在于从语言的角度来看这是否合理 - 问题是你在尝试做的事情上是否有意义?

如果您想要计算与单个键相关联的特定值的项目数,我可以看到这是有意义的。也许每个值可能比较平等但仍然具有不同的属性(例如:学生名单,其中基于名称确定相等。愚蠢,也许,但可能。)

在我看来,具有重复值的地图与哈希映射之间至少存在一些相似性。还有一些明显的差异,其中最少的是域适用性,但足够的相似性让我想到如果你考虑让multimap具有重复值,你可能实际上需要一个哈希映射(unordered_map在C ++ 11)。

答案 1 :(得分:1)

这是有道理的。

例如,我想交叉引用我所拥有的餐馆附近某个城市的所有餐馆。此数据结构中的数据类型将相同,但是,实体的分组在我的业务逻辑和标准中非常重要。

当您使用哈希数据类型时,您实际上是通过公共密钥对对象进行分组。密钥是否是相同类型无关紧要。要说,“我想通过这一个参考点对所有点进行分组”,这是对该数据类型的合法使用。