无法对unordered_set进行排序

时间:2011-05-10 22:56:44

标签: c++ sorting

我有一个类ActiveStatusEffect的unordered_set该集合声明如下:

boost::unordered_set<StatusEffects::ActiveStatusEffect> ActiveStatusEffects;

ActiveStatusEffect定义如下:

class ActiveStatusEffect
    {
    public:
        StatusEffect* effect;
        int ReminaingTurns;
        bool operator<(const ActiveStatusEffect& ase) const
        {
            return *effect < *ase.effect;
        }
        bool operator>(const ActiveStatusEffect& ase) const
        {
            return *effect > *ase.effect;
        }
        bool operator==(const ActiveStatusEffect& ase) const
        {
            return *effect == *ase.effect;
        }
        bool operator!=(const ActiveStatusEffect& ase) const
        {
            return !((*this) == ase);
        }
    };

StatusEffect之间的比较是对每个状态效果实例的唯一整数进行比较。

但是,如果我尝试按如下方式对效果进行排序:

std::sort(statusSet.begin(), statusSet.end(), [](StatusEffects::ActiveStatusEffect const &se1, StatusEffects::ActiveStatusEffect const &se2){return se1.effect->GetPriority() < se2.effect->GetPriority();});

我在算法头文件中遇到很多错误,例如

  

错误198错误C2784:   '_Base1 :: difference_type std :: operator    - (const std :: _ Revranit&lt; _RanIt,_Base&gt;&amp;,const std :: _ Revranit&lt; _RanIt2,_Base2&gt;   &amp;)':无法推断模板   'const。的论证   的std :: _ Revranit&LT; _RanIt,_base&GT; &安培;”从   'boost :: unordered_detail :: hash_const_iterator'c:\ program   files(x86)\ microsoft visual studio   10.0 \ vc \ include \ algorithm 3806

     

错误199错误C2784:   '_Base1 :: difference_type std :: operator    - (const std :: _ Revranit&lt; _RanIt,_Base&gt;&amp;,const std :: _ Revranit&lt; _RanIt2,_Base2&gt;   &amp;)':无法推断模板   'const。的论证   的std :: _ Revranit&LT; _RanIt,_base&GT; &安培;”从   'boost :: unordered_detail :: hash_const_iterator'c:\ program   files(x86)\ microsoft visual studio   10.0 \ vc \ include \ algorithm 3806

为什么我无法对该组进行排序?我非常确定这是关于unordered_set的,因为删除尝试将其排序或更改为向量不会产生错误。

2 个答案:

答案 0 :(得分:7)

unordered_set没有非const迭代器,因为如果你可以改变迭代器指向的项,你可能会违反集合的不变量(其他的唯一性)。另外,如果你对unordered_set进行了排序,你将不再能够在容器中查找该项(假设它通过哈希工作)。

如果确实想要对这些项目进行排序,则需要先将其复制到vector然后对其进行排序。但在这种情况下,您是否考虑过unordered_set首先是否适合您?如果使用正常的set 订购,那么以查找速度较慢为代价。

答案 1 :(得分:5)

boost::unordered_set<Foo> a;
a.insert(...);
...

std::set<Foo> b(a.begin(), a.end());

std::set<Foo> c;
std::copy(a.begin(), a.end(), std::inserter(c, c.end());

Voilà,一个有条不紊的集合。