调用C++向量的每个元素的成员函数

vik*_*raj 5 c++ function vector

假设有一个类对象的向量.

vector<Object1> vec;
Run Code Online (Sandbox Code Playgroud)

说,Object1有一个成员函数void foo(Object2*).

我想做以下事情:

for(int i=0; i<vec.size(); i++) {
    vec[i].foo(obj2);
}
Run Code Online (Sandbox Code Playgroud)

如何在不使用显式循环的情况下完成此操作?

Fle*_*exo 6

TR1/C++ 11最简单:

#include <vector>
#include <functional>
#include <algorithm>

struct Object2{};

struct Object1 {
  void foo(Object2*) {}
};

int main() {
  std::vector<Object1> vec;
  Object2 obj2;
  std::for_each(vec.begin(), vec.end(), std::bind(&Object1::foo, std::placeholders::_1, &obj2));
}
Run Code Online (Sandbox Code Playgroud)

但你也可以使用std::for_eachstd::bind2ndstd::mem_fun_ref如果这不是一个选项:

std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&Object1::foo), &obj2));
Run Code Online (Sandbox Code Playgroud)

  • 其他C++ 11版本:`std :: for_each(vec.begin(),vec.end(),[&obj2](Object1&o){o.foo(obj2);});`或`for(auto&o :vec){o.foo(obj2); }`.如果有人关心后者是一个"显式循环",因此"不太清楚"而不是使用算法,那么让我们听听它;-) (3认同)
  • 这不是一个明确的**循环:) (2认同)
  • @Benj - 对我而言,优点是:a)使意图更清晰.我所做的大部分是关于数据,而不是控制结构,这强调了b)我不会因为在循环的每次迭代时在容器上调用`.end()`而感到唠叨(有些人喜欢抱怨)关于那个)c)犯下意外错字很难 (2认同)