Vetores, structs e std :: find

Mais uma vez eu com vetores. Espero não ser muito chato. Eu tenho uma estrutura como esta:

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

Então eu criei um vetor:

 std::vector monsters; 

Mas agora eu não sei procurar pelo vetor. Eu quero encontrar uma identificação do monstro dentro do vetor.

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

Mas obviamente não funciona. Eu quero iterar apenas através do elemento .id da estrutura e não sei como fazer isso. Ajuda é muito apreciada. Obrigado !

    std::find_if :

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

    Ou escreva seu próprio object de function se você não tiver impulso. Ficaria assim

     struct find_id : std::unary_function { 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)); 

    Você precisa escrever seu próprio predicado de pesquisa:

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

    e quanto a:

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

    Dê uma olhada no template std::find , o terceiro parâmetro especialmente:

     template InputIterator find(InputIterator first, InputIterator last, const EqualityComparable& value); 

    O que é isso EqualityComparable? Novamente a partir da documentação:

     A type is EqualityComparable if objects of that type can be compared for equality using operator==, and if operator== is an equivalence relation. 

    Agora, seu tipo monstro precisa definir tal operador. Se você não o compilador gera um para você (como também o ctor padrão eo dtor) que faz um tipo de coisa memcmp que não funciona no seu caso. Então, para usar std::find primeiro defina uma function comparador / functor que o algoritmo pode usar para corresponder ao seu currentMonster ou seja, algo ao longo das linhas de:

      struct monster { // members bool operator==(const monster& l, const monster& r) const { return l.id == r.id; } }; 

    ou colocar os monstros em um mapa em vez de um vetor

    ou se eles devem estar em um vetor criar um mapa de índice ou seja, mapa de ID para indexar vetor

    Este é um exemplo completo baseado na resposta de Johannes Schaub (versão boost).

     #include  #include  struct monster { DWORD id; int x; int y; int distance; int HP; }; int main () { std::vector 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; }