将值唯一地引入优先级队列C++

Uniquely intserting values into priority queue C++

本文关键字:优先级 队列 C++ 唯一      更新时间:2023-10-16

我编写了以下代码,用于将唯一值插入到数据结构中,我可以按排序顺序从中检索值(在下面的代码中,我为此目的使用了优先级队列,但是,也可以使用任何其他数据结构,如排序向量)。但是,我发现以下代码非常慢,因为我在优先级队列中插入了 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::sortstd::uniquestd::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();
  }
};