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

2 回答 2

4

std::list有一个排序函数,你可以将比较器传递给它,所以写一个这样的函数:

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

然后你可以像这样对列表进行排序:

objects.sort(compareByGreaterY);
于 2012-04-06T04:18:51.540 回答
2

首先,为什么要使用列表?这几乎总是一个糟糕的选择。为什么要使用指针容器?这样做比使用更频繁是有充分理由的list,但我们仍然只谈论 0.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();});

请注意,要获得降序,我们将在比较中颠倒通常的顺序。

于 2012-04-06T04:26:55.310 回答