构造向量的优先级队列

时间:2018-02-17 11:09:19

标签: c++ c++11 stl

我正在寻找一个矢量优先级队列的简单STL实现。每个向量恰好有4个元素。我想根据每个向量的第3个元素对我的优先级队列进行排序。具有最低第3个元素的向量应位于顶部(向量的最小优先级队列)。

如何在C ++中实现它?

此外,如果任何人实际拥有默认优先级队列的STL实现,请提供一个链接。就像STL中的官方实现一样。

6 个答案:

答案 0 :(得分:4)

您必须创建自己的比较器来比较priority_queue的元素。

这样的事情:

// How to compare elements
struct my_comparator
{
    // queue elements are vectors so we need to compare those
    bool operator()(std::vector<int> const& a, std::vector<int> const& b) const
    {
        // sanity checks
        assert(a.size() == 4);
        assert(b.size() == 4);

        // reverse sort puts the lowest value at the top    
        return a[2] > b[2];
    }
};

// for usability wrap this up in a type alias:
using my_priority_queue = std::priority_queue<std::vector<int>, std::vector<std::vector<int>>, my_comparator>;

int main()
{
    my_priority_queue mpq;

    mpq.push({1, 2, 1, 4});
    mpq.push({1, 2, 2, 4});
    mpq.push({1, 2, 3, 4});

    // etc ...
}

答案 1 :(得分:1)

请考虑使用STL数据结构priority_queue。我之前遇到过类似的问题,这段代码应该有所帮助。

我认为在发布答案之前,我们需要检查我们的答案是否正确构建。所以这是有效的程序,但您不应该使用using namespace std;,请使用std::进行更改:

#include <functional>
#include <queue>
#include <vector>
#include <iostream>

using namespace std;

template<typename T> void print_queue(T& q) {
    while(!q.empty()) {
        vector<int> tmp;
        tmp = q.top();
        std::cout << tmp[2] << " ";
        q.pop();
    }
    std::cout << '\n';
}

struct Compare {
    bool operator()(vector<int> const & a, vector<int> const & b)
    { return a[2] > b[2]; }
};

int main()
{

    vector<int> v1;
    vector<int> v2;
    vector<int> v3;
    vector<int> v4;

    priority_queue< vector<int>, vector< vector<int> >, Compare > pr_q;

    int a[5] = { 1,2,3,4 };
    v1.insert(v1.end(), a, a+4); v1[2] = 11; // v1 = {1, 2, 11, 4}
    v2.insert(v2.end(), a, a+4); v2[2] = -1; // v1 = {1, 2, -1, 4}
    v3.insert(v3.end(), a, a+4); v3[2] = 22; // v1 = {1, 2, 22, 4}
    v4.insert(v4.end(), a, a+4); v4[2] = 31; // v1 = {1, 2, 31, 4}

    pr_q.push(v1);
    pr_q.push(v2);
    pr_q.push(v3);
    pr_q.push(v4);

    print_queue(pr_q);

    return 0;
}

答案 2 :(得分:0)

Galiks的例子很好。但是,如果遵循一个功能的原则 - 一个任务,我不会将理智检查放在比较器中。有关http://en.cppreference.com/w/cpp/container/priority_queue的更多详情。使用lambda我们可以按如下方式实现它:

html += '<td><select name="item_unit[]" class="form-control item_unit"><option value="">Select Unit</option><?php echo fill_unit_select_box($connect); ?></select></td>'

答案 3 :(得分:0)

您可以将std::priority_queue与自定义比较器一起使用。

using QueueElement = std::vector<int>;

auto compare_third_element = [](const QueueElement& lhs, const QueueElement& rhs) 
                             { 
                                assert(lhs.size() > 2 && rhs.size() > 2);
                                return lhs[2] > rhs[2]; 
                             };

using MyPriorityQueue = std::priority_queue < QueueElement, std::vector<QueueElement>, decltype(compare_third_element)>;
MyPriorityQueue my_queue(compare_third_element);

my_queue.emplace(QueueElement{ 0,0,2 });
my_queue.emplace(QueueElement{ 0,0,3 });
my_queue.emplace(QueueElement{ 0,0,1 });

答案 4 :(得分:0)

@Component

答案 5 :(得分:-1)

#include #include

使用命名空间标准;

void max(vector<int> v) 
{ 
for(int i=0; i<v.size();i++) 
{ 
    cout<<v[i]<<" "; 
} 
cout<<endl; 
};

struct my_comparator
{
    bool operator()(vector<int> const& a,vector<int> const& b) const
    {
        return a>b;
    }
};

priority_queue<vector<int>, vector<vector<int>>, my_comparator>pq;

int main() 
{
    vector<int> inp1{10,20,30,40}; 
    vector<int> inp2{10,20,35,40}; 
    vector<int> inp3{30,25,10,50};
    vector<int> inp4{20,10,30,40};
    vector<int> inp5{5,10,30,40};

    pq.push(inp1); 
    pq.push(inp2); 
    pq.push(inp3); 
    pq.push(inp4); 
    pq.push(inp5); 

    max(pq.top()); 
}