Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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.

10 réponses

1 2
Avatar
MGN
> Y-a-t-il (sûrement) une meilleure solution ?
Merci à vous.


sans doute les std::set ?
Avatar
Michael Doubez
On 1 jan, 13:34, "MGN" wrote:
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'enregis tre
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 ?



Il y a toujours bitset où vector<bool> si le numéro d'identifiant
supérieur est pas trop grand.

--
Michael
Avatar
Stan
On 1 jan, 13:34, "MGN" wrote:
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'enregis tre
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.



Que faites vous de l'identifiant par la suite ?
Si c'est pour accéder à un objet, pourquoi, dans ce cas,
ne pas placer un pointeur de ce dernier dans la map à la place du
bool ?


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

Il y a toujours bitset où vector<bool> si le numéro d'identifiant
supérieur est pas trop grand.



std::vector<bool> n'est pas standard <http://www.gotw.ca/gotw/050.htm>

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Avatar
Mickaël Wolff
MGN a écrit :
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 ?



Tu devrais rester simple.

// 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)) ;

}


int main()
{
std::vector<int> identifiers ;
identifiers.push_back(10) ;
/* some pushes */

if(is_in(identifiers, 10))
/* On a trouvé */ ;
}

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

std::vector<bool> n'est pas standard



Si. Il fonctionne même parfaitement bien.
En revanche, il n'est pas considéré comme un conteneur standard.
Avatar
MGN
> // 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)) ;

}


int main()
{
std::vector<int> identifiers ;
identifiers.push_back(10) ;
/* some pushes */

if(is_in(identifiers, 10))
/* On a trouvé */ ;
}



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
Avatar
MGN
non, je veux juste savoir si un id fait partie d'un ensemble. Il n'y a pas
de problème de pointeur...
Avatar
Fabien LE LEZ
On Mon, 4 Jan 2010 22:17:23 +0100, "MGN" :

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



La recherche dans un std::set<> est effectivement plus rapide. Remplir
ce std::set<> au départ peut, en revanche, prendre un peu de temps.

Mais, plus important, le conteneur "naturel" pour ce que tu veux faire
est bien std::set<>. L'utiliser ne peut qu'améliorer la lisibilité de
ton code.
Avatar
Michael Doubez
On 4 jan, 21:50, Fabien LE LEZ wrote:
On Mon, 04 Jan 2010 20:32:23 +0100, Mickaël Wolff
:

>std::vector<bool> n'est pas standard

Si. Il fonctionne même parfaitement bien.
En revanche, il n'est pas considéré comme un conteneur standard.



C'est un conteneur standard dans le sens ou il est dans le standard (C+
+98): §23.2.5. Autant que je vois, il a la sémantique d'un container
standard, bien que sa représentation interne ne soit pas conforme (et
même dangereuse en multithreadé).

Ce qui pose réellement problème, c'est dans les templates, il faut à
chaque fois le traiter comme un cas particulier parcequ'il retourne un
proxy (comme mentionner dans le lien Gotw).

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

--
Michael
1 2