C++ 将std::set as键插入std::map

C++ 将std::set as键插入std::map,c++,C++,我正在使用std::set作为std::map的键。我已经读到,std::set通过两个std::set的std::lexicographic\u Compare实现比较操作-这实际上意味着什么 另外,两个插入了相同但顺序不同的std::uint32\u ts的std::set是否有可能计算不相等?这意味着它所说的-比较两个集合是按字典顺序进行的 如果您只需单击以下链接,则会看到完全相同的站点: 词典比较是具有以下属性的操作: 两个范围逐元素进行比较 第一个不匹配元素定义哪个范围在词典上小于或

我正在使用
std::set
作为
std::map
的键。我已经读到,
std::set
通过两个
std::set
std::lexicographic\u Compare
实现比较操作-这实际上意味着什么


另外,两个插入了相同但顺序不同的
std::uint32\u t
s的
std::set
是否有可能计算不相等?

这意味着它所说的-比较两个集合是按字典顺序进行的

如果您只需单击以下链接,则会看到完全相同的站点:

词典比较是具有以下属性的操作:

  • 两个范围逐元素进行比较
  • 第一个不匹配元素定义哪个范围在词典上小于或大于另一个范围
  • 如果一个范围是另一个范围的前缀,则较短的范围在词典编纂上小于另一个范围
  • 如果两个范围具有相等的元素且长度相同,则两个范围在词典编纂上是相等的
  • 空范围在词典编纂上小于任何非空范围
  • 两个空范围在词典编纂上相等
简单来说,它基本上意味着从左到右进行直观的逐元素比较()

至于你的第二个问题,
集合
的内容是以递增的数字顺序排列的,不管你插入元素的顺序是什么,所以没有

我在参考资料中读到,
std::set
通过两个
std::set
std::lexicographical\u Compare
实现比较操作-这实际上意味着什么

这意味着
std::set
的比较运算符调用
std::lexicographical\u compare
,将操作数的元素范围作为参数,并返回结果
std::lexicographical_compare
比较操作数范围的字典顺序。这与词典中单词的顺序相同

另外,两个
std::set
是否可以插入相同的
std::uint32\u t
s,但顺序不同

std::set
已订购。具有相同比较函数的所有集合具有相同的顺序。比较少的元素在比较高的元素之前。因此,如果两个元素和比较函数都是相同的,那么在词典比较中,这些集合将进行相等的比较


如果比较函数是无状态的,那么它的所有实例都产生相同的顺序。理论上,有状态比较函数可以为不同的集合生成不同的顺序。我建议避免使用这种违反直觉的比较功能。

您是否按照链接查看了它的功能?另外,
std::set
是一个有序的容器。插入顺序!=存储顺序是的,我考虑的是实现集合的底层二叉搜索树,以及相同元素的不同插入顺序生成不同的树。然而,这样的树具有相同的排序/词典顺序,因此比较很好。我认为cppreference是指与
std::set
(默认
std::less
)的
Compare
模板参数的交互。同样,这使您的“以递增的数字顺序”成为默认值,但您可以使其以相反的顺序存储。@FireLancer是的,如果您愿意,您可以覆盖比较器。@FireLancer什么的区别/效果?什么是“它”?对不起,我不知道你在问什么。请随便问一个新问题。关于OP链接的内容,我想他们是出于某种原因写的。“按字典顺序比较lhs和rhs的内容。比较是由一个相当于
std::lexicographical\u compare
的函数执行的。此比较忽略容器的排序比较。”@FireLancer Ah,有趣,因此,是的,排序总是按字典顺序进行的,而在每个容器中维护顺序的
Compare
只是被忽略了。除了它所说的之外,没有其他的“效果”