OVH Cloud OVH Cloud

map et operateur []

58 réponses
Avatar
Fanny Chevalier
Bonjour,

Voila, j'ai fait une map :
map <CoupleInt, double>myMap;
destinée a accueillir une valeur relative a un couple d'entiers
CoupleInt dont la syntaxe de classe est la suivante :

class CoupleInt
{
public:
CoupleInt();
CoupleInt(int, int);
CoupleInt(const CoupleInt&);
~CoupleInt();

private:
int first;
int second;
};

Lorsque je fais l'appel (par exemple)
double myDoubleValue = 3.02;
CoupleInt couple = CoupleInt(3,2);
myMap[couple] = myDoubleValue;

il n'a pas l'air d'aimer myMap[couple].

Une idée?

Merci pour votre aide
Fanny

10 réponses

2 3 4 5 6
Avatar
Fabien LE LEZ
On Tue, 12 Oct 2004 17:31:14 +0200, "Alexandre"
:

mais ici la norme aurait du le définir


Non. C'est l'inconvénient de la compatibilité avec le C : le C++ se
traîne plein de casserolles de ce type.


--
;-)

Avatar
kanze
Falk Tannhäuser wrote in message
news:<ckg97v$6co$...
James Kanze wrote:

Ce n'est même pas un anglicisme. Disambiguate ne résonne pas mieux
en anglais. Mais j'aimerais bien avoir un mot pour la chose (encore
qu'au fond, lever l'ambiguïté me semble faire l'affaire d'une fa on
suffisante). Je ne pourrais même pas blâmer mes sejours en
Allemagne. Les allemands aiment bien créer de nouveaux mots, mais ça
ne me viendrait pas à l'esprit non plus d'y écrire
« entdoppeldeutigen ».


:-)

J'aurais dit "eine Doppeldeutigkeit (oder Mehrdeutigkeit) auflösen".


Tout à fait. « Entdoppeldeutigen » (ou « entmehrdeutigen », dans le cas
où l'ambigïté concerne plus de deux possibilités) fait un effet un peu
comique. J'aurais peut-être dit « aufheben », à la place d'« auflösen »,
mais c'est probablement l'influence du français « lever » qui me joue
des tours là.

--
James Kanze GABI Software http://www.gabi-soft.fr
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


Avatar
kanze
Fabien LE LEZ wrote in message
news:...
On Tue, 12 Oct 2004 17:31:14 +0200, "Alexandre"
:

mais ici la norme aurait du le définir


Non. C'est l'inconvénient de la compatibilité avec le C : le C++ se
traîne plein de casserolles de ce type.


En passant, il m'est arrivé de déclarer une fonction dans une autre
fonction. Il y en a même un exemple sur ma site:-).

(En fait, c'est le résultat d'un rafistolage vite fait -- j'avais déjà
le programme « comment », et j'étais en train d'écrire un programme «
entete », quand je me suis aperçu qu'une bonne partie de la logique dont
j'avais besoin se trouvait déjà dans « comment ». Alors, j'ai fusionné
les deux au moyen d'un if dans le main -- et j'ai déclaré ce qui était
le main de « entete » dans le main() de « comment ». Évidemment, ce
qu'il aurait fallu faire était de séparer les parties communes dans une
bibliothèque à part, et garder deux programmes distincts. Mais j'étais
pressé à l'instant, et depuis, j'ai été trop parasseux pour rétourner
faire correctement.)

--
James Kanze GABI Software http://www.gabi-soft.fr
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


Avatar
kanze
Gabriel Dos Reis wrote in message
news:...
"Vincent Lascaux" writes:

| > Le problème, c'est que la suite de tokens « int ( i ) » peut être
| > interprété soit comme une valeur, soit come une déclaration d'une
| > variable i (variable qui pourrait, lui, être le paramètre d'une
| > fonction). Et la norme dit que chaque fois qu'il y a ambigüité, et
| > que les deux sont légaux, c'est la declaration qui prime.

| Est ce que tu sais ce qui a poussé le choix dans ce sens ?

Héritage C.


