[英]Inserting std::set as keys to std::map
我使用std::set<std::uint32_t>
作为std::map
键。 我在cppreference上读到std::set
通过两个std::set
std::lexicographical_compare
实现比较操作 - 这实际上意味着什么?
另外,两个std::set
是否有可能插入相同的std::uint32_t
,但顺序不同,评估结果不相等?
这意味着它所说的 - 比较两个集合是按字典顺序进行的。
字典比较是具有以下属性的操作:
- 两个范围逐个元素地进行比较。
- 第一个不匹配元素定义哪个范围在字典上比另一个范围小或大。
- 如果一个范围是另一个范围的前缀,则较短的范围按字典顺序小于另一个范围。
- 如果两个范围具有相同的元素并且长度相同,则这两个范围在字典序上是相等的。
- 空范围按字典顺序小于任何非空范围。
- 两个空范围在字典上是相等的。
简而言之,它基本上意味着从左到右 ( ref ) 的直观逐个元素比较。
至于你的第二个问题,无论你插入元素的顺序如何, set<int>
的内容都是按数字递增的顺序排列的,所以不是。
我在 cppreference 上读到
std::set
通过两个std::set
std::lexicographical_compare
实现比较操作 - 这实际上意味着什么?
这意味着std::set
的比较运算符以操作数的元素范围为参数调用std::lexicographical_compare
,并返回结果。 std::lexicographical_compare
比较操作数范围的字典顺序。 这与用于对字典中的单词进行排序的顺序相同。
另外,两个
std::set
是否有可能插入相同的std::uint32_t
s,但顺序不同......
std::set
是有序的。 所有具有相同比较函数的集合具有相同的顺序。 比较少的元素在比较高的元素之前。 因此,如果两个元素和比较函数相同,则集合在字典比较中比较相等。
如果比较函数是无状态的,那么它的所有实例都会产生相同的顺序。 理论上,有状态的比较函数可以为不同的集合产生不同的顺序。 我建议避免这种违反直觉的比较函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.