【问题标题】:Does a multimap with the key and the value being of the same type make any sense?具有相同类型的键和值的多映射是否有意义?
【发布时间】:2013-10-10 04:25:48
【问题描述】:

如果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;

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

已编辑:

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

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

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

【问题讨论】:

  • 也许你想要一个 std::multiset 代替?像 std::multimap 但只有键,没有值。
  • 不用过多批评,是的,这是有道理的,一个是您的关键,另一个是您的价值。你不应该因为类型而挂断电话。

标签: c++ stl multimap


【解决方案1】:

这是有道理的。

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

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

【讨论】:

  • 我的餐厅示例确实有意义,但实际上在我的情况下,我正在从一个对象映射到完全相同的对象。因此,我认为我应该像@john 提到的那样使用 multiset。
【解决方案2】:

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

标准不介意multimap 的值重复:

23.3.2 类模板多图

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

multimap 类支持双向迭代器。

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

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

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

【讨论】:

    猜你喜欢
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多