C'est plus complex que ça, je crois. J'avoue que je n'aimerais pas que
deux lignes exactement identiques aient une signification différente
selon le contexte. À la rigueur, qu'il soit illégal de declarer une
fonction dans une autre fonction, je veux bien (aujourd'hui, en tout
cas, et bien qu'il y en a un cas dans le code à ma site). Mais que la
ligne soit légale dans les deux cas, mais dans un cas, il déclare une
fonction, et dans l'autre, un objet...

Mais n'était-ce pas Stroustrup qui caractérisait la syntaxe des
declarations en C comme un expériment qui a échoué ? (Je ne l'ai pas
entendu ni lu directement de lui, mais il me semble que celui qui me l'a
dit l'a attribué à Stroustrup.)

Mais comme Stroustrup l'explique dans D&E, même le compilateur du
temps de K&R1 ne les acceptais pas -- même si K&R1 disait que c'était
valide.


Ils l'ont dû corrigé assez vite, parce que j'avais des collègues qui
s'en servaient à mort avec le PCC de Johnson.

En fait, il faut se mettre dans le contexte. C'était le milieu des
années 80, le seul éditeur à notre disposition était ed, et beaucoup des
vieux loups de l'époque trouvait encore que même la programmation
struturée et l'indentation était un « gadget » sans intérêt. Et il n'y
avait pas d'en-tête standard pour la plupart des choses (stdio.h et
ctype.h étaient les exceptions). Alors, quand tu te rendais compte qu'il
fallait une fonction qui ne renvoyait pas int (parce que celle qui
renvoyaient int, on ne les déclarait pas du tout), on la déclarait
soi-même. Le plus près possible d'où on était dans les sources. Même à
l'époque, ce n'était pas ce qu'on considérait de la bonne programmation.
Mais c'était encore assez courant.

--
James Kanze GABI Software http://www.gabi-soft.fr
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

Avatar
kanze
Andre Heinen wrote in message
news:...

On Mon, 11 Oct 2004 16:57:09 -0400, "Michel Michaud"
wrote:

Dans le message ,

Par exemple, il peut être difficile de trouver un nom de fonction
qui indique sans ambiguïté que la fonction modifie les arguments.


Difficile ? C'est tout ? Alors on se force et on évite de renvoyer
deux données à moins que ce soit un « couple » très logique ayant un
nom précis et une utilisation ailleurs.


J'ai l'impression qu'on est en train de "glisser" vers une bagarre
entre "pro-struct" et "anti-struct". Je rappelle donc que je n'ai
jamais utilisé cette méthode que très rarement. En général, je fais
comme tu dis.

Mais il y a eu des cas où j'ai eu l'impression que ce n'était pas
idéal. Il m'est arrivé, en me "forçant", comme tu dis, de trouver des
noms de fonction qui étaient explicites mais longs et lourds. Ils ne
me satisfaisaient pas.


Surtout, il exige qu'on déclare la variable dans une ligne à part, avant
d'appeler la fonction. Il y a des cas où on aimerait s'en passer.

On a également parlé, ces derniers temps, de la difficulté de trouver
des identificateurs explicites en français, en particulier si le
compilateur utilisé impose de renoncer aux accents. Tu viens toi-même
de donner, dans un autre fil, un exemple avec
trouve/trouvé/trouver/decouvert. Je crois qu'il n'est pas toujours si
facile de "se forcer".

Et puis franchement, je ne vois pas de problème avec le fait de
retourner une std::pair. Si une fonction retourne deux valeurs, ça ne
me paraît pas plus difficile à comprendre que si elle n'en retourne
qu'une seule.


Le problème, c'est que les noms first et second ne dit pas grand chose
sur la signification de ces deux valeurs. Donc, std::set<>::insert et
std::map<>::insert renvoie un std::pair<iterator,bool>. Mais chaque fois
que je veux m'en servir, je suis obligé à régarder la doc pour savoir si
l'itérateur, c'est first ou c'est second. (En fait, je viens de régarder
pour taper le type de rétour ci-dessus. Parce que je ne sais pas
pourquoi, mais j'aurais mis le bool d'abord.)

Le problème est plus ou moins ardu -- si je renvoie un intervale défini
par deux itérateurs, je crois que c'est assez intuitif que first, c'est
le début, et second, la fin. Mais une classe interval, avec des membres
begin et end (et avec un seul paramètre de template), serait quand même
mieux.

--
James Kanze GABI Software http://www.gabi-soft.fr
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



Avatar
Gabriel Dos Reis
writes:

| Fabien LE LEZ wrote in message
| news:...
| > On Tue, 12 Oct 2004 17:31:14 +0200, "Alexandre"
| > :
|
| > >mais ici la norme aurait du le définir
|
| > Non. C'est l'inconvénient de la compatibilité avec le C : le C++ se
| > traîne plein de casserolles de ce type.
|
| En passant, il m'est arrivé de déclarer une fonction dans une autre
| fonction. Il y en a même un exemple sur ma site:-).

et tu en est fier ? :-)

-- Gaby
Avatar
Gabriel Dos Reis
writes:

| Gabriel Dos Reis wrote in message
| news:...
| > "Vincent Lascaux" writes:
|
| > | > Le problème, c'est que la suite de tokens « int ( i ) » peut être
| > | > interprété soit comme une valeur, soit come une déclaration d'une
| > | > variable i (variable qui pourrait, lui, être le paramètre d'une
| > | > fonction). Et la norme dit que chaque fois qu'il y a ambigüité, et
| > | > que les deux sont légaux, c'est la declaration qui prime.
|
| > | Est ce que tu sais ce qui a poussé le choix dans ce sens ?
| >
| > Héritage C.
|
| C'est plus complex que ça, je crois.

