37

又是我的向量。我希望我不会太烦人。我有一个这样的结构:

struct monster 
{
    DWORD id;
    int x;
    int y;
    int distance;
    int HP;
};

所以我创建了一个向量:

std::vector<monster> monsters;

但是现在我不知道如何通过向量进行搜索。我想在向量中找到怪物的 ID。

DWORD monster = 0xFFFAAA;
it = std::find(bot.monsters.begin(), bot.monsters.end(), currentMonster);

但显然它不起作用。我只想遍历结构的 .id 元素,但我不知道该怎么做。非常感谢您的帮助。谢谢 !

4

7 回答 7

40

std::find_if

it = std::find_if(bot.monsters.begin(), bot.monsters.end(), 
        boost::bind(&monster::id, _1) == 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));
于 2009-02-26T10:41:54.927 回答
23

怎么样:

std::find_if(monsters.begin(), 
             monsters.end(), 
             [&cm = currentMonster]
             (const monster& m) -> bool { return cm == m; }); 
于 2010-01-08T22:03:09.287 回答
20

您需要编写自己的搜索谓词:

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));
于 2009-02-26T10:40:38.877 回答
9

看一下std::find模板,特别是第三个参数:

template<class InputIterator, class EqualityComparable>
InputIterator 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的内容,例如:

 struct monster {
  // members
  bool operator==(const monster& l, const monster& r) const
  {
     return l.id == r.id;
  }
 };
于 2009-02-26T10:43:35.547 回答
1

或将怪物放在地图而不是矢量中

或者如果它们必须在向量中,则创建索引映射,即 ID 映射到向量索引

于 2010-01-08T22:07:35.207 回答
0

这是一个基于 Johannes Schaub (boost version) 答案的完整示例。

#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;
}
于 2016-01-07T10:53:24.890 回答
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。

请注意,这return it;不会直接工作。

于 2019-09-18T08:07:09.130 回答