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

Insertion d'un entier dans un map

16 réponses
Avatar
Guillaume
Bonjour =E0 tous,

imaginons que j'ai un std::map<int,int>, et que j'utilise l'operateur
[] pour acc=E9der =E0 un =E9l=E9ment inexistant:

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

Que se passe-t-il alors? Est-on garanti qu'un nouvel entier acc=E9d=E9 de
cette mani=E8re soit toujours initialis=E9 =E0 0? Et comment est-ce
possible?

Merci pour vos lumi=E8res!

10 réponses

1 2
Avatar
Stan
On 29 jan, 11:28, Guillaume wrote:
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
Avatar
Guillaume
On 29 jan, 12:08, Stan wrote:
On 29 jan, 11:28, Guillaume wrote:

> 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.
Avatar
Stan
On 29 jan, 13:14, Guillaume wrote:
On 29 jan, 12:08, Stan wrote:



> On 29 jan, 11:28, Guillaume wrote:

> > 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
Avatar
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
Avatar
Guillaume
On 29 jan, 14:01, Fabien LE LEZ wrote:
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
Avatar
Jean-Marc Bourguet
Guillaume writes:

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
Avatar
Alain Ketterlin
Guillaume writes:

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.
Avatar
Jean-Marc Bourguet
Alain Ketterlin writes:

Guillaume writes:

> 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
Avatar
Guillaume
On 29 jan, 14:32, Jean-Marc Bourguet wrote:
Guillaume writes:
> int x(); // x = 0

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



Si tu préféres:

void foo()
{
int x();
}
Avatar
Jean-Marc Bourguet
Guillaume writes:

On 29 jan, 14:32, Jean-Marc Bourguet wrote:
> Guillaume writes:
> > 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
1 2