OVH Cloud OVH Cloud

recherche rapide d'identifiant ?

15 réponses
Avatar
MGN
Bonne année et meilleurs voeux à tous.
Ma question : comment faites-vous pour déterminer rapidement si un
identifiant (type int par exemple) fait partie d'un ensemble donné ?
Pour ma part, je fais une map X static du type map<int,bool> et j'enregistre
dedans les id.
Ensuite je fais juste un X.find(id)!=X.end() pour savoir si un id fait
partie de l'ensemble défini.
Mais les bool sont parfaitement inutiles...
Y-a-t-il (sûrement) une meilleure solution ?
Merci à vous.

5 réponses

1 2
Avatar
Michael Doubez
On 4 jan, 22:17, "MGN" wrote:
[snip]
la performance est importante dans mon cas, c'est pourquoi je me disais
qu'une recherche dans un conteneur ordonn (comme un set) serait plus rapi de
Peut- tre que le mieux est que je teste tout a :-)



Il y a aussi le unordered_set (aka hash_set) qui te donnerait un test
en temps constant.

Tout dépend en fait du nombre d'entier possible et leur répartition.

--
Michael
Avatar
Mickaël Wolff
Michael Doubez a écrit :

Mais pour un cas comme ici, il peut être utile.



Bon, désolé les gars, j'ai jeté le bébé avec l'eau du bain :D

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Mickaël Wolff
MGN a écrit :

la performance est importante dans mon cas, c'est pourquoi je me disais
qu'une recherche dans un conteneur ordonné (comme un set) serait plus
rapide
Peut-être que le mieux est que je teste tout ça :-)
Merci de ta réponse



En fait, ce que je ne comprenais pas, c'était pourquoi tu voulais
absolument avoir une clé pour accéder à l'entier. Mais si std::set
convient mieux que std::vector, alors je ne vois pas le problème. Comme
dis, c'était juste pour proposer quelque chose de plus basique que ce à
quoi tu pensais (pour une fois que je pense simple, j'en profite).

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Fabien LE LEZ
On Mon, 04 Jan 2010 20:58:33 +0100, Mickaël Wolff
:

Tu devrais rester simple.



Toi aussi :

// On pourrait généraliser
bool is_in(std::vector<int> const & container, int presumed)
{
return identifiers.end() != std::find_if(identifiers.begin(),
identifiers.end(), std::bind2nd(std::equal<int>(), presumed)) ;



return identifiers.end() !=
std::find (identifiers.begin(), identifiers.end(), presumed);
Avatar
Mickaël Wolff
Fabien LE LEZ a écrit :
On Mon, 04 Jan 2010 20:58:33 +0100, Mickaël Wolff
:

Tu devrais rester simple.



Toi aussi :



Certes :D

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
1 2