没有默认构造函数作为模板参数的自定义比较器

问题描述 投票:0回答:1

让我们看一个玩具示例,该示例从两个排序的数组中找到最小的m对数字。抛开算法效率问题,我想向优先级队列提供一个比较器在初始化期间需要某些参数:

class Foo {
    struct natural_order {
        const std::vector<int> &x,&y;
        natural_order( const std::vector<int> &x, const std::vector<int> &y ): x(x), y(y) {};
        bool operator () ( const std::pair<int,int> &a, const pair<int,int> &b ) const {
            return x[a.first]+y[a.second] < x[b.first]+y[b.second];
        }
    };
    struct cmp {
        std::unique_ptr<natural_order> o;
        cmp( const std::vector<int> &x, const std::vector<int> &y ) {
           o= std::make_unique<natural_order>(x,y);
        }
        bool operator () ( const std::pair<int,int> &a, const pair<int,int> &b ) const {
            return (*o)(b,a);
        }
    };
public:
    std::vector<std::vector<int>> m_smalles_pairs( std::vector<int> &x, std::vector<int> &y, int m ) {
        std::vector<std::vector<int>> res(m);
        std::priority_queue<int,std::vector<int>,cmp(x,y)> pq; //<-- the problem is here. Does not compile
        for ( int i= 0; i < m; ++i ) {
            auto pr= pq.top(); pq.pop();
            res[i]= std::vector<int>{x[pr.first],y[pr.second]};
            if ( pr.first+1 < x.size() )
                pq.push({pr.first+1,pr.second});
            if ( pr.second+1 < y.size() )
                pq.push({pr.first,pr.second+1});
        }
        return res;
    }
};

基本上,我希望比较器使用一个参数进行初始化,但是如何将其作为priority_queue的第三个参数?如果不需要xy参数,我只需在上面写cmp

c++ priority-queue
1个回答
0
投票

std::priority_queue提供了一个构造函数以初始化comparator

std::priority_queue

您可以简单地做:

(2) explicit priority_queue(const Compare& compare)
       : priority_queue(compare, Container()) { }
© www.soinside.com 2019 - 2024. All rights reserved.