【问题标题】:Initializing set with comparator in C++在 C++ 中使用比较器初始化集合
【发布时间】:2015-11-03 11:55:20
【问题描述】:

我遇到了如下代码:

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

谢谢,
科斯蒂亚

【问题讨论】:

  • 翻转比较器中的符号?

标签: c++ set comparator


【解决方案1】:

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

在您的情况下,比较器的作用相反(如果 A“大于”B,则返回 true),这就是较大元素出现在较小元素前面的原因。

【讨论】:

    【解决方案2】:

    定义comp 时,您正在为您的集合定义order 函数。对于您的集合,如果满足其订购功能,则将订购两个元素。

    所以,作为std::set 一个有序容器,你会得到这样的结果,即inversed 存储其元素已排序,但顺序是降序,因为它是顺序由comp定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 2012-10-14
      • 2013-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-04
      相关资源
      最近更新 更多