插入stl集

时间:2014-04-23 08:46:34

标签: c++ stl set

我需要在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进行排序吗? 谢谢你的回答。

3 个答案:

答案 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}}。

您可以找到complexities of each heap operations here

答案 2 :(得分:-1)