std :: for_each在指针的容器上

std::for_each on container of pointers

本文关键字:指针 for each std      更新时间:2023-10-16

在某些类中,我有指针的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 VisualStudio2010。

如果您的编译器支持Lambdas(C 11),则可以使用

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

使用lambdas是许多STL算法的不错选择,但是,正如@Phresnel指出的那样,在这种情况下,基于范围的循环(也是C 11)更简洁:

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

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

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

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

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

使用C 11添加了此功能,即当前的C 标准。并非所有的编译器( - versions)可能支持它。