Insertion d'un entier dans un map

Le
Guillaume
Bonjour à tous,

imaginons que j'ai un std::map<int,int>, et que j'utilise l'operateur
[] pour accéder à un élément inexistant:

std::map<int,int> m;
std::cout << m[0];

Que se passe-t-il alors? Est-on garanti qu'un nouvel entier accédé de
cette manière soit toujours initialisé à 0? Et comment est-ce
possible?

Merci pour vos lumières!
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 2
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Stan
Le #21081211
On 29 jan, 11:28, Guillaume
Bonjour à tous,

imaginons que j'ai un std::map<int,int>, et que j'utilise l'operateur
[] pour accéder à un élément inexistant:

std::map<int,int> m;
std::cout << m[0];

Que se passe-t-il alors? Est-on garanti qu'un nouvel entier accédé de
cette manière soit toujours initialisé à 0? Et comment est-ce
possible?

Merci pour vos lumières!



l'operateur [] renvoie un objet de type T() quand l'élément n'existe
pas
dans la map. C'est le constructeur par défaut qui est appelé.
Donc c'est autant garanti que : int x = int( ); // x=0.

--
-Stan
Guillaume
Le #21081661
On 29 jan, 12:08, Stan
On 29 jan, 11:28, Guillaume
> Bonjour à tous,

> imaginons que j'ai un std::map<int,int>, et que j'utilise l'operateur
> [] pour accéder à un élément inexistant:

> std::map<int,int> m;
> std::cout << m[0];

> Que se passe-t-il alors? Est-on garanti qu'un nouvel entier accédé de
> cette manière soit toujours initialisé à 0? Et comment est-ce
> possible?

> Merci pour vos lumières!

l'operateur [] renvoie un objet de type T() quand l'élément n'existe
pas
dans la map. C'est le constructeur par défaut qui est appelé.
Donc c'est autant garanti que  : int x = int( ); // x=0.

--
-Stan



Je ne savais pas que les types primitifs avaient des constructeurs par
défaut... Même bool?

G.
Stan
Le #21082111
On 29 jan, 13:14, Guillaume
On 29 jan, 12:08, Stan


> On 29 jan, 11:28, Guillaume
> > Bonjour à tous,

> > imaginons que j'ai un std::map<int,int>, et que j'utilise l'operateur
> > [] pour accéder à un élément inexistant:

> > std::map<int,int> m;
> > std::cout << m[0];

> > Que se passe-t-il alors? Est-on garanti qu'un nouvel entier accéd é de
> > cette manière soit toujours initialisé à 0? Et comment est-ce
> > possible?

> > Merci pour vos lumières!

> l'operateur [] renvoie un objet de type T() quand l'élément n'exist e
> pas
> dans la map. C'est le constructeur par défaut qui est appelé.
> Donc c'est autant garanti que : int x = int( ); // x=0.

> --
> -Stan

Je ne savais pas que les types primitifs avaient des constructeurs par
défaut... Même bool?

G.



A strictement parler, le constructeur ne s'applique qu'aux class et
struct;
c'est comme cela que c'est défini dans la norme me semble-t-il.
Mais Stroustrup emploie cette teminogie pour les types built-in.
( cf The C++ Programming Language 3rd § 10.4.2 page 224 ).

Donc idem pour un bool.

--
-Stan
Fabien LE LEZ
Le #21082101
On Fri, 29 Jan 2010 04:14:53 -0800 (PST), Guillaume

Je ne savais pas que les types primitifs avaient des constructeurs par
défaut...



Ce ne sont pas à proprement parler des constructeurs, puisqu'ils ne
sont pas systématiquement appelés.

int() renvoie 0

int x; // valeur indéterminée
Guillaume
Le #21082401
On 29 jan, 14:01, Fabien LE LEZ
On Fri, 29 Jan 2010 04:14:53 -0800 (PST), Guillaume

>Je ne savais pas que les types primitifs avaient des constructeurs par
>défaut...

Ce ne sont pas à proprement parler des constructeurs, puisqu'ils ne
sont pas systématiquement appelés.

int() renvoie 0

int x; // valeur indéterminée



Je suis curieux à propos de cette fonctions int(). S'agit-il d'une
fonction au sens classique du terme? Ou bien a-t-on le droit d'écrire:
int x(); // x = 0
Jean-Marc Bourguet
Le #21082391
Guillaume
int x(); // x = 0



Declaration d'une fonction nommee x retournant un int...

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Alain Ketterlin
Le #21082381
Guillaume
imaginons que j'ai un std::map<int,int>, et que j'utilise l'operateur
[] pour accéder à un élément inexistant:

std::map<int,int> m;
std::cout << m[0];

Que se passe-t-il alors? Est-on garanti qu'un nouvel entier accédà © de
cette manière soit toujours initialisé à 0? Et comment est -ce
possible?



Les autres messages te donnent la réponse. J'ajoute que si tu as une
map<K,V> et que tu utilises [], alors V doit avoir un constructeur par
défaut. Si c'est génant, tu peux utiliser at() au lieu de operato r[].
at() déclenche une exception plutôt que d'insérer en silence lorsque
tu accèdes à un élément inexistant. Je ne sais pas si c 'est standard
(j'espère parce que je n'utilise que ça).

-- Alain.
Jean-Marc Bourguet
Le #21082531
Alain Ketterlin
Guillaume
> imaginons que j'ai un std::map<int,int>, et que j'utilise l'operateur
> [] pour accéder à un élément inexistant:
>
> std::map<int,int> m;
> std::cout << m[0];
>
> Que se passe-t-il alors? Est-on garanti qu'un nouvel entier accédé de
> cette manière soit toujours initialisé à 0? Et comment est-ce
> possible?

Les autres messages te donnent la réponse. J'ajoute que si tu as une
map<K,V> et que tu utilises [], alors V doit avoir un constructeur par
défaut. Si c'est génant, tu peux utiliser at() au lieu de operator[].
at() déclenche une exception plutôt que d'insérer en silence lorsque
tu accèdes à un élément inexistant. Je ne sais pas si c'est standard
(j'espère parce que je n'utilise que ça).



Ou je suis encore plus fatigue que je le pense, ou ce n'est pas standard.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Guillaume
Le #21082521
On 29 jan, 14:32, Jean-Marc Bourguet
Guillaume > int x(); // x = 0

Declaration d'une fonction nommee x retournant un int...



Si tu préféres:

void foo()
{
int x();
}
Jean-Marc Bourguet
Le #21082731
Guillaume
On 29 jan, 14:32, Jean-Marc Bourguet > Guillaume > > int x(); // x = 0
>
> Declaration d'une fonction nommee x retournant un int...

Si tu préféres:

void foo()
{
int x();
}



Ca ne change rien. Le fait que ca surprend dans ce contexte est souvent
appele le "most vexing parse".

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Publicité
Poster une réponse
Anonyme