再次我与矢量.我希望我不会太讨厌.我有这样的结构:
struct monster { DWORD id; int x; int y; int distance; int HP; };
所以我创建了一个矢量:
std::vectormonsters;
但现在我不知道如何搜索向量.我想在矢量中找到怪物的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{ 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));
您需要编写自己的搜索谓词:
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_if(monsters.begin(), monsters.end(), [&cm = currentMonster] (const monster& m) -> bool { return cm == m; });
看看std::find
模板,特别是第三个参数:
templateInputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value);
什么是EqualityComparable?再次来自文档:
A type is EqualityComparable if objects of that type can be compared for equality using operator==, and if operator== is an equivalence relation.
现在,您的类型怪物需要定义这样的运算符.如果你不这样做,编译器会为你生成一个(也可以是默认的ctor和dtor),memcmp
它会做一些在你的情况下不起作用的东西.因此,首先使用std::find
定义一个比较器函数/仿函数,该算法可以用来匹配你的currentMonster
ie,即:
struct monster { // members bool operator==(const monster& l, const monster& r) const { return l.id == r.id; } };