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”,则数据类型是什么?幸好您给出了一个示例