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.02パーセントではなく.05パーセントの時間しか話していません。誰が知っているか-この場合、それは最善を尽くすかもしれません。

とにかく、今のところ、それらは何らかの理由で本当に意味があると仮定します。また、元のコレクションを変更できないと仮定します(これが正しいかどうかは不明です。そうでない場合は、コピーをスキップして元のコレクションを並べ替えてください。ただし、順序を維持する必要がない場合は、何らかの理由で、リストが本当に欲しくないことはほぼ確実です。

これらの仮定の下で、コレクションをコピーし、並べ替えてから、次のように表示することをお勧めします。

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を使用できる場合は、ラムダを使用してそのビットを少し短くし、コードを追いかけて比較を見つけることなく、何が起こっているのかを少し簡単に確認できるロジックを維持できます。

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 に答える