C++ 向量、结构和std::find
再一次告诉我向量。我希望我不是太烦人。我有一个这样的结构:C++ 向量、结构和std::find,c++,data-structures,find,vector,C++,Data Structures,Find,Vector,再一次告诉我向量。我希望我不是太烦人。我有一个这样的结构: struct monster { DWORD id; int x; int y; int distance; int HP; }; 所以我创建了一个向量: std::vector<monster> monsters; 但很明显,它不起作用。我只想遍历struct的.id元素,我不知道怎么做。非常感谢您的帮助。谢谢 您需要编写自己的搜索谓词: struct find_monster
struct monster
{
DWORD id;
int x;
int y;
int distance;
int HP;
};
所以我创建了一个向量:
std::vector<monster> monsters;
但很明显,它不起作用。我只想遍历struct的.id元素,我不知道怎么做。非常感谢您的帮助。谢谢 您需要编写自己的搜索谓词:
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));
您需要编写自己的搜索谓词:
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));
:
如果没有boost,也可以编写自己的函数对象。看起来像这样
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));
struct find\u id:std::一元函数{
德沃德id;
find_id(DWORD id):id(id){
布尔运算符()(怪物常量&m)常量{
返回m.id==id;
}
};
it=std::find_if(bot.monsters.begin(),bot.monsters.end(),
查找_id(currentMonster));
:
如果没有boost,也可以编写自己的函数对象。看起来像这样
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));
struct find\u id:std::一元函数{
德沃德id;
find_id(DWORD id):id(id){
布尔运算符()(怪物常量&m)常量{
返回m.id==id;
}
};
it=std::find_if(bot.monsters.begin(),bot.monsters.end(),
查找_id(currentMonster));
查看std::find
模板,尤其是第三个参数:
template<class InputIterator, class EqualityComparable>
InputIterator find(InputIterator first, InputIterator last,
const EqualityComparable& value);
现在,您的类型monster需要定义这样一个操作符。如果没有,编译器会为您生成一个(以及默认的ctor和dtor),它会执行memcmp
之类的操作,在您的情况下不起作用。因此,要使用std::find
首先定义一个比较器函数/函子,该算法可用于匹配您的currentMonster
,即:
struct monster {
// members
bool operator==(const monster& l, const monster& r) const
{
return l.id == r.id;
}
};
查看
std::find
模板,第三个参数尤其是:
template<class InputIterator, class EqualityComparable>
InputIterator find(InputIterator first, InputIterator last,
const EqualityComparable& value);
现在,您的类型monster需要定义这样一个操作符。如果没有,编译器会为您生成一个(以及默认的ctor和dtor),它会执行memcmp
之类的操作,在您的情况下不起作用。因此,要使用std::find
首先定义一个比较器函数/函子,该算法可用于匹配您的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; });
那么:
std::find_if(monsters.begin(),
monsters.end(),
[&cm = currentMonster]
(const monster& m) -> bool { return cm == m; });
或者把怪物放在地图上而不是矢量上
或者,如果它们必须在向量中,则创建索引地图,即ID到向量索引的地图,或者将怪物放在地图中而不是向量中
或者,如果它们必须在向量中,则创建一个索引映射,即ID到向量索引的映射,这是一个基于Johannes Schaub(增强版)答案的完整示例
#包括
#包括
结构怪物
{
德沃德id;
int x;
int-y;
整数距离;
int-HP;
};
int main()
{
病媒怪物;
怪物新怪物;
newMonster.id=1;
newMonster.x=10;
怪物。推回(新怪物);
newMonster.id=2;
newMonster.x=20;
怪物。推回(新怪物);
newMonster.id=2;
newMonster.x=30;
怪物。推回(新怪物);
DWORD-monsterId=2;
std::vector::迭代器it=std::find_if(monsters.begin(),monsters.end(),
boost::bind(&monster::id,_1)==monsterId);
返回0;
}
这是一个基于Johannes Schaub(增强版)答案的完整示例
#包括
#包括
结构怪物
{
德沃德id;
int x;
int-y;
整数距离;
int-HP;
};
int main()
{
病媒怪物;
怪物新怪物;
newMonster.id=1;
newMonster.x=10;
怪物。推回(新怪物);
newMonster.id=2;
newMonster.x=20;
怪物。推回(新怪物);
newMonster.id=2;
newMonster.x=30;
怪物。推回(新怪物);
DWORD-monsterId=2;
std::vector::迭代器it=std::find_if(monsters.begin(),monsters.end(),
boost::bind(&monster::id,_1)==monsterId);
返回0;
}
您可以编写如下函数:
monster* findMonster(DWORD currentMonster) {
for (auto it = bot.monsters.begin(); it != bot.monsters.end(); it++) {
if (it->id == currentMonster) {
return &(*it);
}
}
return NULL;
}
如果在向量中找到存储节点,则返回指向该节点的指针,否则返回NULL
请注意
返回代码>无法直接工作。您可以编写如下函数:
monster* findMonster(DWORD currentMonster) {
for (auto it = bot.monsters.begin(); it != bot.monsters.end(); it++) {
if (it->id == currentMonster) {
return &(*it);
}
}
return NULL;
}
如果在向量中找到存储节点,则返回指向该节点的指针,否则返回NULL
请注意返回代码>无法直接工作。回答得不错,但构造函数中有一个输入错误。应该是“:”不是“;”除了编写自己的搜索谓词外,还需要使用std::find_if
而不是std::find
。答案不错,但构造函数中有一个输入错误。应该是“:”不是“;”除了编写自己的搜索谓词外,还需要使用std::find_if
而不是std::find
。这样做有效吗?我没有成功,因为结构中的运算符定义只能有1个Input,这与Snoozer的问题相同-请填写答案。概念正确。这对我来说很有效:bool操作符==(const monster&r)const{return id==r.id;}
这有效吗?我没有成功,因为结构中的运算符定义只能有1个Input,这与Snoozer的问题相同-请填写答案。概念正确。这对我很有用:bool操作符==(const monster&r)const{return id==r.id;}
使用boost,完美!bot.monsters.begin()中“bot”的含义是什么?如果是“it”,则数据类型是什么?幸好您给出了一个没有boost的示例-我们从未在嵌入式系统中使用boost,它是巨大的。我只是不明白为什么你从std::一元函数继承了函子对象-看起来它会以任何方式工作,不是吗?感谢您的回答。@Hiyper-类型应该是std::vector::iterator。或者,如果。。。如果您使用的是c++11和boost,那就太完美了!bot.monsters.begin()中“bot”的含义是什么?如果是“it”,则数据类型是什么?幸好您给出了一个示例