PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.c++ > std::map<>::operator[] const
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
std::map<>::operator[] const

Réponse
 
LinkBack Outils de la discussion
Vieux 20/04/2008, 19h04   #1 (permalink)
Mickaël Wolff
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut std::map<>::operator[] const

Bonjour,

J'ai cherché des justifications au fait que cette surcharge n'existe
pas. Et je n'en ai pas trouvé, hormis le fait que l'inexistance de la
clé entraîne l'ajout d'une paire dans la map.

Pourquoi ?
Existe-t-il une méthode élégante pour contourner ce manque ?
Peut-être que je me trompe dans mon interprétation de ce qu'est une
map, et que donc je n'utilises pas le bon outil ?

Merci
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
  Réponse avec citation
Vieux 20/04/2008, 23h03   #2 (permalink)
Pascal Bourguignon
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: std::map<>::operator[] const

Mickaël Wolff <mickael.wolff@laposte.net> writes:

> Bonjour,
>
> J'ai cherché des justifications au fait que cette surcharge n'existe
> pas. Et je n'en ai pas trouvé, hormis le fait que l'inexistance de la
> clé entraîne l'ajout d'une paire dans la map.
>
> Pourquoi ?


Parce que l'inexistance de la clé entraîne l'ajout d'une paire dans
la map.


> Existe-t-il une méthode élégante pour contourner ce manque ?


Tu peux utiliser map::find.


> Peut-être que je me trompe dans mon interprétation de ce qu'est une
> map, et que donc je n'utilises pas le bon outil ?


Je ne sais pas, c'est quoi pour toi une map?


--
__Pascal Bourguignon__ http://www.informatimago.com/

Pour moi, la grande question n'a jamais été: «Qui suis-je? Où vais-je?»
comme l'a formulé si adroitement notre ami Pascal, mais plutôt:
«Comment vais-je m'en tirer?» -- Jean Yanne
  Réponse avec citation
Vieux 20/04/2008, 23h20   #3 (permalink)
Gabriel Dos Reis
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: std::map<>::operator[] const

Mickaël Wolff <mickael.wolff@laposte.net> writes:

| Bonjour,
|
| J'ai cherché des justifications au fait que cette surcharge n'existe
| pas. Et je n'en ai pas trouvé, hormis le fait que l'inexistance de la
| clé entraîne l'ajout d'une paire dans la map.
|
| Pourquoi ?

operator[] est défini en terme de recherche+insertion.

-- Gaby
  Réponse avec citation
Vieux 20/04/2008, 23h40   #4 (permalink)
vecchio56
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: std::map<>::operator[] const

Si on ne veut pas que l'inexistence entraine l'ajout de la clé, qu'est
ce qui sera retourné si on fait un accès et que la clé demandée n'est
pas présente? Ce n'est pas possible.
Du coup, l'ajout est obligatoire, et on ne peut pas fournir d'opérateur
en const
> Bonjour,
>
> J'ai cherché des justifications au fait que cette surcharge n'existe
> pas. Et je n'en ai pas trouvé, hormis le fait que l'inexistance de la
> clé entraîne l'ajout d'une paire dans la map.
>
> Pourquoi ?
> Existe-t-il une méthode élégante pour contourner ce manque ?
> Peut-être que je me trompe dans mon interprétation de ce qu'est une
> map, et que donc je n'utilises pas le bon outil ?
>
> Merci
>

  Réponse avec citation
Vieux 21/04/2008, 01h53   #5 (permalink)
Mickaël Wolff
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: std::map<>::operator[] const

Pascal Bourguignon a écrit :

> Parce que l'inexistance de la clé entraîne l'ajout d'une paire dans
> la map.


Certes, mais pourquoi ajouter une paire ? Pourquoi ne pas lancer une
exception ?

>> Existe-t-il une méthode élégante pour contourner ce manque ?

>
> Tu peux utiliser map::find.


Non, j'ai essayé. il n'y a pas de map::find const

> Je ne sais pas, c'est quoi pour toi une map?


