Vectores, estructuras y std :: encontrar

De nuevo conmigo con vectores. Espero no ser tan molesto Tengo una estructura como esta:

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

Así que creé un vector:

 std::vector monsters; 

Pero ahora no sé cómo buscar a través del vector. Quiero encontrar una identificación del monstruo dentro del vector.

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

Pero obviamente no funciona. Quiero iterar solo a través del elemento .id de la estructura, y no sé cómo hacer eso. La ayuda es muy apreciada. Gracias !

std::find_if :

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

O escriba su propio objeto de función si no tiene impulso. Se vería así

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

Necesita escribir su propio predicado de búsqueda:

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

qué tal si:

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

Eche un vistazo a la plantilla std::find , especialmente el tercer parámetro:

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

¿Qué es esta EqualityComparable? Nuevamente desde la documentación:

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

Ahora, tu monstruo tipo necesita definir dicho operador. Si no lo hace, el comstackdor genera uno para usted (como también el ctor predeterminado y el dtor) que hace un tipo de cosa memcmp que no funciona en su caso. Por lo tanto, para usar std::find primero defina una función / functor de comparación que el algoritmo pueda usar para hacer coincidir currentMonster es decir, algo currentMonster :

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

o pon los monstruos en un mapa en lugar de un vector

o si deben estar en un vector crea un mapa de índice, es decir, un mapa de ID a índice vectorial

Esta es una muestra completa basada en la respuesta de Johannes Schaub (versión mejorada).

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