Rechercher un élément struct dans un vecteur par les données de membre
Je suis très novice en c++ et j'essaie de trouver une façon de chercher un vecteur de structures pour une structure avec un certain membre des données.
Je sais que ce serait de travailler avec les types simples dans le vecteur
std::find(vector.begin(), vector.end(), item) != vector.end()
Mais disons que j'ai une structure comme ceci:
struct Friend
{
string name;
string number;
string ID;
};
et d'un vecteur comme ceci:
vector<Friend> friends;
Alors le vecteur est rempli avec des amis.
Disons que je recherche pour un ami avec une certaine ID, et le cout de détails. Ou supprimer certaines struct partir du vecteur. Est-il un moyen simple de faire cela?
source d'informationauteur Christoffer
Vous devez vous connecter pour publier un commentaire.
Cela peut être fait avec
std::find_if
et une recherche de prédicat, qui peut être exprimé comme une fonction lambda si vous avez le C++11 (ou C++0x) disponible:Utiliser un ID donné comme une variable, vous devez capture dans l'expression lambda (dans le
[...]
):Si vous n'avez pas de C++11 disponible, vous devez définir le prédicat comme un foncteur (fonction de l'objet). Remy Lebeau la réponse de utilise cette approche.
Pour supprimer les éléments correspondant aux critères définis par le prédicat, l'utilisation
remove_if
au lieu defind_if
(le reste de la syntaxe est la même).Pour plus d'algorithmes, voir la STL
<algorithm>
de référence.Utilisation
std::find_if()
. @leemes et @AndyProwl vous a montré comment l'utiliser en C++11 compilateur. Mais si vous n'êtes pas à l'aide d'un compilateur C++11, alors vous pouvez l'utiliser comme ceci au lieu de cela, ce qui définit un foncteur de comparer l'ID d'un élément donné préalablement ID spécifié dans son constructeur:Si vous avez d'autres classes de votre projet qui utilisent des Identifiants, vous pouvez faire ce foncteur basé sur un modèle:
Vous pouvez utiliser
std::find_if
en combinaison avec des foncteurs (si vous travaillez avec C++98) ou lambdas (si vous êtes à l'aide de C++11, je suppose):Si vous voulez trouver un élément dans le conteneur STL, utilisez std::find ou std::find_if algorithmes
Avec C++03, vous avez besoin de la surcharge de l'opérateur== pour le std::find
OU C++11 avec lambda:
Si vous souhaitez supprimer un élément, utilisez std::remove_if