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

时间:2012-05-09 13:09:59

标签: c++ function vector

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

vector<Object1> vec;

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

我想做以下事情:

for(int i=0; i<vec.size(); i++) {
    vec[i].foo(obj2);
}

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

3 个答案:

答案 0 :(得分: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));
}

但您也可以std::for_each使用std::bind2ndstd::mem_fun_ref如果不是选项:

std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&Object1::foo), &obj2));

答案 1 :(得分:0)

一种较旧的风格是手动编写仿函数。对于更复杂的逻辑,这允许您将整个类专门用于解决问题。

class fancyFunctor
{
  Object2* m_data;

public:
  fancyFunctor(Object2 * data) : m_data(data){}

  operator()(Object1 & ref) 
  {
    ref.foo(m_data) 
  }
}

然后去迭代:

std::for_each(vec.begin(),vec.end(), fancyFunctor(&randomObject2));

答案 2 :(得分:-1)

此类代码的可读性并不完美,无法以任何简单的单行方式完成。 这是因为,某个类的成员方法的第一个参数是指向该类的对象的指针,它将在该对象上执行。

或者你可以使用新的C ++ 11标准附带的foreach循环(但它仍然是循环)。