1

我想创建一个使用堆(使用数组)的优先级队列。优先级队列将是通用的,因此只要客户端通过构造函数传递比较函数来比较这两种类型,就可以接受所有数据类型。

如何创建一个接受比较函数作为参数的构造函数?此外,我如何在检查时调用比较函数

return (Type a==Type b)

例如。

struct node{
   string val1;
   string val2;
   vector<node *> connectedNodes;
};

int compareNode(node a,node b){
 //describe the compare
}

int main(){
PQueue<node> q(compareNode);
}

PQueue 类被实现为一个数组。随着添加、冒泡、堆化需要比较两个 ValType,我希望它们使用 compareNode 进行比较。

4

2 回答 2

0

您不必这样做:不要使用数组,使用 C++ 中 STL 库的内置优先级队列。它有自己的比较功能,您可以更改。

参考:http ://www.cplusplus.com/reference/queue/priority_queue/

您还可以查看 topcoder 教程(用于算法使用)。

于 2013-07-07T13:52:31.157 回答
0

让我先给你一个简单的答案,然后再给你一个更通用的答案。

您可以通过将参数的类型声明为指针函数的类型来简单地将函数作为参数传递。您还可以将变量类型指针指向函数。例如,如果您的函数声明是

int compareNode(node a, node b)

那么你可以做这样的事情:

#include <iostream>
#include <vector>
#include <string>
using namespace std;

struct node{
   string val1;
   string val2;
   vector<node *> connectedNodes;
};

int compareNode(node a,node b){
 //describe the compare
 return a.val2.compare(b.val2); // or any other code
}

template <class T>
class PQueue {
  protected:
    // this declares a protected member named compareFunction of type pointer to a function which takes 2 T parameters and returns a int. Note that all the parenthesis are mandatory
    int (*compareFunction)(T, T);

  public:

    PQueue (int (*compareFunctionParameter)(T, T)) : compareFunction(compareFunctionParameter) {
       // this constructor receives a pointer to function and initializes it's member to that pointer. If the constructor initialization list confuses you, you can read 'compareFunction = compareFunctionParameter '
    }

  int someMethod() {
     // call the function through the pointer you have:
     node n1, n2;
     n1.val1 = "node1_val1";
     n1.val2 = "zzz";

     n2.val1 = "node2_val1";
     n2.val2 = "aaa";
     return compareFunction(n1, n2);
  }
};

int main() {
    PQueue<node> pq(compareNode);
    cout << pq.someMethod() << endl;
    return 0;
}

http://ideone.com/EPjbya

希望这个你可以使用它。

现在来看一个更通用的例子。

C++11 引入了 lambda。http://www.cprogramming.com/c++11/c++11-lambda-closures.html http://www.stroustrup.com/C++11FAQ.html#lambda

#include <iostream>
#include <vector>
#include <string>
#include <functional>
using namespace std;

struct node{
   string val1;
   string val2;
   vector<node *> connectedNodes;
};

int compareNode(node a,node b){
 //describe the compare
 return a.val2.compare(b.val2); // or any other code
}

template <class T, class Comparator>
class PQueue {
  protected:
    Comparator compareFunction;

  public:

    PQueue (Comparator compareFunctionParameter) : compareFunction(compareFunctionParameter) {
    }

  int someMethod() {
     // call the function
     node n1, n2;
     n1.val1 = "node1_val1";
     n1.val2 = "zzz";

     n2.val1 = "node2_val1";
     n2.val2 = "aaa";
     return compareFunction(n1, n2);
  }
};

int main() {
    // queue with pointer to function
    PQueue<node, int (*)(node, node)> pq(compareNode);
    cout << pq.someMethod() << endl;

    // queue with lamda (anonimous function)
    PQueue<node, std::function<int (node, node)>> pq_lambda([](node a, node b) -> int {return a.val1.compare(b.val1);} );
    cout << pq_lambda.someMethod() << endl;
    return 0;
}

http://ideone.com/ryQmAn您需要为 C++11 标准编译此代码。

这里的模板 Comparator 既可以是指向函数的指针,也可以是 lambda。如果您对 lambdas 感兴趣,我上面提供的两个链接应该可以帮助您入门。

于 2013-12-02T18:06:39.130 回答