我有一个类 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/