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

dyp*_*dyp 12 c++ stl std c++11

无序关联容器unordered_set,unordered_map等没有一个小于运算符operator<,既不是成员函数也不是一个免费的功能.为什么?less两者都没有专业化.SGI STL的hash_*类型也缺乏此功能.

如果我们排除底层类型的概念,所有容器类型都满足常规类型的要求,例如Stepanov&McJones 的编程元素.唯一的例外是缺乏的无序关联类型operator<.


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

How*_*ant 27

从概念上讲,它没有多大意义.考虑一袋不同颜色的大理石.让我们说你有两袋大理石:

  1. 包含红色,蓝色,绿色.
  2. 包含紫色,红色,黄色.

袋1 <袋2?

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

red < yellow < purple < blue < green
Run Code Online (Sandbox Code Playgroud)

仍然很难说一个袋子是否小于另一个袋子,因为袋子里面没有任何订单与大理石相关联.也就是说,包1可以以6种格式中的任何一种输出,这些格式都是等价的:

  1. 红色,蓝色,绿色
  2. 红色,绿色,蓝色
  3. 蓝色,红色,绿色
  4. 蓝色,绿色,红色
  5. 绿色,红色,蓝色
  6. 绿色,蓝色,红色

以上六种都不比其他任何一种都少.实际上,无论是红色还是蓝色<红色,它们都是平等的.一个包不是一个序列......它是一个无序的序列.

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

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

  • 不,委员会从未说过所有类型都应该有默认的总排序.这段历史可以追溯到C++ 98(第一个C++标准).`std :: complex`没有总排序. (3认同)