【问题标题】:Creating a priority queue containing unique elements创建包含唯一元素的优先级队列
【发布时间】:2015-02-22 12:09:53
【问题描述】:

我想创建一个包含唯一元素的优先级队列。我发现可以按如下方式创建包含唯一向量元素的队列:

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”。

【问题讨论】:

  • 如何计算给定向量的分数?
  • @Galik 感谢您的回复。分数是为每个唯一向量随机生成的
  • 另外,当您说“唯一向量元素”时,您的意思是“没有两个具有相同分数的向量”或“没有两个具有相同向量的分数”或两者兼而有之?
  • @Galik 两者。默认情况下,当两个向量相同时,它们也具有与之关联的相同分数。所以,通过这种方式,它们是相关的

标签: c++ vector


【解决方案1】:

鉴于与每个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;

【讨论】:

  • 是否可以在不弹出元素的情况下遍历这个优先级队列。如果是,那么如何
  • @JannatArora 不,很遗憾,这不可能。
  • @JannatArora 也许您可以将元素放入std::set 而不是std::priority_queue,并在需要时删除最高值的元素?
【解决方案2】:

正如 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-11
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多