2012-11-05 151 views
0

在某些類的容器的for_each我有一個指針hash_set的std ::指針上

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

+2

您正在使用哪種編譯器?有多少C++ 11可用? – jalf

回答

3

您可以使用您有相同的代碼,但使用mem_fun代替mem_fun_ref

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

如果您有支持的lambda(C++ 11編譯器),你可以使用

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

使用lambda表達式是許多STL算法一個不錯的選擇,但是,作爲@phresnel指出,for循環基於範圍的(還有C++ 11)在這種情況下更簡潔:

for (auto o : gameObjects) 
    o->update(deltaTime); 
3

作爲替代std::for_each,如果你的編譯器和政策允許的情況下,你可以使用C++的基礎爲範圍:

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

該功能已添加到C++ 11中,該功能是當前的C++標準。並非所有的編譯器(-versions)都可以支持它。