2011-05-10 70 views
1

我有一個類ActiveStatusEffect集合聲明的unordered_set如下:無法排序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 < _RanIt,_Base> &,const std :: _ Revranit < _RanIt2,_Base2> &)':無法推導出templ吃 參數關於 '常量 的std :: _ Revranit < _RanIt,_base> &' 從 '升壓:: unordered_detail :: hash_const_iterator' C:\程序 文件(86)\微軟的Visual Studio 10.0 \ VC \包括\算法3806

錯誤199錯誤C2784: '_Base1 :: difference_type的std ::操作者 - (常量性病:: _ Revranit < _RanIt,_base> &,常量性病:: _ Revranit < _RanIt2,_Base2> &)':無法推導模板 參數'const std :: _ Re vranit < _RanIt,_base> &「從 '的boost :: unordered_detail :: hash_const_iterator' C:\程序 文件(x86)\微軟的Visual Studio 10.0 \ VC \包括\算法3806

我爲什麼無法排序集?我很確定這是關於unordered_set的一些問題,因爲刪除嘗試將其排序或更改爲向量不會產生錯誤。

+6

如果該集合是**無序的**你將如何排序(例如**命令**)它呢? – Jordan 2011-05-10 23:03:35

+0

不知何故,這真的讓我笑了...一定是現在是凌晨2點的時候,所以... – RedX 2011-05-10 23:57:40

回答

4
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à,排序集。

7

unordered_set沒有非常量迭代器,因爲如果你可以改變迭代器指向的項目,你可以違反集合的不變式(唯一性)。此外,如果您對unordered_set進行排序,則不再能夠在容器中查找該項目(假設它通過散列工作)。

如果你真的想排序項目的集合,你需要先將它複製到vector然後對其進行排序。但在這種情況下,你是否考慮過,如果unordered_set首先是你的合適容器?如何使用正常set哪些排序的代價是查找速度較慢。