在某些课程中,我有一个hash_set
指针:
std::hash_set<GameObject*> gameObjects;
我希望遍历所有这些并调用update。使用迭代器,这将是这样的:
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。
答案 0 :(得分:4)
如果你有一个支持lambdas的编译器(C ++ 11),你可以使用
std::for_each(gameObjects.begin(), gameObjects.end(), [=](GameObject* o) {o->update(deltaTime);});
对于许多STL算法,使用lambdas是一个很好的选择,但正如@phresnel指出的那样,在这种情况下,基于范围的for循环(也是C ++ 11)更简洁:
for (auto o : gameObjects)
o->update(deltaTime);
答案 1 :(得分:3)
您可以使用相同的代码,但使用mem_fun
代替mem_fun_ref
std::for_each(gameObjects.begin(), gameObjects.end(),
std::mem_fun(&GameObject::update));
答案 2 :(得分:3)
作为std::for_each
的替代方案,如果您的编译器和策略允许,您可以使用基于的C ++'范围:
for (auto p : gameObjects) p->update();
此功能是在C ++ 11中添加的,C ++ 11是当前的C ++标准。并非所有编译器(-versions)都支持它。