我有一个类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的,因为删除尝试将其排序或更改为向量不会产生错误。
答案 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à,一个有条不紊的集合。