2012-05-09 40 views
5

Sınıf nesnelerinin bir vektörü olduğunu varsayalım.C++ vektörünün her öğesinin üye işlevini çağırma

vector<Object1> vec; 

Say, Object1 üye işlevi void foo(Object2*) sahiptir.

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

Bu nasıl açık bir döngü kullanmadan yapılabilir:

Aşağıdaki yapmak istiyorum?

+3

Bir döngü kullanmada sorun nedir? – giorashc

+2

@giorashc, her zaman bir döngü üzerinde bir algoritmayı tercih eder. Bununla birlikte, şu ana kadar menzilli. – chris

+1

@giorashc Yanlış bir şey yok. Bir vektörün elemanlarına fonksiyon uygulamak için “for_each” olduğu gibi, bir vektörün her elemanı için bir üye fonksiyonunu çağırmanın bir yolu olup olmadığını bilmek istedim. – vikaspraj

cevap

6

ile kolay 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)); 
} 

Ama bu bir seçenek değil ise de std::bind2nd ile std::for_each ve std::mem_fun_ref kullanabilirsiniz:

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

For_each sayımı döngü değil midir? –

+2

Bu bir ** açık ** döngü değil :) –

+1

@LuchianGrigore, bir düz döngü üzerinde tercih edilmesi gereken bir algoritma. – chris

0

adet büyük tarzı el etmektir Bir functor yaz. Daha karmaşık mantık için bu, problem için bütün bir sınıfı adamanıza olanak tanır. Böyle kod

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

Hassasiyet mükemmel değildir ve herhangi bir basit tek satırlık bir şekilde yapılamaz:

class fancyFunctor 
{ 
    Object2* m_data; 

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

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

Sonra iteratate için. Bunun nedeni, bir sınıfın üye yönteminin ilk argümanı, gerçekleştirilecek olan bu sınıfın nesnesine işaretçidir.

Alternatif olarak yeni C++ 11 standardıyla gelen foreach döngüsünü kullanabilirsiniz (ancak yine de döngüdür).

+0

Eğer benim işaretçiye rağmen benim cevabım hem C++ 11 ve C + + 98/03 için basit bir satır yolu olduğunu fark edeceksiniz. – Flexo

+0

Evet, haklısın - kötüyüm. C++ 11/tr1 bağını hesaba katmadım (ilk başta tüm postanızı okumalıydım). – gal

İlgili konular