2009-04-05 16 views
7

To pytanie jest kwestią stylu, ponieważ zawsze możesz napisać pętlę for lub coś podobnego; jednak czy mniej nieprzyjemny STL lub BOOST jest równoważny z pisaniem:Funkcja członka wywołania dla każdego elementu w pojemniku

for (container<type>::iterator iter = cointainer.begin(); 
    iter != cointainer.end(); 
    iter++) 
iter->func(); 

?

Coś (wyobrazić) to:

call_for_each(container.begin(), container.end(), &Type::func); 

myślę byłoby 1) mniej pisania, 2) łatwiej czytać, 3) pomniejszone o zmiany, jeśli zdecydowałeś się zmienić typ bazowy/typ kontenera.

EDIT: Dziękuję za pomoc, a teraz, co jeśli chciałbym przekazać kilka argumentów do funkcji członka?

Odpowiedz

4

okazało się, że doładowania wiążą wydaje się być dobrze nadaje się do tego zadania, plus można przekazać dodatkowe argumenty do metody:

#include <iostream> 
#include <functional> 
#include <boost/bind.hpp> 
#include <vector> 
#include <algorithm> 

struct Foo { 
    Foo(int value) : value_(value) { 
    } 

    void func(int value) { 
     std::cout << "member = " << value_ << " argument = " << value << std::endl; 
    } 

private: 
    int value_; 
}; 

int main() { 
    std::vector<Foo> foo_vector; 

    for (int i = 0; i < 5; i++) 
     foo_vector.push_back(Foo(i)); 

    std::for_each(foo_vector.begin(), foo_vector.end(), 
     boost::bind(&Foo::func, _1, 1)); 
} 
+0

+1, ponieważ pokonałeś mnie 5 minut za pomocą tej odpowiedzi bind: p (oh, std :: mem_fun_ref to bzdura podczas używania ze związanymi argumentami!) –

+0

+1, za to, że nie wyobrażamy sobie tego samodzielnie i za pomocą Boost. Twoje zdrowie! – dirkgently

+0

co mam na myśli, gdy masz odniesienia do odniesienia, gdy masz funkcję członka ma parametr odniesienia. boost :: bind rozwiązuje to tak ładnie :) –

22
#include <algorithm> // for_each 
#include <functional> // bind 

// ... 

std::for_each(container.begin(), container.end(), 
        std::bind(&Type::func)); 

Zobacz std::for_each i std::bind dokumentacja dla szczegółów.

Niewykorzystany tej edycji: W każdym razie tu jest inny sposób na osiągnięcie tego, co chcesz bez używania Boost jeśli kiedykolwiek potrzebują być:

std::for_each(foo_vector.begin(), foo_vector.end(), 
    std::bind(&Foo::func, std::placeholders::_1)); 
+0

pokazał mi przez 8 sekund – JaredPar

+0

@ JaredPar/bb : ROFLMAO! – dirkgently

+0

moje 2 centy za twoją szybkość :) –

5

Można użyć std::for_each lub boost's foreach constructs.

Użyj BOOST_FOREACH lub BOOST_REVERSE_FOREACH boost, jeśli nie chcesz przenieść logiki do innej funkcji.

+1

+1. BOOST_FOREACH (type & t, container) t.func(); wygląda całkiem nieźle –

0

Jeśli rzeczywiście chcesz poprawić wydajność, a nie tylko dodać do kodu, naprawdę potrzebujesz funkcji mapy. Eric Sink napisał .net implementation

+0

Dzięki, szukam generycznego rozwiązania C++ (niezależnego od platformy). – kyku

Powiązane problemy