Cette histoire je l'ai entendue plusieurs fois, depuis que je suis
arrivé ici au TAMU. De la bouche de celui qui a inventé le C++.
Tu as des sources qui montrent qu'il me raconte n'importe quoi ?

[...]

| > Mais comme Stroustrup l'explique dans D&E, même le compilateur du
| > temps de K&R1 ne les acceptais pas -- même si K&R1 disait que c'était
| > valide.
|
| Ils l'ont dû corrigé assez vite, parce que j'avais des collègues qui
| s'en servaient à mort avec le PCC de Johnson.

Que veux-tu dire par « assez vite »? Stroustrup est rentré chez
Bell Labs vers fin 1978. L'une des premières choses qu'il a commencé à
faire, c'est d'écrire des programmes C pour tester le compilateur --
le but pour lui était de savoir s'il a bien compris K&R-1. Et l'un de
ses premières surprises et de voir que même le compilateur de Johnson
se casse la gueule sur « int (i) ». Et ceci pendant un très bon moment.
Quand les constructeurs ont été inventés, c'est l'une des raisons pour
laquelle il a introduit la syntaxe « T(v) » -- pour la conversion
fonctionnelle, parce que cela ne cassait aucun program de l'éopque, la
syntaxe ne passait pas avec les compilateurs.
Seulement, il y a eu un hic. Juste quelque mois avant la sortie de
CFront, quelqu'un (Pennello, je crois) a sorti une grammaire pour C
basée sur YACC et qui acceptait « int (i) »

-- Gaby
PS : tiens, au fait, il a essayé de te joindre hier mais comme
l'adresse contenue dans ta signature professionnelle ne marche pas,
il n'a pas pu.
Avatar
Michel Michaud
Dans le message ,
Il m'est arrivé, en me "forçant", comme tu dis, de
trouver des noms de fonction qui étaient explicites mais longs et
lourds. Ils ne me satisfaisaient pas.


C'est un mauvais réflexe de penser qu'ils ne sont pas bons s'ils
sont longs. S'ils doivent être longs pour être corrects, il faut
les écrire ainsi. Ça n'a rien à voir avec les paramètres de sortie.
J'imagine qu'un peu de COBOL ne fait pas de mal pour être ensuite
capable d'accepter facilement un identificateur de plus de 10 ou
15 caractères :-)

On a également parlé, ces derniers temps, de la difficulté de
trouver des identificateurs explicites en français, en
particulier si le compilateur utilisé impose de renoncer aux
accents. Tu viens toi-même de donner, dans un autre fil, un
exemple avec trouve/trouvé/trouver/decouvert. Je crois qu'il
n'est pas toujours si facile de "se forcer".


C'est pourquoi je prétends qu'il faut utiliser les accents si on
le peut.

Et puis franchement, je ne vois pas de problème avec le fait de
retourner une std::pair. Si une fonction retourne deux valeurs,
ça ne me paraît pas plus difficile à comprendre que si elle n'en
retourne qu'une seule.


Le problème est de savoir si c'est first ou second qui correspond
aux valeurs qui nous intéressent par la suite. Dans du code non
trivial la lisibilité en prend un coup... C'est déjà le cas dans
les emplois forcés par la bibliothèque alors je ne vois pas
pourquoi on le ferait en plus dans notre code, où on a le choix.
Ce n'est pas difficile de faire une petite struct pour pouvoir
donner des noms satisfaisants...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Michel Michaud
Dans le message ,
[Parlant des paramètres de sortie]
Surtout, il exige qu'on déclare la variable dans une ligne à part,
avant d'appeler la fonction. Il y a des cas où on aimerait s'en
passer.


Dans ce cas, on peut renvoyer la valeur en faisant une struct
spécifique au besoin. Je ne crois pas que ce soit si fréquent que
« on aimerait s'en passer ». On a déjà toute la partie entrée-
sortie de C++ qui ne permet pas d'initialiser directement les
valeurs lues, je crois qu'on est habitué donc...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
Fabien LE LEZ
On Wed, 13 Oct 2004 14:36:18 -0400, "Michel Michaud" :

S'ils doivent être longs pour être corrects, il faut
les écrire ainsi.


Attention cependant : certains compilos ne gardent que les 32 premiers
caractères des identifiants. Et il me semble m'être déjà fait avoir
(avec deux identifiants différents, dont les 32 premiers caractères
étaient identiques).


--
;-)

2 3 4 5 6