2012-04-06 108 views
0

問題:我有一個對象列表,每個循環都要呈現,但我想按照它們的y位置順序渲染它們,這些位置是可變的。使用列表迭代器排序

這裏是我的表聲明...

std::list<Object *> objects; 
std::list<Object *>::iterator iter; 
std::list<Object *>::iterator iter2; 

這裏是我迄今爲止...

for(iter = objects.begin(); iter != objects.end(); ++iter) //goes through my objs 
    if((*iter)->GetID() == PLAYER || (*iter)->GetID() == ENEMY) //only part of the list 
     for(iter2 = iter; iter2 != objects.end(); ++iter2) //goes through the same objs 
     if((*iter2)->GetID() == PLAYER || (*iter2)->GetID() == ENEMY) //same as line 2 
      if((*iter)->GetY() > (*iter2)->GetY()) 

我想呈現遞減的Y值順序的對象。我想我真正的問題是我如何排序這個列表。

回答

4

std::list具有某種功能,您可以通過比較,因此寫那些像這樣的一個:

bool compareByGreaterY(const Object * lhs, const Object * rhs) 
{ 
    return lhs->GetY() > rhs->GetY(); 
} 

然後你就可以對列表排序是這樣的:

objects.sort(compareByGreaterY); 
2

首先,你爲什麼使用列表?這幾乎總是一個糟糕的選擇。你爲什麼使用指針的容器?這比使用list更經常一點,但我們仍然只談論.05%的時間,而不是0.02%。誰知道 - 在這種情況下,它甚至可能是最好的。

無論如何,我們現在假設那些確實由於某種原因有些意義。我也假定你不能修改原始集合(不清楚它是否屬實 - 如果不是,只是跳過複製它,並對原始集合進行排序 - 但如果你不需要維護訂單出於某種原因,這幾乎是一定真的不想列表

根據這些假設,你可能要複製的集合,那種,然後現在。

struct descY { 
    bool operator()(Object const *a, Object const *b) { 
     return b.GetY() < a.GetY(); 
    } 
}; 

std::vector<Object *> sorted(objects.begin(), objects.end()); 
std::sort(sorted.begin(), sorted.end(), descY()); 

如果你有C++ 11可用,您可以使用lambda縮短一點,並保持邏輯,使其更容易看到發生了什麼,而不用追逐代碼來查找比較結果:

std::vector<Object *> sorted(objects.begin(), objects.end()); 
std::sort(sorted.begin(), sorted.end(), 
      [](Object const *a, Object const *b) { return b->GetY() < a->GetY();}); 

請注意,爲了得到降序,我們正在反轉通常的比較順序。