我对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;
}
答案 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
直接支持这样的搜索。在一个集合中,搜索通常也会快得多(对数而不是线性复杂度)。