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

または、ブーストがない場合は、独自の関数オブジェクトを作成します。このようになります

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テンプレート、特に 3 番目のパラメーターを見てください。

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 の回答 (ブースト バージョン) に基づく完全なサンプルです。

#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 に答える