我遇到了以下代码:
#include <iostream>
#include <set>
int main() {
auto comp = [](int x, int y){return (x > y); };
std::set<int, decltype(comp)> inversed({1,2,3,4,5}, comp);
for ( auto i = inversed.begin(); i != inversed.end(); ++i ) {
std::cout << *i << std::endl;
}
return 0;
}
代码打印“5 4 3 2 1”,即以反向顺序初始设置。谁能解释为什么?比较器如何影响集合的初始化?
谢谢,
克斯特亚
答案 0 :(得分:5)
std::set
使用比较器来确定元素的顺序。比较器的默认语义是“less”,这意味着如果在两个值(A,B)上运行比较器返回true
,则A应该放在B之前。
在你的情况下,比较器做相反的操作(如果A比B更“大”则返回true
,这就是为什么更大的元素出现在较小的元素前面。
答案 1 :(得分:3)
定义comp
时,您要为集合定义订单功能。对于您的集合,如果将满足其订单功能,将订购两个元素。
因此,作为std::set
有序容器,您可以获得该结果,即inversed
存储其元素已排序,但顺序为降序因为它是comp
定义的顺序。