关于集装箱

时间:2017-01-20 09:37:15

标签: c++ stl set containers multiset

std::set<int, std::less_equal<int>> myset = {1,1,7,8,2,2};
myset.insert(99);
myset.insert(99);
for(const int & val : myset)
    std::cout << val << " ";

输出:

1 1 2 2 7 8 99 99 

您好,我正在研究容器。我意识到当我使用less_equal函数时,标准集容器就像多集合容器一样。这是正常的吗?如果是,multiset和set之间有什么区别?

3 个答案:

答案 0 :(得分:4)

  

这是正常的吗?

不,这不正常。您不能将std::less_equal指定为std::set的比较器,因为它不符合严格的弱排序规则。

查看要求here

答案 1 :(得分:3)

使用std::less_equal<int>时,您使用<=对容器进行排序。当您插入第二个99时,该集将运行其内部数据结构,以查找要插入99的位置。它必须检查是否存在相同的值。 &#34;相同&#34;的定义对于关联容器是等价的。等价意味着容器使用!(a <= b) && !(b <= a)来检查两个项是否具有相同的值。如果您将ab替换为相应的值,您将获得:!(99 <= 99) && !(99 <= 99) => !(true) && !(true) => false && false => false。因此,您无法将less_equal用于关联容器。

答案 2 :(得分:2)

Set,map,multiset,multimap等。要求您提供总订购功能。总订单意味着任何两个项目

  • 操作B返回true,B操作A返回false - A小于。
  • 操作B返回false,B操作A返回true - B小于。
  • 操作B返回false而B操作A返回false - 它们相等。

对于两个变体,可能没有任何值返回true。 std :: less_equal不符合这个要求;所以容器的行为方式有些不确定。

考虑这相当于坐在你的沙发腿上。它的设计并不是为了做到这一点。它可能会有一些看起来不错的结果,但不要指望它继续以这种方式工作。