用C ++中的比较器初始化set

时间:2015-11-03 11:55:21

标签: c++ set comparator

我遇到了以下代码:

#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”,即以反向顺序初始设置。谁能解释为什么?比较器如何影响集合的初始化?

谢谢,
克斯特亚

2 个答案:

答案 0 :(得分:5)

std::set使用比较器来确定元素的顺序。比较器的默认语义是“less”,这意味着如果在两个值(A,B)上运行比较器返回true,则A应该放在B之前。

在你的情况下,比较器做相反的操作(如果A比B更“大”则返回true,这就是为什么更大的元素出现在较小的元素前面。

答案 1 :(得分:3)

定义comp时,您要为集合定义订单功能。对于您的集合,如果将满足其订单功能,将订购两个元素。

因此,作为std::set 有序容器,您可以获得该结果,即inversed存储其元素已排序,但顺序为降序因为它是comp定义的顺序。