为什么无序的关联容器没有实现小于运算符?

时间:2015-05-18 00:32:35

标签: c++ c++11 stl std

无序关联容器unordered_setunordered_map等没有小于运算符operator<,既不是成员函数也不是自由函数。为什么? less也没有专业化。 SGI STL的hash_*类型也缺少此功能。

如果我们排除基础类型的概念,则所有容器类型都满足定义的常规类型的要求,例如:在Stepanov&amp; McJones的编程元素。唯一的例外是无序的关联类型,它们缺少operator<

我无法想出一个与给定的相等定义一致的运算符的有效实现,所以效率可能是什么原因?另一方面,对于无序关联容器,operator==在某些情况下需要重新散列一个容器的每个元素并在另一个容器中查找 - O(N)平均值,但最差情况为O(N²)。

1 个答案:

答案 0 :(得分:27)

从概念上讲,它并没有多大意义。考虑一袋不同颜色的大理石。可以说你有两袋大理石:

  1. 包含红色,蓝色,绿色。
  2. 包含紫色,红色,黄色。
  3. 包1&lt;袋2?

    即使您将订单与颜色相关联,也请说:

    red < yellow < purple < blue < green
    

    仍然很难说一个包是否小于另一个包,因为内部的包与弹珠无关。也就是说,包1可以以6种格式中的任何一种输出,这些格式都是等价的:

    1. 红色,蓝色,绿色
    2. 红色,绿色,蓝色
    3. 蓝色,红色,绿色
    4. 蓝色,绿色,红色
    5. 绿色,红色,蓝色
    6. 绿色,蓝色,红色
    7. 上述六个中没有一个比其他任何一个都少。实际上,无论是否为红色,它们都是平等的。蓝色或蓝色&lt;红色。包不是序列......它是无序序列。

      历史上,无序容器也没有相等的运算符。然而,询问一个袋子是否包含与另一个袋子相同的彩色大理石是有意义的。这里的问题是效率问题。最终提出了算法和提议,以动摇委员会为无序容器添加相等比较:

      http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3068.pdf