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 :
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 ;
    }
}
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".
J'ai donc essayé de faire une classe et de bidouiller en utilisant l'opérateur () :
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()
        {
        }
où account est une classe avec dans ses membres string username

et j'appelle l'algorithme find_if comme ce qui suit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
vector<account>::iterator compte = find_if(comptes.begin(), comptes.end(), account_finder(nom_utilisateur));
où comptes est mon vecteur : vector<account>

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.