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_setof 指针?

我正在使用 MS VisualStudio 2010。

4

3 回答 3

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);
于 2012-11-05T15:09:25.047 回答
3

您可以使用您拥有的相同代码,但使用mem_fun而不是mem_fun_ref

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

作为 的替代方案std::for_each,如果您的编译器和策略允许,您可以使用基于 C++ 的范围

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

此功能是在 C++11 中添加的,它是当前的 C++ 标准。并非所有编译器(-版本)都可能支持它。

于 2012-11-05T15:09:30.137 回答