在c ++中有没有统一的方法来创建自定义比较器?

问题描述 投票:2回答:2

[基本上,我需要一种以统一的方式创建比较器的方法,以便在sort()函数和优先级队列中进行比较。也将更容易记住。

我的疑问是,为什么优先级队列使用“ Comp”,而排序使用“ Comp()”。还有其他方法可以使两者使用相同的格式吗?请讲一些标准方法。谢谢。

我正在尝试比较这个问题中的课程:https://practice.geeksforgeeks.org/problems/minimum-platforms/0

代码:https://ide.geeksforgeeks.org/R8snxdJl1B

Link for below code

// constructing priority queues
#include <iostream>       // std::cout
#include <queue>          // std::priority_queue
#include <vector>         // std::vector
#include <functional>     // std::greater
#include <algorithm>
using namespace std;

class Comp{
public:
  bool operator() (const int& lhs, const int&rhs) const{
    return (lhs>rhs);
  }
};

int main (){
  int myints[]= {10,60,50,20};

  // using mycomparison:
  priority_queue<int, vector<int>, Comp> pq;
  cout << "pq is using mycomparison" << endl;

  vector<int> v= {10,60,50,20};
  sort(v.begin(), v.end(), Comp());
  cout << "sort using mycomparison()" << endl;
  return 0;
}
c++
2个回答
3
投票

为什么优先级队列使用“ Comp”,而排序使用“ Comp()”

priority_queue是类型,sort是函数。函数可以推断模板参数,但是默认构造的类型没有参数可以推断类型。

如果调用构造函数,则C ++ 17的模板推导指南将允许您使用Comp()形式:

std::priority_queue pq{Comp(), std::vector<int>()};

如果只有C ++ 11或14,则可以编写一个帮助程序函数以使用自定义比较器来构建一个:

template<typename T, typename Container = std::vector<T>, typename Comp>
std::priority_queue<T, Container, Comp> make_priority_queue(Comp comp) {
    return std::priority_queue<T, Container, Comp>{comp};
}

用作

auto pq = make_priority_queue<int>(Comp());

2
投票

代替lambda,而不是土布函子。它们简单得多,并且对两者都有效。语法上的任何其他差异只是std::sortstd::priority_queue的设计方式。但是,您不必记住Comp()Comp

#include <algorithm> // std::sort
#include <array>
#include <iostream>  // std::cout
#include <queue>     // std::priority_queue
#include <vector>    // std::vector

int main() {
  // Lambda instead of functor
  constexpr auto Comp = [](auto& lhs, auto& rhs) { return lhs > rhs; };

  // std::array as an iterable type for priority_queue
  std::array<int, 4> myints = {10, 60, 50, 20};

  // using mycomparison:
  // As someone else stated, you can leave all this template stuff out in C++17
  // std::priority_queue pq(Comp, myints);
  std::priority_queue<int, decltype(myints), decltype(Comp)> pq(Comp, myints);
  std::cout << "pq is using mycomparison" << std::endl;

  std::vector<int> v = {10, 60, 50, 20};
  std::sort(v.begin(), v.end(), Comp);
  std::cout << "sort using mycomparison()" << std::endl;

  return 0;
}

我也删除了using namespace std;行,因为这是一个不好的做法。如果您不喜欢std::的全部内容,则可以改用using语句。

using std::cout;
using std::vector;
// etc.

Link

© www.soinside.com 2019 - 2024. All rights reserved.