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 ?
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 ?
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
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 ?
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
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 ?
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
Gabriel Dos Reis
Mickaël Wolff 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
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.
| 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
vecchio56
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 :)
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 ?
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 :)
Mickaël Wolff
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
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::operator[] 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.
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::operator[] 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.
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::operator[] 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.
Fabien LE LEZ
On Mon, 21 Apr 2008 02:53:09 +0200, Mickaël Wolff :
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 :
private: typedef typename std::map<Cle,Valeur> Data; Data data; };
Gabriel Dos Reis
Mickaël Wolff writes:
| | > 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
Mickaël Wolff <mickael.wolff@laposte.net> writes:
|
| > 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() ?
| | > 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
Mickaël Wolff
Data::const_iterator it= data.find (cle);
Merci beaucoup, c'était essentiellement const_iterator qui me manquait. Je n'en connaissait pas l'utilité.
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.
À condition, évidemment, que le code reste légal.
Ainsi, si j'écris
map<int,int> m const; cout << m[4];
j'ai une erreur à la compilation. C'est logique, map::operator[] 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 tem ps en temps, ce serait un cauchemar pour le programmeur.
C'est un bon point.
En fait, tel que je le vois, l'operator[] est un surplus, qui ne fait pas partir de l'abstraction de base de std::map. L'abstraction de base, c'est find, insert et erase. Selon l'utilisation, tu veux des comportements différents si l'élément récherché ne s'y trouve pas : l'insérer avec une valeur par défaut, renvoyer un pointeur plutôt qu'une référence, avec un pointeur null, lever une exception, ou même l'échec d'une assertion. Tout ce qui se laisse implémenter facilement à partir des trois opérations de base.
L'existance de l'opérateur [], c'est simplement pour permettre l'utilisation du map de la même manière qu'on utilise son équivalent en AWK ou en perl. Si c'est ce que tu veux, tu ne déclares pas le map const, et tu l'utilises exactement comme en AWK ou en perl. Sinon, tu fais un petit wrapper pour donner la sémantique que tu veux.
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
On Apr 21, 3:03 am, Fabien LE LEZ <grams...@gramster.com> wrote:
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.
À condition, évidemment, que le code reste légal.
Ainsi, si j'écris
map<int,int> m const;
cout << m[4];
j'ai une erreur à la compilation. C'est logique, map::operator[] 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 tem ps
en temps, ce serait un cauchemar pour le programmeur.
C'est un bon point.
En fait, tel que je le vois, l'operator[] est un surplus, qui ne
fait pas partir de l'abstraction de base de std::map.
L'abstraction de base, c'est find, insert et erase. Selon
l'utilisation, tu veux des comportements différents si l'élément
récherché ne s'y trouve pas : l'insérer avec une valeur par
défaut, renvoyer un pointeur plutôt qu'une référence, avec un
pointeur null, lever une exception, ou même l'échec d'une
assertion. Tout ce qui se laisse implémenter facilement à partir
des trois opérations de base.
L'existance de l'opérateur [], c'est simplement pour permettre
l'utilisation du map de la même manière qu'on utilise son
équivalent en AWK ou en perl. Si c'est ce que tu veux, tu ne
déclares pas le map const, et tu l'utilises exactement comme en
AWK ou en perl. Sinon, tu fais un petit wrapper pour donner la
sémantique que tu veux.
--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
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.
À condition, évidemment, que le code reste légal.
Ainsi, si j'écris
map<int,int> m const; cout << m[4];
j'ai une erreur à la compilation. C'est logique, map::operator[] 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 tem ps en temps, ce serait un cauchemar pour le programmeur.
C'est un bon point.
En fait, tel que je le vois, l'operator[] est un surplus, qui ne fait pas partir de l'abstraction de base de std::map. L'abstraction de base, c'est find, insert et erase. Selon l'utilisation, tu veux des comportements différents si l'élément récherché ne s'y trouve pas : l'insérer avec une valeur par défaut, renvoyer un pointeur plutôt qu'une référence, avec un pointeur null, lever une exception, ou même l'échec d'une assertion. Tout ce qui se laisse implémenter facilement à partir des trois opérations de base.
L'existance de l'opérateur [], c'est simplement pour permettre l'utilisation du map de la même manière qu'on utilise son équivalent en AWK ou en perl. Si c'est ce que tu veux, tu ne déclares pas le map const, et tu l'utilises exactement comme en AWK ou en perl. Sinon, tu fais un petit wrapper pour donner la sémantique que tu veux.
-- James Kanze (GABI Software) email: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Falk Tannhäuser
Fabien LE LEZ wrote:
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::operator[] 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.
Notons aussi qu'en C++09(?) on prévoit pallier à ce manque constaté par des utilisateurs de std::map en y ajoutant des fonctions membre : T& at(const key_type& x); const T& at(const key_type& x) const; qui lèvent toujours une exception std::out_of_range si la clé ne se trouve pas déjà dans le map.
Falk
Fabien LE LEZ wrote:
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::operator[] 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.
Notons aussi qu'en C++09(?) on prévoit pallier à ce manque constaté par
des utilisateurs de std::map en y ajoutant des fonctions membre :
T& at(const key_type& x);
const T& at(const key_type& x) const;
qui lèvent toujours une exception std::out_of_range si la clé ne se
trouve pas déjà dans le map.
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::operator[] 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.
Notons aussi qu'en C++09(?) on prévoit pallier à ce manque constaté par des utilisateurs de std::map en y ajoutant des fonctions membre : T& at(const key_type& x); const T& at(const key_type& x) const; qui lèvent toujours une exception std::out_of_range si la clé ne se trouve pas déjà dans le map.