c++ - 无法对 unordered_set 进行排序

标签 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();});

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

Error 198 error C2784: '_Base1::difference_type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'boost::unordered_detail::hash_const_iterator' c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm 3806

Error 199 error C2784: '_Base1::difference_type std::operator -(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'boost::unordered_detail::hash_const_iterator' c:\program files (x86)\microsoft visual studio 10.0\vc\include\algorithm 3806

为什么我无法对集合进行排序?我很确定这是关于 unordered_set 的,因为删除排序尝试或将其更改为 vector 不会产生错误。

最佳答案

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

如果您真的想要对项目集进行排序,您需要先将其复制到一个vector 中,然后再对其进行排序。但是在那种情况下,您是否首先考虑过 unordered_set 是否是适合您的容器?使用普通的 set 怎么样? 以查找速度变慢为代价进行排序。

关于c++ - 无法对 unordered_set 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5957421/

相关文章:

Python - 带有字母数字的人类数字,但在 pyQt 和 __lt__ 运算符中

algorithm - 具有矛盾约束的项目的最佳排序

python - 为文本文件中的每一行创建一个新列表?

无法按字母顺序(排序)字符串吗?

java - 使用 Double 以相反的顺序对 HashMap 进行排序

c++ - 从转换为基对象的 Void 指针调用派生类方法

c++ - 与 Qt 静态链接的应用程序给出错误 : Failed to load platform plugin "windows"

c++ - 基于 GLSL 的投影/模型 View 使对象不可见

c++ - 在 Flex 中匹配 `\`

c++ - 有没有办法证明下面的第二个片段在函数声明之前插入了一个不可见的声明 `struct S;`?