[STL] Personnalisation avec find_if
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:
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:
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:
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.