创建包含唯一元素的优先级队列
Creating a priority queue containing unique elements
我想创建一个包含唯一元素的优先级队列。我可以发现一个包含唯一矢量元素的队列可以创建如下:
template <typename T>
class queue1 {
private:
std::queue<T> m_queue;
std::set<T> m_set;
public:
bool push(const T& t) {
if (m_set.insert(t).second) {
m_queue.push(t);
return true;
}
return false;
}
};
queue1<vector<unsigned> > queueUnique;
但我的要求是,除了包含唯一矢量元素的队列之外,它应该是一个优先级队列,因为我的队列中的每个矢量都有一个相关的分数
priority_queue<queueUnique, vector<queueUnique>, ComparisonFunction> pq;
然而,这似乎是不正确的,因为它给出了一个队列。
我不知道我应该如何将分数与每个向量相关联,这样我得到的队列就是一个具有唯一向量元素的优先级队列。例如,如果我的队列是:
struct myDS{
vector<unsigned> vec;
double score;
};
queue<myDS> myqueue;
vector<unsigned> dummyVec1;
dummyVec1.push_back(5);
myDS obj;
obj.vec=dummyVec1;
obj.score=0.9;
vector<unsigned> dummyVec2;
dummyVec2.push_back(5);
myDS obj2;
obj2.vec=dummyVec2;
obj2.score=0.9; //with duplicate values score is always same so can be eliminated
那么,我如何创建一个在obj.score上排序但不包含重复元素的优先级队列呢。例如,上面的myqueue应该只包含一次"5"。
假设与每个std::vector
相关的分数是唯一的,那么在struct myDS
中添加一个比较器函数就足够了,这样std::priority_queue
就可以确定排序:
类似这样的东西:
struct myDS
{
std::vector<unsigned> vec;
double score;
// Comparison function for ordering
// based on score
bool operator<(const myDS& rhs) const
{
return score < rhs.score;
}
};
template<typename T>
class queue1
{
private:
std::priority_queue<T> m_queue;
std::set<T> m_set;
public:
bool push(const T& t)
{
if(m_set.insert(t).second)
{
m_queue.push(t);
return true;
}
return false;
}
};
queue1<myDS> queueUnique;
正如Galik所评论的,您正在寻找的是一个有序集:
#include <set>
struct ComparableThingy{
ComparableThingy(std::string const& n, unsigned v):name(n),value(v){}
std::string name;
unsigned value;
bool operator <(ComparableThingy const& other)const{return value<other.value;}
};
inline std::ostream& operator<<(std::ostream& out, std::set<ComparableThingy> const& s){
for(auto const& v:s) out << v.name << "," << v.value << " ";
return out;
}
int main()
{
std::set<ComparableThingy> s;
s.emplace("a",3);
s.emplace("b",2);
s.emplace("c",3);
s.emplace("d",1);
std::cout << s << "n";
// Equivalent to "pop"
std::cout << "pop...n";
s.erase(s.begin());
std::cout << s << "n";
}
输出:
d,1 b,2 a,3
pop...
b,2 a,3
相关文章:
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 排序数组优先级队列
- 更改运行时优先级队列的排序功能
- 优先级队列构造函数的工作
- 实现优先级队列
- 优先级队列功能比较
- 在C++中打印对的优先级队列的所有值时出现问题
- 使用堆的优先级队列,具有相同键的值不遵循 FIFO(先进先出)
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 是否可以使用简单队列创建优先级队列
- 如何在 c++ 中创建对的优先级队列.这会弹出具有最小值的元素.默认的弹出最大值
- Cython中带有自定义比较器的优先级队列
- 优先级队列比较器[C++].
- asio::io_service 具有多个线程的优先级队列处理