CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] map et unordered_map

Emirbou
Emirbou
Niveau 10
10 février 2017 à 19:22:43

Y'a un cours français ou anglais sur les map ? je comprends très bien le concept et tout mais je ne sais pas du tout comment le manipuler en c++, particulièrement la fonction de recherche (map.find) je ne comprends pas comment je dois l'utiliser, et puis l'opérateur -> , c'est quoi ?
J'ai essayé de voir http://www.cplusplus.com mais je capte rien :hap:
Merci

godrik
godrik
Niveau 30
10 février 2017 à 22:28:53

bah map::find te retourne un iterateur sur une paire (key, value).
l'operateur left->right est la meme chose (semantiquement) que (*left).right

Emirbou
Emirbou
Niveau 10
11 février 2017 à 19:52:35

Si la paire n'y est pas? in retourne nullptr ?
et ça veut dire quoi (*left).right ?

godrik
godrik
Niveau 30
11 février 2017 à 20:06:28

Tu as lu la doc de find ? http://en.cppreference.com/w/cpp/container/map/find

map::find retourne map::end() si la cle n'est pas trouve.

Si tu as un pointeur "foo* ptr;", alors "ptr->func();" est la meme chose que "(*ptr).func()".
Note que par la magie de la redefinition d'operateur, c'est aussi vrai sur des objets qui sont semantiquement equivalent a des pointeurs (comme les iterateurs par exemple)

Emirbou
Emirbou
Niveau 10
11 février 2017 à 20:47:06

J'avais lu mais rien compris, là c'est clair, merci.
C'est quoi une équivalence sémantique ?
Les .first et .second sont prédéfinies pour les maps ?
C'est quoi le type "auto" ?
Je ne comprends pas le dernier exemple, pourquoi il renvoie 0 alors que le couple ("z",0) a été crée implicitement ? je veux dire, 0 est la valeur par défaut de tous les types ?

godrik
godrik
Niveau 30
11 février 2017 à 21:49:46

Oh, tu commences le C++. Ca explique les questions. Je te conseilles de lire un cours de c++ en entier pour avoir une idee des fonctionnalites de C++.

C'est quoi une équivalence sémantique ?

En C++, tu peux redefinir pour les objets ce que les differents operateurs font. Du coup, tu peux avoir ta propre definition de + pour type en particulier. De la meme facon tu peux redefinit l'indirection *, ou l'egalite ==. Ca permet d'avoir un type qui se comporte comme un pointeur. C'est ce que la fonction map::find retourne, elle retourne un iterateur, qui se comporte comme un pointeur.

Les .first et .second sont prédéfinies pour les maps ?

map::find retourne un iterateur sur une paire <Key,Value> C'est pour ca que tu peux faire .first et .second, c'est parceque la paire (std::pair) definit .first et .second.

C'est quoi le type "auto" ?

C'est une nouveaute de C++11. Ca permet d'ecrire

auto foo = bar;

et la variable foo sera declare comme ayant le meme type que bar. Ainsi, tu peux ecrire du code sans forcement avoir a t'inquieter du type exacte de ce que tu recois. Dans l'exemple de find par exemple, le type de it est probablement qqch du genre std::map<std::string,int>::iterator. Utiliser auto te permet de ne pas a taper tout ca. (Et c'est aussi utile quand tu fais du code template, mais pas la peine de t'embrouiller plus.)

Je ne comprends pas le dernier exemple, pourquoi il renvoie 0 alors que le couple ("z",0) a été crée implicitement ? je veux dire, 0 est la valeur par défaut de tous les types ?

Dans map, il y a une difference entre faire un find et utiliser l'operateur []. find retourne un iterateur sur la paire qui va bien. Alors que [] renvoie directement la valeur associe a la cle. Si la cle n'existe pas, elle est cree avec la valeur par defaut du type value. Pour les type primaire ca va etre 0. Mais pour d'autre type, ca sera ce qui est fournit par le constructeur par defaut.

Emirbou
Emirbou
Niveau 10
11 février 2017 à 22:36:47

Je bosse principalement sur France-IOI et je fais certains contests en ligne ( Codechef, Codeforces, Hackerrank...) parce que je suis plutôt dans le competitive programming, donc mon apprentissage se fait un peu via une vulgarisation orientée vers ce dont j'ai besoin pour résoudre tel ou tel problème ( Surtout les problèmes des IOI puisque c'est mon objectif pour le moment)
Et puis je savais qu'on pouvait changer la "signification" des opérateurs pour les structures, mais de là à tout changer, je savais pas...
Du coup j'imagine pour les map de map (s'il y'en a ?) ça ferait *(*key.first).first ?
Je savais pas non plus pour le auto... bien pratique ce C++
L'itérateur de .find, il 'pointe' bien l'ensemble (key,value), non ? Dans ce cas map[key] reviendrait à faire map.find(key)->second ? c'est ça ? et du coup est ce que .find ET l'opérateur [] créent la 'case' si elle n'existe pas ?

godrik
godrik
Niveau 30
11 février 2017 à 22:55:25

Je bosse principalement sur France-IOI et je fais certains contests en ligne ( Codechef, Codeforces, Hackerrank...) parce que je suis plutôt dans le competitive programming, donc mon apprentissage se fait un peu via une vulgarisation orientée vers ce dont j'ai besoin pour résoudre tel ou tel problème ( Surtout les problèmes des IOI puisque c'est mon objectif pour le moment)

C'est cool une approche pratique. Mais il y a un moment ou lire le livre, ou le cours devient utile.

Du coup j'imagine pour les map de map (s'il y'en a ?) ça ferait *(*key.first).first ?

bah rien ne t'empeche d'utiliser une map comme cle d'une map. (c'est un peu bizarre, mais pourquoi pas). La syntaxe exacte dependra de ce que tu cherches a faire

L'itérateur de .find, il 'pointe' bien l'ensemble (key,value), non ? Dans ce cas map[key] reviendrait à faire map.find(key)->second ? c'est ça ? et du coup est ce que .find ET l'opérateur [] créent la 'case' si elle n'existe pas ?

l'iterateur retourner par find 'pointe' sur une key,value particuliere. si la cle n'est pas trouve find pointe sur map::end().
.find ne cree pas la case si elle n'existe pas.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment