向量,结构和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; }