关于设置容器

About set container

本文关键字:设置 于设置      更新时间:2023-10-16
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函数时,标准集容器的行为就像一个多集容器。这正常吗?如果是,多集和集有什么区别?

这正常吗?

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

请参阅此处的要求。

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

Set,

map, multiset, multimap et al. 要求您提供总排序函数。总订单意味着对于任何两个项目,要么

    A op B
  • 返回 true,B op A 返回 false - A 更少。
  • A op B
  • 返回 false,B op A 返回 true - B 更少。
  • 操作 B 返回 false,B 操作 A 返回 false - 它们是相等的。

对于两个变体,可能没有任何值返回 true。 std::less_equal 不符合这一点; 因此,容器的行为方式未定义。

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