关于设置容器

About set container

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 有什么区别?

Is this normal?

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

查看要求here

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

集合、映射、多重集合、多重映射等。要求您提供总排序功能。总订单意味着对于任何两个项目,

  • A op B returns true 和 B op A returns false - A 更少。
  • A op B returns false 和 B op A returns true - B 更少。
  • A op B returns false 和 B op A returns false - 它们相等。

可能没有任何值 returns 对两种变体都是正确的。 std::less_equal不满足这个;所以容器以某种未定义的方式运行。

认为这相当于坐在沙发上。它不是为此而设计的。它可能会产生一些看起来不错的结果,但不要指望它会继续这样工作。