begin process at 2010 02 10 13:17:46
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C++ & C++ .NET

 > 

Divers

 > 

Général

 > 

Arreter une recherche std::find_if dans un vector ordonné


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Arreter une recherche std::find_if dans un vector ordonné

mercredi 1 octobre 2008 à 11:26:54 | Arreter une recherche std::find_if dans un vector ordonné

bigzooloo

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)




Cette discussion est classée dans : champs, client, id, vector, clts


Répondre à ce message

Sujets en rapport avec ce message

je n'arrive pas a appeler cette fonction [ par nidhaletec ] std::vector getWayCoords(int id) const;/**     * Return a vector of the coordinates of all the points making up a way,     * in lon-lat order.     * @ Problem avec les #DEFINE avec winapi en c [ par dyroj ] Bonjour a tous,je suis en train de créer un programme et avec une interface graphique (winapi)  créer par les ressource.j'utilise les DEFINE pour iden Comment Creer un client serveur sous wxWindgets ? [ par Vana03 ] Bonjour à tous , je souhaiterai créer un client/serveur afin de pouvoir communiquer entre 2 PC , en codant avec wxWidgets.Le soucis est que je ne sais Probleme a lié un client tcp a mon projet d'envoi d'email.Visual C++6 [ par punxattitud ] Bonjour a tous ,Actuellement étudiant en BTS Informatique,j'aimerais solliciter votre aide concernant un code source que je n'arrive pas a lier avec u des questions divers autour du remplissage des enums, des vecteur et des tableau a l'aide des boucles [ par nidhaletec ] //pour enum nodes ;                cout id())je cherche a obtenir en utilisant une boucle qui contient cette cout  quelque chose comme ca :enum nodes Threads & Sockets appliqués au jeu [ par LA_Tupac ] Salut à tous les progueurs !!J'ouvre ce post pour receuillir des infos sur les techniques de prog reseau sous les jeux videos.Je bosse actuellement su programmation reseau sous c++ builder 6 rpc [ par BCK2M ] Salut.Bon je tante de realiser un projet "application de gestion d'un cyber café" comme easycafé par exemple . j'ai pus créer l'application serveur ai MFC client serveur CAsyncSocket [ par wildcat010 ] Bonjour à tous ! Voici mon problème, je développe un programme qui à pour but de gérer la communication entre un serveur est plusieurs clients, mais l corba c++ java [ par asari29 ] Bonjour à tous, je développe un logiciel avec une archi client/serveur. J'utilise corba pour la com. En fait j'ai une IHM en java et un serveur en C++ Banque en C++ [ par IndianMJL ] Bonjour,J'ai un TP à réaliser en C++.Voila le sujet : Rappel du sujet Il s'agit de simuler le fonctionnement d'une banque contenant un nombre fixé de


Nos sponsors


Sondage...

Comparez les prix


HTC Magic

Entre 429€ et 429€

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,530 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales