我有一个类的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的事情,因为删除尝试将其排序或更改为向量不会产生错误.
unordered_set
没有非const迭代器,因为如果你可以改变迭代器指向的项,你可能会违反集合的不变量(其他的唯一性).另外,如果你对unordered_set进行了排序,你将不再能够在容器中查找该项(假设它通过哈希工作).
如果您真的想要对项目集进行排序,则需要vector
先将其复制到第一个项目中,然后对其进行排序.但在那种情况下,您是否考虑过首先是否unordered_set
适合您?怎么样用一个正常的set
,其是在查找为慢为代价订购.
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à,一个排序的集合.