STL <list>Поиск по списку, чтобы найти свойство объекта - PullRequest
2 голосов
/ 29 марта 2011

Я не очень хорошо понимаю, как работает STL.

Мне удалось создать список и добавить в него элементы.

Но теперь я не могу просмотреть список, чтобы найти элемент с требуемым свойством.

Прости мое невежество по этому поводу. Я очень новичок в STL и до сих пор борюсь с некоторыми элементами C ++.

Вот код. Я знаю, что это приводит к ошибкам, но я хотел бы что-то вроде этого.

Заранее спасибо.

extern list<MonsterClass> Monsters;

MonsterClass FindMonster(int x)
{
     MonsterClass Monster;
     list<MonsterClass>::iterator ListItem;

      for(ListItem = Monsters.begin(); ListItem != Monsters.end(); ++ListItem) 
      {
      if (ListItem.X == x)
         {
           Monster = ListItem;
           return Monster;
         }
      }

   return NULL;
}

Ответы [ 3 ]

7 голосов
/ 29 марта 2011

Вы путаете элементы и итераторы.Итераторы являются заполнителями для позиций в списке, они не являются самими элементами.Чтобы добраться до элемента, вам нужно разыменовать итератор:

if ((*ListItem).X == x) // or, easier: if(ListItem->X == x)
   {
     Monster = *ListItem;
     return Monster;
   }
}

Кроме того, вы не можете вернуть NULL, поскольку ваш класс Monster не может принимать значение NULL (которое является указателем).Что вы можете сделать - это вернуть итератор вместо самого элемента.Тогда ваша функция работает почти так же, как функция std::find из стандартного заголовка <algorithm>.

3 голосов
/ 29 марта 2011
// C++03
struct by_X {
   by_X( int x ) : x(x) {}
   bool operator()( Monster const & m ) const {
      return x == m.X;
   }
   const int x;
};
std::find_if( Monsters.begin(), Monsters.end(), by_X( 5 ) );

Если ваш компилятор поддерживает лямбда (c ++ 0x):

std::find_if( Monsters.begin(), Monsters.end(), [=x]( Monster const & m ) { return m.X == x; } );
1 голос
/ 29 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...