Bonjour,
Voila je cherche à utiliser l'algorithme find_if de la STL pour pouvoir rechercher un objet dans un vecteur selon mes propres critères, ce vecteur contenant un type complexe, tandis que pour ma recherche seul un membre est évalué.
J'ai trouvé un exemple sur internet, du style :
Mais mon problème est que le critère de recherche est variable (en fait, je compare un des membres des objets contenus dans le vecteur à une valeur). Pour être plus précis, j'ai une classe account, avec parmis ses membres un "string username". Je veux donc une fonction qui trouve dans le vecteur l'objet account dont le nom d'utilisateur est "jojo" ou encore "lovecpp".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 // returns true if n is an odd number int IsOdd( int n) { return n % 2 ; } void main() { const int ARRAY_SIZE = 8 ; int IntArray[ARRAY_SIZE] = { 1, 2, 3, 4, 4, 5, 6, 7 } ; int *location ; // stores the position of the first // element that is an odd number int i ; // print content of IntArray cout << "IntArray { " ; for(i = 0; i < ARRAY_SIZE; i++) cout << IntArray[i] << ", " ; cout << " }" << endl ; // Find the first element in the range [first, last -1 ] // that is an odd number location = find_if(IntArray, IntArray + ARRAY_SIZE, IsOdd) ; //print the location of the first element // that is an odd number if (location != IntArray + ARRAY_SIZE) // first odd element found cout << "First odd element " << *location << " is at location " << location - IntArray << endl; else // no odd numbers in the range cout << "The sequence does not contain any odd numbers" << endl ; } }
J'ai donc essayé de faire une classe et de bidouiller en utilisant l'opérateur () :
où account est une classe avec dans ses membres string username
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 /** *classe account_finder *classe permettant la recherche d'un compte particulier dans la liste. *Est passée en tant que predicate à l'algorithme find_if */ class account_finder { protected: string nom_recherche; //le nom d'utilisateur à rechercher public: explicit account_finder(const string& nom_recherche); int operator()(const account& autre) const; virtual ~account_finder(); }; account_finder::account_finder(const string& nom_recherche) { this->nom_recherche = nom_recherche; } int account_finder::operator()(const account& autre) const { cout << "account_finder() appele avec " << nom_recherche << " _compare_to_ " << autre.get_username() << endl; return nom_recherche.compare(autre.get_username()); } account_finder::~account_finder() { }
et j'appelle l'algorithme find_if comme ce qui suit :
où comptes est mon vecteur : vector<account>
Code : Sélectionner tout - Visualiser dans une fenêtre à part vector<account>::iterator compte = find_if(comptes.begin(), comptes.end(), account_finder(nom_utilisateur));
Or le cout << "account_finder().." ne s'affiche même pas, et compte prend la valeur comptes.end(). Quand j'affiche la taille du vecteur, elle est bien supérieur à 0...
Je suis obligé d'utiliser une fonction classique ? Ou alors c'est le type du paramètre (const account&) de mon opérateur() qui ne va pas ?
Merci pour vos réponses.
Partager