在 C++11 中查找和访问优先级队列中的元素
Find and access the element in a Priority Queue in C++11
如何在C++11的优先级队列中找到一个元素并访问相应的元素?至于下面的例子:最好检查优先级队列 Q 中的元素是否存在并访问它。是否也可以编辑它?
意图:编写一个应用程序,其中我必须检查特定对象是否已插入优先级队列。如果它被插入,那么我需要访问那个特定的对象并可能更新它。
#include <iostream>
#include <vector>
#include <string>
#include <queue>
struct Person {
int val;
std::string y;
bool operator()(const Person& lhs, const Person& rhs) const
{
return lhs.val > rhs.val;
}
};
int main () {
std::vector<int> data = {5,4,3,2,1};
Person X1,X2,X3,X4,X5;
X1.val = 20;
X1.y = "twenty";
X2.val = 10;
X2.y = "ten";
X3.val = 50;
X3.y = "fifty";
X4.val = 5;
X4.y = "five";
X5.val = 0;
X5.y = "zero";
std::vector<Person> V;
V.push_back(X1);
V.push_back(X2);
V.push_back(X3);
V.push_back(X4);
V.push_back(X5);
std::priority_queue<Person,std::vector<Person>,Person> Q;
for (auto x: V) Q.push(x);
return 0;
}
对于这种用法,我建议您结合使用 std::priority_queue
和 std::unordered_map
。
让我们按如下方式重组您的数据:
struct PersonInfo {
std::string y;
};
这包含一个人的可变信息。
现在你有两个容器:
std::priority_queue<int>
个值,这些值以前是 Person
class 对象中的 val
。
一个 std::unordered_map<int, PersonInfo>
将这些值映射到 PersonInfo
s.
为了您陈述的意图
in which I have to check whether a particular object has been inserted into priority queue or not.
简单地检查是否使用地图插入了东西;不过,请确保在推送和弹出优先级队列时更新它。
If it is being inserted, then I need to access that particular object and possibly update it.
就用无序映射。
如何在C++11的优先级队列中找到一个元素并访问相应的元素?至于下面的例子:最好检查优先级队列 Q 中的元素是否存在并访问它。是否也可以编辑它?
意图:编写一个应用程序,其中我必须检查特定对象是否已插入优先级队列。如果它被插入,那么我需要访问那个特定的对象并可能更新它。
#include <iostream>
#include <vector>
#include <string>
#include <queue>
struct Person {
int val;
std::string y;
bool operator()(const Person& lhs, const Person& rhs) const
{
return lhs.val > rhs.val;
}
};
int main () {
std::vector<int> data = {5,4,3,2,1};
Person X1,X2,X3,X4,X5;
X1.val = 20;
X1.y = "twenty";
X2.val = 10;
X2.y = "ten";
X3.val = 50;
X3.y = "fifty";
X4.val = 5;
X4.y = "five";
X5.val = 0;
X5.y = "zero";
std::vector<Person> V;
V.push_back(X1);
V.push_back(X2);
V.push_back(X3);
V.push_back(X4);
V.push_back(X5);
std::priority_queue<Person,std::vector<Person>,Person> Q;
for (auto x: V) Q.push(x);
return 0;
}
对于这种用法,我建议您结合使用 std::priority_queue
和 std::unordered_map
。
让我们按如下方式重组您的数据:
struct PersonInfo {
std::string y;
};
这包含一个人的可变信息。
现在你有两个容器:
std::priority_queue<int>
个值,这些值以前是Person
class 对象中的val
。一个
std::unordered_map<int, PersonInfo>
将这些值映射到PersonInfo
s.
为了您陈述的意图
in which I have to check whether a particular object has been inserted into priority queue or not.
简单地检查是否使用地图插入了东西;不过,请确保在推送和弹出优先级队列时更新它。
If it is being inserted, then I need to access that particular object and possibly update it.
就用无序映射。