Ahm*_*med 30 c++ vector find data-structures
再次我与矢量.我希望我不会太讨厌.我有这样的结构:
struct monster
{
DWORD id;
int x;
int y;
int distance;
int HP;
};
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个矢量:
std::vector<monster> monsters;
Run Code Online (Sandbox Code Playgroud)
但现在我不知道如何搜索向量.我想在矢量中找到怪物的ID.
DWORD monster = 0xFFFAAA;
it = std::find(bot.monsters.begin(), bot.monsters.end(), currentMonster);
Run Code Online (Sandbox Code Playgroud)
但显然它不起作用.我想只通过结构的.id元素进行迭代,我不知道该怎么做.非常感谢帮助.谢谢 !
Joh*_*itb 36
it = std::find_if(bot.monsters.begin(), bot.monsters.end(),
boost::bind(&monster::id, _1) == currentMonster);
Run Code Online (Sandbox Code Playgroud)
或者,如果没有提升,请编写自己的函数对象.看起来像这样
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));
Run Code Online (Sandbox Code Playgroud)
Evg*_*zin 15
您需要编写自己的搜索谓词:
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));
Run Code Online (Sandbox Code Playgroud)
小智 15
怎么样:
std::find_if(monsters.begin(),
monsters.end(),
[&cm = currentMonster]
(const monster& m) -> bool { return cm == m; });
Run Code Online (Sandbox Code Playgroud)
看看std::find模板,特别是第三个参数:
template<class InputIterator, class EqualityComparable>
InputIterator find(InputIterator first, InputIterator last,
const EqualityComparable& value);
Run Code Online (Sandbox Code Playgroud)
什么是EqualityComparable?再次来自文档:
A type is EqualityComparable if objects of that type can be
compared for equality using operator==, and if operator== is
an equivalence relation.
Run Code Online (Sandbox Code Playgroud)
现在,您的类型怪物需要定义这样的运算符.如果你不这样做,编译器会为你生成一个(也可以是默认的ctor和dtor),memcmp它会做一些在你的情况下不起作用的东西.因此,首先使用std::find定义一个比较器函数/仿函数,该算法可以用来匹配你的currentMonsterie,即:
struct monster {
// members
bool operator==(const monster& l, const monster& r) const
{
return l.id == r.id;
}
};
Run Code Online (Sandbox Code Playgroud)