6

クラス オブジェクトのベクトルがあるとします。

vector<Object1> vec;

たとえば、Object1メンバー関数がありますvoid foo(Object2*)

私は次のことをしたい:

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

明示的なループを使用せずにこれを行うにはどうすればよいですか?

4

3 に答える 3

7

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_eachwith をstd::bind2nd使用することもできstd::mem_fun_refます。それがオプションでない場合:

std::for_each(vec.begin(), vec.end(), std::bind2nd(std::mem_fun_ref(&Object1::foo), &obj2));
于 2012-05-09T13:12:28.757 に答える
0

古いスタイルの 1 つは、ファンクターを手動で記述することです。より複雑なロジックの場合、これにより、クラス全体を問題に専念させることができます。

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));
于 2012-05-09T13:17:16.063 に答える
-1

このようなコードの可読性は完全ではなく、単純な 1 行の方法では実行できません。これは、あるクラスのメンバーメソッドの最初の引数が、このクラスのオブジェクトへのポインターであり、その上で実行されるためです。

別の方法として、新しい C++11 標準に付属する foreach ループを使用することもできます (ただし、これはまだループです)。

于 2012-05-09T13:28:05.373 に答える