向量,结构和std :: find

再次与我的载体。 我希望我不太烦人。 我有这样的结构:

struct monster { DWORD id; int x; int y; int distance; int HP; }; 

所以我创build了一个向量:

 std::vector<monster> monsters; 

但现在我不知道如何通过vectorsearch。 我想在向量中find怪物的ID。

 DWORD monster = 0xFFFAAA; it = std::find(bot.monsters.begin(), bot.monsters.end(), currentMonster); 

但显然这是行不通的。 我只想通过结构的.id元素进行迭代,我不知道该怎么做。 非常感谢帮助。 谢谢 !

std::find_if

 it = std::find_if(bot.monsters.begin(), bot.monsters.end(), boost::bind(&monster::id, _1) == currentMonster); 

或者如果你没有提升,写你自己的函数对象。 看起来像这样

 struct find_id : std::unary_function<monster, bool> { DWORD id; find_id(DWORD id):id(id) { } bool operator()(monster const& m) const { return m.id == id; } }; it = std::find_if(bot.monsters.begin(), bot.monsters.end(), find_id(currentMonster)); 

你需要编写你自己的search谓词:

 struct find_monster { DWORD id; find_monster(DWORD id) : id(id) {} bool operator () ( const monster& m ) const { return m.id == id; } }; it = std::find_if( monsters.begin(), monsters.end(), find_monster(monsterID)); 

看看std::find模板,特别是第三个参数:

 template<class InputIterator, class EqualityComparable> InputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value); 

什么是平等可比的? 再次从文档:

 A type is EqualityComparable if objects of that type can be compared for equality using operator==, and if operator== is an equivalence relation. 

现在,你的types怪物需要定义这样一个运算符。 如果你没有编译器为你生成一个(也是默认的ctor和dtor),那么memcmp就不会在你的情况下工作。 因此,要使用std::find首先定义一个比较函数/函子,该algorithm可以用来匹配currentMonster即:

  struct monster { // members bool operator==(const monster& l, const monster& r) const { return l.id == r.id; } }; 

怎么样:

 std::find_if(monsters.begin(), monsters.end(), [&cm = currentMonster] (const monster& m) -> bool { return cm == m; }); 

或把怪物放在地图上而不是vector

或者如果它们必须位于向量中,则创build一个索引映射,即将ID映射到向量索引

这是一个基于Johannes Schaub(boost版本)答案的完整样本。

 #include <algorithm> #include <boost/bind.hpp> struct monster { DWORD id; int x; int y; int distance; int HP; }; int main () { std::vector<monster> monsters; monster newMonster; newMonster.id = 1; newMonster.x = 10; monsters.push_back ( newMonster ); newMonster.id = 2; newMonster.x = 20; monsters.push_back ( newMonster ); newMonster.id = 2; newMonster.x = 30; monsters.push_back ( newMonster ); DWORD monsterId = 2; std::vector< monster >::iterator it = std::find_if ( monsters.begin (), monsters.end (), boost::bind ( &monster::id, _1 ) == monsterId ); return 0; }