Как выполнить итерацию через std:: list <MyClass *> и перейти к методам в этом классе из итератора?

Если у меня есть список,

typedef std::list<MyClass *> listMyClass;

Как выполнить итерацию через них и перейти к методам в этом классе?

Это то, что Ive пытался, но это не так: (MyClass:: PrintMeOut() является общедоступным методом)

for(
    listMyClass::iterator listMyClassIter = listMyClass.begin();
    listMyClassIter != listMyClass.end();
    listMyClassIter ++)
{
    listMyClassIter->PrintMeOut();  
}     

Ответ 1

Используйте этот метод:

(*listMyClassIter)->PrintMeOut();

Ответ 2

for_each и указатель функции:

    std::for_each(  listMyClass.begin(),
                    listMyClass.end(),
                    std::mem_fun(&MyClass::PrintMeOut)
                 );

Я предпочитаю использовать конструкцию for_each(), а не писать собственный цикл. Это заставляет его выглядеть аккуратно и делает все, что мне в противном случае понадобится для дополнительного кода.

  • Только вызов end() один раз, а не каждая итерация.
  • Помните, что нужно использовать pre increment, а не post increment.
  • Необходимо разработать фактические типы моих итераторов.
  • Я уверен, что здесь есть больше, но рано утром.

Ответ 3

typedef std::list<MyClass*> listMyClass;
listMyClass instance; // instance, you shouldn't use type in the following loop

for( listMyClass::iterator listMyClassIter = instance.begin(); // not listMyClass.begin()
    listMyClassIter != instance.end(); // not listMyClass.end()
    listMyClassIter ++)
{
    (*listMyClassIter)->PrintMeOut();  
}

Ответ 4

std:: for_each in невероятно хорошо подходит для этого, некоторые компиляторы теперь собирают lambdas из С++ 0x, что делает его еще более интуитивно понятным.

typedef std::list<MyClass*> MyClassList;
MyClassList l;
for_each(l.begin(),l.end(),[](MyClass* cur)
{
   cur->PrintMeOut();
});

for_each (и остальные алгоритмы) помогают скрыть абстракцию между итераторами и типами. Также обратите внимание, что теперь у меня есть эта маленькая крошечная лямбда-функция (или она может быть функтором тоже), которая является более проверяемой, макетируемой, заменяемой и т.д.

Если я вернусь к использованию lambdas, я смогу построить подставку по методу для этого, что можно проверить:

void PrintMyClass(MyClass* cur)
{
    cur->PrintMeOut();
}

и теперь код for_each выглядит следующим образом:

typedef std::list<MyClass*> MyClassList;
MyClassList l;
for_each(l.begin(),l.end(),&PrintMyClass);