【问题标题】:std::for_each on container of pointers指针容器上的 std::for_each
【发布时间】:2012-10-25 10:43:42
【问题描述】:

在某些类中,我有一个 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&lt;GameObject&gt;,这将是这样的:

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。

【问题讨论】:

  • 您使用的是哪个编译器?有多少 C++11 可用?

标签: c++ pointers foreach hashset


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果你有一个支持 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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-12-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多