【问题标题】:How can I use a comparison function with more than 2 arguments with a c++ priority queue?如何将具有超过 2 个参数的比较函数与 C++ 优先级队列一起使用?
【发布时间】:2011-03-07 01:53:00
【问题描述】:

我有一个存储数据库记录的对象类。还有一个比较类可以接收其中两个记录和一个描述如何进行排序的附加对象。我需要将这两个类与优先级队列一起使用来合并记录。据我所知,我只能给出一个比较函数,它需要 2 个参数给 priority_queue。将此 3 参数比较器与优先级队列一起使用的最佳方法是什么?

    priority_queue <Record, vector<Record>, Comparison(RecordA, RecordB, SortOrderObject)> pq;

【问题讨论】:

    标签: c++ priority-queue


    【解决方案1】:

    使用boost::bindstd::bind 或手动创建一个包含额外信息的函数对象,然后将该对象传递到优先级队列中。这是一个手动版本:

    class my_compare {
      SortOrder so;
      public:
      my_compare(const SortOrder& so): so(so) {}
      bool operator()(const Record& a, const Record& b) const {
        return comparison(a, b, so);
      }
    };
    

    然后将my_compare作为模板参数传递给priority_queue,并将my_compare(sort_order)作为队列构造函数中的比较器传递。

    【讨论】:

    • 这个问题是关于一个函数的,但我总是发现代码更有趣,如果比较在类中。
    • 不需要定义 operator
    • @Gareve:使用对象也更快,因为您不需要像直接传入函数那样通过函数指针进行调用。
    • @DasBoot:不——比较器是一个函数对象。如果您有my_compare c,则使用c(a, b) 比较ab
    • 对象的函数定义被编码成它的类型(即,调用是一个已知的命名函数,而不是函数指针),允许内联调用等。跨度>
    【解决方案2】:

    一种方法是使比较成为一个以 SortOrderObject 作为参数的模板。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多