无法对unordered_set进行排序

Meg*_*ron 1 c++ sorting

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

boost::unordered_set<StatusEffects::ActiveStatusEffect> ActiveStatusEffects;
Run Code Online (Sandbox Code Playgroud)

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);
        }
    };
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

错误198错误C2784:'_ Base1 :: difference_type std :: operator - (const std :: _ Revranit <_RanIt,_Base>&,const std :: _ Revranit <_RanIt2,_Base2>&)':无法推断'const的模板参数std :: _ Revranit <_RanIt,_Base>&'from'bool :: 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 <_RanIt,_Base>&,const std :: _ Revranit <_RanIt2,_Base2>&)':无法推断'const的模板参数std :: _ Revranit <_RanIt,_Base>&'from'bool :: unordered_detail :: hash_const_iterator'c:\ program files(x86)\ microsoft visual studio 10.0\vc\include\algorithm 3806

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

Mar*_*k B 7

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

如果您真的想要对项目集进行排序,则需要vector先将其复制到第一个项目中,然后对其进行排序.但在那种情况下,您是否考虑过首先是否unordered_set适合您?怎么样用一个正常的set,其在查找为慢为代价订购.


Tim*_*ter 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());
Run Code Online (Sandbox Code Playgroud)

Voilà,一个排序的集合.