Je le prenais comme un tableau associatif, qui renvoie une valeur pour
une clé associée à une valeur

--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
  Réponse avec citation
Vieux 21/04/2008, 02h03   #6 (permalink)
Fabien LE LEZ
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: std::map<>::operator[] const

On Mon, 21 Apr 2008 02:53:09 +0200, Mickaël Wolff :

> Certes, mais pourquoi ajouter une paire ? Pourquoi ne pas lancer une
>exception ?


L'opérateur non-const [] ajoute une paire si nécessaire, pour qu'on
puisse écrire :

map<int,int> m;
m[3]= 5;

Une conséquence immédiate (et peut-être malheureuse) est que le code
ci-dessous ajoute également une paire dans le map<> :

map<int,int> m;
cout << m[4];

En C++, le mot-clé "const" sert avant tout à avoir un message d'erreur
(à la compilation) si on modifie un élément qui, logiquement, n'a pas
à être modifié. En particulier, l'ajout ou le retrait d'un "const"
(tout comme de "public"/"private") ne devrait pas changer sensiblement
le comportement du programme.

Ainsi, si j'écris

map<int,int> m const;
cout << m[4];

j'ai une erreur à la compilation. C'est logique, map:perator[] n'a
pas été prévu pour être utilisé comme ça.
Si, par l'ajout du "const", le comportement du programme avait été
silencieusement modifié, avec à la clé une exception lancée de temps
en temps, ce serait un cauchemar pour le programmeur.


  Réponse avec citation
Vieux 21/04/2008, 02h11   #7 (permalink)
Fabien LE LEZ
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: std::map<>::operator[] const

On Mon, 21 Apr 2008 02:53:09 +0200, Mickaël Wolff
<mickael.wolff@laposte.net>:

> Non, j'ai essayé. il n'y a pas de map::find const


Bien sûr que si, heureusement !
Tu dois même pouvoir écrire quelque chose comme ça :

template <class Cle, class Valeur, class Less>
Valeur GetDansMap (std::map <Cle, Valeur, Less> const& map_,
Cle const& cle, Valeur const& valeur_par_defaut= Valeur())
{
typename std::map <Cle, Valeur, Less>::const_iterator
it= map_.find (cle);
if (it == map_.end())
{
return valeur_par_defaut;
}
else
{
return (*it).second;
}
}

ou bien :

template <class Cle, class Valeur, class Less>
Valeur GetDansMap (std::map <Cle, Valeur, Less> const& map_,
Cle const& cle)
{
typename std::map <Cle, Valeur, Less>::const_iterator
it= map_.find (cle);
if (it == map_.end())
{
throw quelque_chose;
}
else
{
return (*it).second;
}
}



Tu peux aussi écrire ton propre map :


template <class Cle, class Valeur> class MonMap
{
public:
void Set (Cle const& cle, Valeur const& valeur)
{ data[cle]= valeur; }

Valeur const& Get (Cle const& cle) const
{
Data::const_iterator it= data.find (cle);
if (it == data.end())
{
throw quelque_chose;
}
return (*it).second;
}

Valeur const& operator[] (Cle const& cle) const
{ return Get(cle); }

private:
typedef typename std::map<Cle,Valeur> Data;
Data data;
};



  Réponse avec citation
Vieux 21/04/2008, 02h18   #8 (permalink)
Gabriel Dos Reis
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: std::map<>::operator[] const

Mickaël Wolff <mickael.wolff@laposte.net> writes:

| Pascal Bourguignon a écrit :
|
| > Parce que l'inexistance de la clé entraîne l'ajout d'une paire dans
| > la map.
|
| Certes, mais pourquoi ajouter une paire ? Pourquoi ne pas lancer une
| exception ?

Peux-tu montrer le genre de codes typiques que tu écrirais avec ça ?
Pourquoi cela est-il meilleur qu'utiliser find() ou binary_search() ?

-- Gaby
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 22h21.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,11149 seconds with 16 queries