对派生数据类型具有find函数的C++优先级队列



下面是这个问题:https://stackoverflow.com/a/16749994/1703586我有一个来自std::priority_queue的派生类。我真正需要的是一个具有find((功能的优先级队列。

当我尝试使用my_priority_queue时,我得到了一大堆我不理解的错误(粘贴在下面(。使用std::priority_queue,它编译得很好。

请帮助我理解编译器错误并解决问题。

更新:多亏了@rafix07,构造函数的添加解决了编译问题(目前(。

但是,由于我的值是元组类型,所以我编写了一个自定义查找。查看我的查找功能。因此,我仍然会遇到其他编译问题。

这是我的独立代码:


#include <functional>
#include <queue>
#include <vector>
#include <iostream>
template<typename T>
void print_queue(T q) { // NB: pass by value so the print uses a copy
while(!q.empty()) {
auto x = q.top();
auto cost = std::get<0>( x );
auto s = std::get<2>( x );
std::cout << "{ cost=" << cost << " | "  << std::get<0>(s) << "," << std::get<1>(s) << "," << std::get<2>(s) << "}";
q.pop();
}
std::cout << 'n';
}

typedef int OcTreeKey ;
typedef bool NodeOccupancyStatus;
typedef std::tuple<OcTreeKey, int,  NodeOccupancyStatus > value_tt; //< key, depth, occupancy-enum
typedef std::tuple< float , value_tt, value_tt > dijstas_tuple; // cost to goal, parent of current, current node

template<
class T,
class Container = std::vector<T>,
class Compare = std::less<typename Container::value_type>
> class my_priority_queue : public std::priority_queue<T, Container, Compare>
{
public:
typedef typename
std::priority_queue<
T,
Container,
Compare>::container_type::const_iterator const_iterator;
const_iterator find(const T&val) const
{
auto node0 = std::get<2>(val);
int node0_depth = std::get<2>(node0);

auto first = this->c.cbegin();
auto last = this->c.cend();
while (first!=last) {
// if (*first==val) return first;
auto node1 = std::get<2>(first);
int node1_depth = std::get<2>(node1);
if( node0_depth == node1_depth  ) return first;
++first;
}
return last;
}
};


int main() {

// Using lambda to compare elements.
auto cmp = [](dijstas_tuple left, dijstas_tuple right) { return ( std::get<0>(left) > std::get<0>(right) ); };
// std::priority_queue<dijstas_tuple, std::vector<dijstas_tuple>, decltype(cmp)> q3(cmp);
my_priority_queue<dijstas_tuple, std::vector<dijstas_tuple>, decltype(cmp)> q3(cmp);
auto node_null = std::make_tuple( 2.0, -1, true );
auto node_tup0 = std::make_tuple( 2.0, 14, true );
auto node_tup1 = std::make_tuple( 12.0, 12, true );
auto node_tup2 = std::make_tuple( 22.0, 12, true );
auto node_tup3 = std::make_tuple( 51.0, 13, true );
q3.push( std::make_tuple(8.0, node_null, node_tup0 ) );
q3.push( std::make_tuple(3.0, node_tup2, node_tup1 ) );
q3.push( std::make_tuple(7.0, node_tup2, node_tup2 ) );
q3.push( std::make_tuple(10.0, node_tup1, node_tup3 ) );
q3.find( std::make_tuple(8.0, node_null, node_tup0 )  );
q3.pop();
print_queue(q3);
}

这是我的编译器错误:

custom_priority_queue.cpp: In function ‘int main()’:
custom_priority_queue.cpp:62:87: error: no matching function for call to ‘my_priority_queue<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> >, std::vector<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> > >, main()::<lambda(dijstas_tuple, dijstas_tuple)> >::my_priority_queue(main()::<lambda(dijstas_tuple, dijstas_tuple)>&)’
eue<dijstas_tuple, std::vector<dijstas_tuple>, decltype(cmp)> q3(cmp);
^
custom_priority_queue.cpp:32:9: note: candidate: my_priority_queue<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> >, std::vector<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> > >, main()::<lambda(dijstas_tuple, dijstas_tuple)> >::my_priority_queue(const my_priority_queue<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> >, std::vector<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> > >, main()::<lambda(dijstas_tuple, dijstas_tuple)> >&)
> class my_priority_queue : public std::priority_queue<T, Container, Compare>
^~~~~~~~~~~~~~~~~
custom_priority_queue.cpp:32:9: note:   no known conversion for argument 1 from ‘main()::<lambda(dijstas_tuple, dijstas_tuple)>’ to ‘const my_priority_queue<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> >, std::vector<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> > >, main()::<lambda(dijstas_tuple, dijstas_tuple)> >&’
custom_priority_queue.cpp:32:9: note: candidate: my_priority_queue<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> >, std::vector<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> > >, main()::<lambda(dijstas_tuple, dijstas_tuple)> >::my_priority_queue(my_priority_queue<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> >, std::vector<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> > >, main()::<lambda(dijstas_tuple, dijstas_tuple)> >&&)
custom_priority_queue.cpp:32:9: note:   no known conversion for argument 1 from ‘main()::<lambda(dijstas_tuple, dijstas_tuple)>’ to ‘my_priority_queue<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> >, std::vector<std::tuple<float, std::tuple<int, int, bool>, std::tuple<int, int, bool> > >, main()::<lambda(dijstas_tuple, dijstas_tuple)> >&&’

找到后的编译问题

您没有为类提供构造函数。

可能是:

my_priority_queue(const Compare& cmp) : 
std::priority_queue<T, Container, Compare>(cmp) {}

或者您可以使用声明引入优先级队列构造函数:

using std::priority_queue<T, Container, Compare>::priority_queue;

由于C++20(其中lambda是默认可构造的(

my_priority_queue<dijstas_tuple, std::vector<dijstas_tuple>, decltype(cmp)> q3;

足够了,它将调用基类默认的ctorpriority_queue() : priority_queue(Compare(), Container()) { },它使用默认的可构造lambda可以很好地工作。

最新更新