Les vecteurs, les structures et les std::find
De nouveau moi avec des vecteurs. J'espère que je ne suis pas trop gênant. J'ai une structure comme ceci :
struct monster
{
DWORD id;
int x;
int y;
int distance;
int HP;
};
J'ai donc créé un vecteur :
std::vector<monster> monsters;
Mais maintenant je ne sais pas comment faire une recherche par le vecteur. Je veux trouver l'ID du monstre à l'intérieur du vecteur.
DWORD monster = 0xFFFAAA;
it = std::find(bot.monsters.begin(), bot.monsters.end(), currentMonster);
Mais évidemment ça ne fonctionne pas. Je veux effectuer une itération uniquement par le biais de la .id de l'élément de la structure, et je ne sais pas comment faire. L'aide est grandement appréciée. Merci !
- La grande question, exactement ce dont j'avais besoin. Pas gênant du tout:)
Vous devez vous connecter pour publier un commentaire.
std::find_if
:Ou écrire votre propre fonction de l'objet si vous n'avez pas de coup de pouce. Devrait ressembler à ceci
{int, int}
, pourrais-je le jeter auxlong
et l'utilisation normal de la trouver alors?decltype
.bot
devrait être une structure contenant les éléments suivants vecteur de structures:std::vector<monster> monsters;
comment sur:
[&cm = currentMonster]
lie la variablecurrentMonster
de l'appel de la portée d'un local de référence dans le lambda, appelécm
. Puis(const monster& m) -> bool
définit la signature de la lambda, en prenant un paramètre d'entrée,m
, et le retourbool
. Le corps de la fonction lambda est{ return cm == m; }
, qui renvoie true sicm
etm
sont considérées comme égales.{ return cm == m; }
à la fin nécessite unoperator==
définis dans la structure (voir @dirkgently de réponse), Sans leoperator==
, modifiez l'instruction de retour à{ return cm.id == m.id; }
Vous devez écrire votre propre recherche de prédicat:
std::find_if
au lieu destd::find
.Prendre un coup d'oeil à la
std::find
modèle, le troisième paramètre en particulier:Qu'est-ce que ce EqualityComparable? Nouveau à partir de la documentation:
Maintenant, votre type de monstre a besoin de définir un tel opérateur. Si vous n'avez pas le compilateur génère un pour vous (en tant que par défaut également ctor et la dtor) qui fait un
memcmp
genre de chose qui ne fonctionne pas dans votre cas. Donc, pour utiliserstd::find
d'abord définir un comparateur de fonction/foncteur que l'algorithme peut utiliser pour correspondre à votrecurrentMonster
c'est à dire quelque chose le long des lignes de:bool operator==(const monster& r) const { return id == r.id; }
ou mettre les monstres dans une carte au lieu d'un vecteur
ou si elles doivent l'être dans un vecteur de créer une carte d'indice de ie de la carte d'identité de vecteur d'index
C'est un exemple complet basé sur la réponse de Johannes Schaub (boost version).
Vous pouvez écrire une fonction comme ci-dessous:
Il retourne un pointeur vers la stockées nœud s'il est trouvé dans le vecteur, sinon renvoie la valeur NULL.
Veuillez noter que
return it;
ne fonctionne pas directement.