STL <list>搜索列表以查找项目属性</list>

时间:2011-03-29 17:38:18

标签: c++ list stl

我对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 个答案:

答案 0 :(得分:7)

你是混淆元素和迭代器。迭代器是列表中位置的占位符,它们本身不是元素。要获取元素,您需要取消引用迭代器:

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

此外,由于您的NULL类无法取值Monster(这是一个指针),因此无法返回NULL。你可以做的是返回迭代器而不是项本​​身。然后,您的函数与<algorithm>标准标题中的std::find函数几乎完全相同。

答案 1 :(得分:3)

// 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 ) );

如果您的编译器支持lambda(c ++ 0x):

std::find_if( Monsters.begin(), Monsters.end(), [=x]( Monster const & m ) { return m.X == x; } );

答案 2 :(得分:1)

如果你想经常这样做(比如,除非只是为了调试或类似的东西),列表可能不是这项工作的最佳选择。仅举一个明显的选择,std::set直接支持这样的搜索。在一个集合中,搜索通常也会快得多(对数而不是线性复杂度)。