我正在寻找一个矢量优先级队列的简单STL实现。每个向量恰好有4个元素。我想根据每个向量的第3个元素对我的优先级队列进行排序。具有最低第3个元素的向量应位于顶部(向量的最小优先级队列)。
如何在C ++中实现它?
此外,如果任何人实际拥有默认优先级队列的STL实现,请提供一个链接。就像STL中的官方实现一样。
答案 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());
}