2012-04-06 69 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();}); 

请注意,为了得到降序,我们正在反转通常的比较顺序。