关于设置容器
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
函数时,标准集容器的行为就像一个多集容器。这正常吗?如果是,多集和集有什么区别?
不这正常吗?
,这是不正常的。您不能将std::less_equal
指定为 std::set 的比较器,因为它不满足严格的弱排序规则。
请参阅此处的要求。
当您使用std::less_equal<int>
时,您可以使用<=
对容器进行排序。当您插入第二个99
集合将运行其内部数据结构,寻找插入99
的位置。它必须检查是否存在相同的值。关联容器的"相同"定义是等效的。等效性意味着容器使用!(a <= b) && !(b <= a)
来检查两个项目是否具有相同的值。如果将a
和b
替换为相应的值,您将获得:!(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 不符合这一点; 因此,容器的行为方式未定义。
考虑这相当于坐在沙发上抬腿。它不是为了做到这一点而设计的。它可能有一些看起来不错的结果,但不要指望它继续以这种方式工作。
相关文章:
- 直接显示 - 无法使用设置模式设置静止引脚
- 从文件读取到映射中,该映射将键作为整数,并将相应的值设置为设置
- 在Visual Studio Code(.json配置)中设置相对于工作区路径的c / c ++项目的包含路径
- 如何使用 libusb 为 USB 设备设置备用设置
- 是否有相当于设置的Linux功能
- 我如何调用我的3个数据成员中每个人的设置方法,然后显示由我的设置方法设置的值
- C++为任何区域设置区域设置
- 通过CMAKE在Visual Studio中设置优化设置
- 自定义订单设置为设置而不更改订单
- 设置精度应用于旧的 C 样式代码
- 我如何将文件夹设置为XCode中的全局,类似于Visual Studio
- 适用于具有常见属性但值不同的派生类的设计设置
- Mac OS X 中的设置区域设置不起作用
- 在 OS X 上设置区域设置崩溃
- Eclipse Mars - 为C++项目设置默认设置(默认情况下设置 c++11)
- 为所有openvdb::Grid节点设置/取消设置活动状态
- C++在整个程序中设置区域设置
- 设置与设置函数参数同名的私有数据成员
- 使用 VS 解决方案,如何使用匹配设置和需要特殊处理的文件的特定设置来设置一组源文件
- 如何使用 iomanip 的设置、设置填充和左/右?设置填充不会停止其输出