向量,结构和std :: find

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

std::find_if:

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)

  • bot.monsters.begin()中"bot"的含义是什么? (2认同)
  • 如果"它"是什么数据类型? (2认同)

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)

  • 此示例使用lambda函数,该函数依赖于C++ 11.`[&cm = currentMonster]`将变量`currentMonster`从调用范围绑定到lambda中的本地引用,称为`cm`.然后`(const monster&m) - > bool`定义lambda的签名,取一个输入参数`m`,然后返回`bool`.lambda函数的主体是`{return cm == m; 如果`cm`和`m`比较相等,则返回true. (5认同)
  • 看到这个的人可以带我了解它在做什么吗?特别是 [&amp;cm = currentMonster](const Monster&amp; m) -&gt; bool { return cm == m; }); (2认同)

dir*_*tly 9

看看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)

  • 这有用吗?我没有成功,因为结构中的运算符定义只能有1个输入 (6认同)
  • 这个概念是正确的。这对我有用:`bool operator ==((const monster&r)const {return id == r.id; }` (2认同)