关于设置容器
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)
来检查两个项目是否具有相同的值。如果将 a
和 b
替换为相应的值,您将得到:!(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不满足这个;所以容器以某种未定义的方式运行。
认为这相当于坐在沙发上。它不是为此而设计的。它可能会产生一些看起来不错的结果,但不要指望它会继续这样工作。
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)
来检查两个项目是否具有相同的值。如果将 a
和 b
替换为相应的值,您将得到:!(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不满足这个;所以容器以某种未定义的方式运行。
认为这相当于坐在沙发上。它不是为此而设计的。它可能会产生一些看起来不错的结果,但不要指望它会继续这样工作。