指针容器上的std :: for_each

时间:2012-11-05 15:05:28

标签: c++ pointers foreach hashset

在某些课程中,我有一个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。

3 个答案:

答案 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)都支持它。