向量,结构和std :: find

时间:2009-02-26 10:34:09

标签: c++ data-structures find vector

我再次向量。我希望我不会太讨厌。我有这样的结构:

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元素进行迭代,我不知道该怎么做。非常感谢帮助。谢谢!

7 个答案:

答案 0 :(得分:35)

std::find_if

it = std::find_if(bot.monsters.begin(), bot.monsters.end(), 
        boost::bind(&monster::id, _1) == currentMonster);

如果没有提升,请编写自己的函数对象。看起来像这样

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

答案 1 :(得分:16)

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

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

答案 2 :(得分:12)

怎么样:

std::find_if(monsters.begin(), 
             monsters.end(), 
             [&cm = currentMonster]
             (const monster& m) -> bool { return cm == m; }); 

答案 3 :(得分:7)

查看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;
  }
 };

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

这是一个完整的样本,基于Johannes Schaub(升级版)的答案。

#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;
}

答案 6 :(得分: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;无法直接使用。