Bonjour,
Avant de poser la question, voici les données (simplifiées) à prendre en compte :
- langage C++, lib stl + boost
<code>
/** un simple client */
class Client
{
public:
// ctors, getters, setters...
private:
long id;
string nom;
string prenom;
}
/** prédicat de recherche dans un find_if, impémenté en template */
class ClientFieldEqualTo
{
public:
/** \param[in] champs : Nom du champs à comparer (ex : Client::ID)
* \param[in] value : Valeur à comparer
*/
ClientFieldEqualTo( long champs, boost::any value ) : champs_( champs ), value_( value ) { }
/** Opérateur de comparaison */
bool operator() ( const boost::shared_ptr<Client> &item ) const
{
// pour résumer :
// ici "item" est un objet Client (boost::shared_ptr, c'est juste pour dire que c'est un pointeur "intelligent")
// pour ce client, on compare le champs donnée au constructeur avec la valeur contenu dans le Client
// return true si c'est =
}
};
</code>
A partir de la, j'ai un vector<Client> dont les Clients sont triés par leur champs "id".
Je peux facilement récupérer un client de cette façon :
<code>
vector<Client> clts = getClients();
vector<Client>::iterator clt1 = find_if ( clts.begin() , clts.end() , ClientFieldEqualTo( Client::NOM, "toto" ) );
vector<Client>::iterator clt2 = find_if ( clts.begin() , clts.end() , ClientFieldEqualTo( Client::ID, 12 ) );
</code>
"clt1" et "clt2" peuvent être égale à clts.end() si le client recherché n'existe pas.
Aucun problème, cela fonctionne.
Mais, la liste des clients peut être longue... (20000 voir plus) et dans un soucis d'optimisation, j'aimerai arreter la recherche lorsqu'on est sûr que ne le trouvera plus...
exemple : ClientFieldEqualTo( Client::ID, 12 )
=> il faut s'arreter des qu'on trouve le client 12
=> ou bien s'il n'existe pas, il faudrait s'arreter dès qu'on arrive au 13ème pour éviter de parcourir les 20000...
Est-ce possible ? Bien sur, à condition de faire une recherche sur l'id et pas le nom...
Merci.
Note : je sais que std::map peut le faire, si on suppose que la clé = Client.id mais apres avoir posé le pour et le contre, je préfère rester sur des vector (notamment à cause de std::sort impossible avec les map : j'ai besoin de trier les clients par nom quelques fois)