1

std::multimap如果键和它的值是相同的类型,a有什么意义吗?

真正的代码要复杂得多,但例如,我有一个类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::multimapwith 比较函数,然后使用 MultiMap::equal_range 获取一组对象。

std::multimap<Point*, Point*, ComparePoints> pointsMap;

这对我来说很好,但我觉得值字段变得多余了。我需要寻求更好的解决方案吗?

编辑:

我正在从一个对象映射到完全相同的对象

pointsMap.insert(std::pair<Point*, Point*>(p, p));

使值变得多余,所以我可能应该使用 std::multiset 来代替@john 提到的。

4

2 回答 2

1

如果它在你的程序中有意义的话,当然是有意义的。

标准不介意您是否有multimap重复值:

23.3.2 类模板多图

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

multimap 类支持双向迭代器。

所以问题不在于从语言的角度来看这是否有意义——问题在于它是否对你想要做的事情有意义?

如果您想要计算与单个键关联的特定值的项目数,我可以在我的脑海中看到这是有道理的。也许每个值可能比较相等并且仍然具有不同的属性(例如:根据名称确定相等性的学生名册。也许很愚蠢,但可能。)

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

于 2013-10-03T13:29:50.227 回答
1

这是有道理的。

例如,我想交叉引用某个城市中与我拥有的餐厅有一定距离的所有餐厅。此数据结构中的数据类型将是相同的,但是,实体的分组在我的业务逻辑和标准中很重要。

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

于 2013-10-03T13:30:21.540 回答