0

一部のクラスでは、hash_set次のポインターがあります。

std::hash_set<GameObject*> gameObjects;

それらすべてを繰り返し処理し、更新を呼び出したいと思います。イテレータを使用すると、次のようになります。

for(std::hash_set<GameObject*>::iterator it = gameObjects.begin(), it_end = gameObjects.end(); it != it_end; ++it)
{
(*it)->update();
}

これはコードが多すぎます。使いたいですstd::for_each

だけhash_set<GameObject>だとすると、これは次のようになります。

std::for_each(gameObjects.begin(), gameObjects.end(), std::mem_fun_ref(&GameObject::update));

または、更新がパラメーターを期待していた場合、

std::for_each(gameObjects.begin(), gameObject.end(), std::bind2nd(std::mem_fun_ref(&GameObject::update), deltaTime));

hash_setこれらの両方の式は、ポインターの をどのように探しますか?

MS VisualStudio 2010 を使用しています。

4

3 に答える 3

4

ラムダ (C++11) をサポートするコンパイラがある場合は、次を使用できます。

std::for_each(gameObjects.begin(), gameObjects.end(), [=](GameObject* o) {o->update(deltaTime);});

ラムダを使用することは、多くの STL アルゴリズムにとって適切なオプションですが、@phresnel が指摘するように、この場合は範囲​​ベースの for ループ (C++11 も) の方がより簡潔です。

for (auto o : gameObjects)
    o->update(deltaTime);
于 2012-11-05T15:09:25.047 に答える
3

の代わりにstd::for_each、コンパイラとポリシーで許可されている場合は、C++ の範囲ベースを使用できます。

for (auto p : gameObjects) p->update();

この機能は、現在の C++ 標準である C++11 で追加されました。すべてのコンパイラ (-バージョン) でまだサポートされているわけではありません。

于 2012-11-05T15:09:30.137 に答える
3

持っているのと同じコードを使用できますが、mem_fun代わりに使用しますmem_fun_ref

std::for_each(gameObjects.begin(), gameObjects.end(),
    std::mem_fun(&GameObject::update));
于 2012-11-05T15:06:47.660 に答える