将值唯一地引入优先级队列C++
Uniquely intserting values into priority queue C++
我编写了以下代码,用于将唯一值插入到数据结构中,我可以按排序顺序从中检索值(在下面的代码中,我为此目的使用了优先级队列,但是,也可以使用任何其他数据结构,如排序向量)。但是,我发现以下代码非常慢,因为我在优先级队列中插入了 100 万个值。有人可以帮我了解如何改进下面给出的代码:
class unique_queue1 {
//private:
public:
std::priority_queue<std::pair<vector<int>, double>, vector<std::pair<vector<int>, double> >, CompareClass1 > m_queue;
std::set<vector<int> > m_set;
//public:
bool push(const pair<vector<int>, double> & t) {
if (m_set.insert(t.first).second) {
m_queue.push(t);
return true;
}
return false;
}
void pop() {
assert(!m_queue.empty());
const std::pair<vector<int>, double>& val = front();
std::set<vector<int> >::iterator it = m_set.find(val.first);
assert(it != m_set.end());
m_set.erase(it);
m_queue.pop();
}
const pair<vector<int>, double>& front() const {
return m_queue.top();
}
bool empty() const{
return m_queue.empty();
}
};
既然你想强制实现唯一性,你真的只需要集合。
#include <vector>
#include <set>
using namespace std;
class unique_queue1
{
public:
using value_type = std::pair<vector<int>, double>;
std::set<value_type, CompareClass1> m_set;
bool push(const value_type& t) {
return m_set.insert(t).second;
}
void pop() {
m_set.erase(m_set.begin());
}
const value_type& front() const {
return *m_set.begin();
}
bool empty() const{
return m_set.empty();
}
};
现在,除非你在那个职业中施展一些额外的魔法,否则你当然可以用布景替换整个东西......
除此之外,您的介绍文本读起来就像您实际上想先用数据填充容器,只有在完全填充之后,您才希望按排序顺序获得唯一条目。
我建议您尝试将所有内容推送到向量中,然后使用算法std::sort
和std::unique
和std::reverse
,然后使用pop_back
检索数据。我很确定这将比使用set
快得多。
这是这样(未经测试的):
class unique_queue1
{
public:
using value_type = std::pair<vector<int>, double>;
std::vector<value_type> values;
void push_back(const value_type& t)
{
return values.push_back(t);
}
// Must be called between push_back and (pop or front)
void prepare()
{
sort(values.begin(),
values.end(),
CompareClass1()); // Maybe use lambdas for comparison
erase(unique(values.begin(),
values.end(),
CompareClass2()), // Need a comparator for equality, again,
// you might want to use a lambda
values.end());
reverse(values.begin(), values.end());
}
void pop()
{
values.pop_back();
}
const value_type& front() const
{
return values.back();
}
bool empty() const
{
return values.empty();
}
};
相关文章:
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 使用2个键的cpp-stl::优先级队列排序不正确
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 打印优先级队列
- 带自定义比较器的最小优先级队列
- 优先级队列自定义比较器
- 排序数组优先级队列
- 更改运行时优先级队列的排序功能
- 优先级队列构造函数的工作
- 实现优先级队列
- 优先级队列功能比较
- 在C++中打印对的优先级队列的所有值时出现问题
- 使用堆的优先级队列,具有相同键的值不遵循 FIFO(先进先出)
- 为什么某些 STL 容器(堆栈、队列、优先级队列)不支持迭代器?
- 是否可以使用简单队列创建优先级队列
- 如何在 c++ 中创建对的优先级队列.这会弹出具有最小值的元素.默认的弹出最大值
- Cython中带有自定义比较器的优先级队列
- 优先级队列比较器[C++].
- asio::io_service 具有多个线程的优先级队列处理