我需要在priority_queue中保留一个整数集合。但是我需要能够删除其中一个整数,即使它不是我容器的第一个元素。我无法使用std :: priority_queue。 我选择使用一个集合,它将整数排序基于自定义比较器。
class Comparator
{
vector<double>& cmp;
public:
Comparator(vector<double>& a_cmp) : cmp(a_cmp) {}
bool operator() (int i, int j) const {return cmp.at(i) < cmp.at(j);}
};
然后我使用了这样的集合:
Comparator comp = Comparator(a_cmp);
set<int, Comparator> my_set (comp);
my_set.insert(index);
然而看起来对于两个整数i和j,例如i!= j和cmp.at(i)== cmp.at(j),如果我尝试插入两者,只会有一个插入到集合中。 我理解这是std :: set的行为,但是如果这些整数(不等于)将被插入到彼此相邻的集合中,我会更喜欢。 换句话说,我需要在对集合进行排序时使用自定义比较器,但不要阻止插入。 我认为当我修改比较函数时它可能有用:
bool operator() (int i, int j) const {return cmp.at(i) =< cmp.at(j);}
但我不确定它是否完全正确。我应该使用带有原始比较函数的std :: vector并使用std :: sort进行排序吗? 谢谢你的回答。
答案 0 :(得分:2)
然而看起来对于两个整数i和j,例如i!= j和cmp.at(i)== cmp.at(j),如果我尝试插入两者,只会有一个插入到集合中。我理解这是std :: set的行为,但是如果这些整数(不等于)将被插入到彼此相邻的集合中,我会更喜欢。
在您的operator()中,您可以执行
return (cmp.at(i) < cmp.at(j)) || (!(cmp.at(j) < cmp.at(i)) && (i < j));
基本上说,集合将按索引的值按升序排序,然后按索引本身的相对值排序。
答案 1 :(得分:1)
Boost有几个堆实现,其功能多于STL提供的功能。您可以使用boost::heap::fibonacci_heap方法{/ 3}}。
答案 2 :(得分:-1)