 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Henri de Solages Guest
|
Posted: Wed Sep 07, 2005 1:38 pm Post subject: iterator = NULL |
|
|
Bonjour.
Est-il légal d'assigner la valeur NULL à un itérateur ?
--
Get rid of the final underscore of my address to use it.
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Wed Sep 07, 2005 1:45 pm Post subject: Re: iterator = NULL |
|
|
Henri de Solages <solages (AT) CICT (DOT) fr_> writes:
| Quote: | Bonjour.
Est-il légal d'assigner la valeur NULL à un itérateur ?
|
NULL est censé désigner une constante de pointeur nul et un itérateur
n'est pas un pointeur.
Quel problème voudrais-tu résoudre ?
-- Gaby
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Wed Sep 07, 2005 1:58 pm Post subject: Re: iterator = NULL |
|
|
Henri de Solages a écrit :
| Quote: | Bonjour.
Est-il légal d'assigner la valeur NULL à un itérateur ?
|
Souvent, l'équivalent moral de NULL pour un itérateur sur une collection
"c" est c.end()
--
Loïc
|
|
| Back to top |
|
 |
Henri de Solages Guest
|
Posted: Wed Sep 07, 2005 2:19 pm Post subject: Re: iterator = NULL |
|
|
Gabriel Dos Reis a écrit :
| Quote: | Henri de Solages <solages (AT) CICT (DOT) fr_> writes:
| Est-il légal d'assigner la valeur NULL à un itérateur ?
NULL est censé désigner une constante de pointeur nul et un itérateur
n'est pas un pointeur.
Quel problème voudrais-tu résoudre ?
|
Je veux un tableau d'itérateurs sur des éléments d'une list.
Pour parcourir mes tableaux de pointeurs facilement, je les termine par un pointeur NULL.
Y a-t-il un équivalent pour les itérateurs ?
Je remarque cependant que ni c++ ni icpc (compilateur d'Intel) ne me jettent quand
j'affecte NULL à un itérateur.
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Wed Sep 07, 2005 2:33 pm Post subject: Re: iterator = NULL |
|
|
Henri de Solages <solages (AT) CICT (DOT) fr_> writes:
| Quote: | Gabriel Dos Reis a écrit :
Henri de Solages <solages (AT) CICT (DOT) fr_> writes:
| Est-il légal d'assigner la valeur NULL à un itérateur ?
NULL est censé désigner une constante de pointeur nul et un
itérateur
n'est pas un pointeur.
Quel problème voudrais-tu résoudre ?
Je veux un tableau d'itérateurs sur des éléments d'une list.
Pour parcourir mes tableaux de pointeurs facilement, je les termine
par un pointeur NULL. Y a-t-il un équivalent pour les itérateurs ?
|
Si tu as un tableau, pourquoi voudrais-tu le terminer par par NULL ?
Connaître la taille du tableau ne suffit pas pour savoir quand
s'arrêter ?
typedef list<T>::iterator list_iterator;
vector<list_iterator> v;
| Quote: | Je remarque cependant que ni c++ ni icpc (compilateur d'Intel) ne
me jettent quand j'affecte NULL à un itérateur.
|
Essaie g++ :-)
-- Gaby
|
|
| Back to top |
|
 |
Gabriel Dos Reis Guest
|
Posted: Wed Sep 07, 2005 2:36 pm Post subject: Re: iterator = NULL |
|
|
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:
| Quote: | Henri de Solages a écrit :
Bonjour.
Est-il légal d'assigner la valeur NULL à un itérateur ?
Souvent, l'équivalent moral de NULL pour un itérateur sur une
collection "c" est c.end()
|
Cela peut cependant réserver des surprises.
list<int> l;
// ...
copy(l.begin(), l.end(), back_inserter(l));
-- Gaby
|
|
| Back to top |
|
 |
Cyrille Guest
|
Posted: Wed Sep 07, 2005 2:48 pm Post subject: Re: iterator = NULL |
|
|
Henri de Solages a écrit :
| Quote: | Gabriel Dos Reis a écrit :
Henri de Solages <solages (AT) CICT (DOT) fr_> writes:
| Est-il légal d'assigner la valeur NULL à un itérateur ?
NULL est censé désigner une constante de pointeur nul et un itérateur
n'est pas un pointeur.
Quel problème voudrais-tu résoudre ?
Je veux un tableau d'itérateurs sur des éléments d'une list.
Pour parcourir mes tableaux de pointeurs facilement, je les termine par
un pointeur NULL. Y a-t-il un équivalent pour les itérateurs ?
Je remarque cependant que ni c++ ni icpc (compilateur d'Intel) ne me
jettent quand j'affecte NULL à un itérateur.
|
En général, on utilise std::vector plutôt que des tableaux, en C++.
Plutôt que marquer le dernier par NULL, on parcours simplement le vector
de begin() à end().
Je ne crois pas que ça ait un sens d'affecter NULL à un itérateur.
--
Ceux qui vivent, ce sont ceux qui luttent.
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Wed Sep 07, 2005 2:49 pm Post subject: Re: iterator = NULL |
|
|
Henri de Solages <solages (AT) CICT (DOT) fr_> a écrit :
| Quote: | Gabriel Dos Reis a écrit :
Henri de Solages <solages (AT) CICT (DOT) fr_> writes:
| Est-il légal d'assigner la valeur NULL à un itérateur ?
NULL est censé désigner une constante de pointeur nul et un itérateur
n'est pas un pointeur.
Quel problème voudrais-tu résoudre ?
Je veux un tableau d'itérateurs sur des éléments d'une list.
|
Pourquoi pas un vecteur ?
| Quote: | Pour parcourir mes tableaux de pointeurs facilement,
je les termine par un pointeur NULL.
|
Sauf que ce ne sont pas forcément des pointeurs.
Que des itérateurs de liste soient des pointeurs,
primo, cela me supprend (et j'aimerais voir comment
ils codent ++), secundo, même si cela est, c'est
une implémentation possible, pas
la seule possible.
Sinon, ce dont tu as besoin, c'est d'un délimiteur de
fin, donc le end() de la liste me semble une bonne
valeur interdite.
| Quote: | Y a-t-il un équivalent pour les itérateurs ?
Je remarque cependant que ni c++ ni icpc (compilateur d'Intel) ne me jettent quand
j'affecte NULL à un itérateur.
|
Amusant: tu as un bout de code.
Marc Boyer
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?
|
|
| Back to top |
|
 |
Stan Guest
|
Posted: Wed Sep 07, 2005 2:54 pm Post subject: Re: iterator = NULL |
|
|
"Henri de Solages" <solages (AT) CICT (DOT) fr_> a écrit dans le message de
news:dfmsod$9u3$1 (AT) news (DOT) cict.fr...
| Quote: | Gabriel Dos Reis a écrit :
Henri de Solages <solages (AT) CICT (DOT) fr_> writes:
| Est-il légal d'assigner la valeur NULL à un itérateur ?
NULL est censé désigner une constante de pointeur nul et un itérateur
n'est pas un pointeur.
Quel problème voudrais-tu résoudre ?
Je veux un tableau d'itérateurs sur des éléments d'une list.
Pour parcourir mes tableaux de pointeurs facilement, je les termine par un
pointeur NULL.
Y a-t-il un équivalent pour les itérateurs ?
Je remarque cependant que ni c++ ni icpc (compilateur d'Intel) ne me
jettent quand
j'affecte NULL à un itérateur.
|
Pourquoi ne pas placer ces itérateurs dans un vector ?
--
Stan .
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Wed Sep 07, 2005 3:20 pm Post subject: Re: iterator = NULL |
|
|
Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> a écrit :
| Quote: | Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:
| Henri de Solages a écrit :
| > Bonjour.
| > Est-il légal d'assigner la valeur NULL à un itérateur ?
|
| Souvent, l'équivalent moral de NULL pour un itérateur sur une
| collection "c" est c.end()
Cela peut cependant réserver des surprises.
list<int> l;
// ...
copy(l.begin(), l.end(), back_inserter(l));
|
C'est marrant comme quoi des reflexes du C peuvent
rester incrusté...
Pour moi, end() dans une liste, c'est fondamentalement
le pointeur NULL de toutes les listes chainées C.
Et à chaque fois, faut que je me raisonne en me disant
"mais non, comment faire end()-1 avec NULL ?".
Mais c'est *le* piège (1) ou je tombe systématiquement.
D'ailleurs, un rapide coup d'oeuil sur le code de
la list de mon g++ me dit que end() retourne un "_M_node",
que begin() retourne un "_M_node->_M_next", et la
définition de _M_node semble perdue deux niveaux d'héritage
au dessus... Pas tout clair pour moi.
Ils font une liste circulaire ?
Marc Boyer
(1) enfin, *un* des pièges
--
À vélo, prendre une rue à contre-sens est moins dangeureux
que prendre un boulevard dans le sens légal. À qui la faute ?
|
|
| Back to top |
|
 |
korchkidu Guest
|
Posted: Thu Sep 08, 2005 7:21 am Post subject: Re: iterator = NULL |
|
|
Gabriel Dos Reis wrote:
| Quote: | Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:
| Henri de Solages a écrit :
| > Bonjour.
| > Est-il légal d'assigner la valeur NULL à un itérateur ?
|
| Souvent, l'équivalent moral de NULL pour un itérateur sur une
| collection "c" est c.end()
Cela peut cependant réserver des surprises.
list<int> l;
// ...
copy(l.begin(), l.end(), back_inserter(l));
|
JE vois pas le piege la. Tu peux expliquer stp?
K.
|
|
| Back to top |
|
 |
Henri de Solages Guest
|
Posted: Thu Sep 08, 2005 8:27 am Post subject: Re: iterator = NULL |
|
|
Marc Boyer a écrit :
| Quote: | Henri de Solages <solages (AT) CICT (DOT) fr_> a écrit :
Je remarque cependant que ni c++ ni icpc (compilateur d'Intel) ne me jettent quand
j'affecte NULL à un itérateur.
Amusant: tu as un bout de code.
|
# include <iostream>
# include <string>
# include <list>
using namespace std ;
int main( int argc, char ** argv ) {
list< string >::const_iterator i_nombres = NULL ;
if( i_nombres != NULL )
cerr << "i_nombresn" ;
else
cerr << "non i_nombresn" ;
return 0 ;
}
--
Get rid of the final underscore of my address to use it.
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Thu Sep 08, 2005 8:28 am Post subject: Re: iterator = NULL |
|
|
Marc Boyer wrote:
| Quote: | Gabriel Dos Reis <gdr (AT) integrable-solutions (DOT) net> a écrit :
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:
| Henri de Solages a écrit :
| > Est-il légal d'assigner la valeur NULL à un itérateur ?
| Souvent, l'équivalent moral de NULL pour un itérateur sur
| une collection "c" est c.end()
Cela peut cependant réserver des surprises.
list<int> l;
// ...
copy(l.begin(), l.end(), back_inserter(l));
C'est marrant comme quoi des reflexes du C peuvent
rester incrusté...
Pour moi, end() dans une liste, c'est fondamentalement
le pointeur NULL de toutes les listes chainées C.
|
Depuis quand est-ce qu'il y a un pointeur NULL dans une liste
chaînée en C. J'ai toujours utilisé des listes doublement
chaînées (qui permettent de supprimer un élément en ne
connaissant que cet élément), avec une vertice « racine ». La
fin de la liste avec la racine comme prochain élément, et le
début comme élément précédant. Dans le cas d'une liste vide, la
racine pointait à lui-même.
Itérer sur tous les éléments devenait :
for ( Node* p = racine->next ; p != &racine, p = p->next ) ...
Supprimer un élément :
elem->next->prev = elem->prev ;
elem->prev->next = elem->next ;
L'utilisation des NULL ne fait que compliquer le code en
introduisant des tests supplémentaires.
| Quote: | Et à chaque fois, faut que je me raisonne en me disant
"mais non, comment faire end()-1 avec NULL ?".
Mais c'est *le* piège (1) ou je tombe systématiquement.
D'ailleurs, un rapide coup d'oeuil sur le code de la list de
mon g++ me dit que end() retourne un "_M_node", que begin()
retourne un "_M_node->_M_next", et la définition de _M_node
semble perdue deux niveaux d'héritage au dessus... Pas tout
clair pour moi.
Ils font une liste circulaire ?
|
Je crois. Je crois qu'il font à peu près comme j'ai fait
ci-dessus. J'ai l'impression que la seule différence entre leur
code et ce que je faisais auparavent (depuis au moins vingt ans
maintenant), c'est qu'ils allouent la racine dynamiquement,
tandis que chez moi, elle était membre. (Le membre, en fait,
c'était un « Node » qui ne contenait que des pointeurs. Les
éléments était des Element qui dérivait de Node, et je me
servais des casts dans la classe de liste pour passer d'un à
l'autre.)
--
James Kanze GABI Software
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
|
|
| Back to top |
|
 |
kanze Guest
|
Posted: Thu Sep 08, 2005 8:32 am Post subject: Re: iterator = NULL |
|
|
korchkidu wrote:
| Quote: | Gabriel Dos Reis wrote:
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:
| Henri de Solages a écrit :
| > Est-il légal d'assigner la valeur NULL à un itérateur ?
| Souvent, l'équivalent moral de NULL pour un itérateur sur une
| collection "c" est c.end()
Cela peut cependant réserver des surprises.
list<int> l;
// ...
copy(l.begin(), l.end(), back_inserter(l));
JE vois pas le piege la. Tu peux expliquer stp?
|
Essai-le. Et demande-toi ce que bien signifie le résultat d'un
l.end() précédant après une insertion ?
--
James Kanze GABI Software
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
|
|
| Back to top |
|
 |
Henri de Solages Guest
|
Posted: Thu Sep 08, 2005 8:32 am Post subject: Re: iterator = NULL |
|
|
Stan a écrit :
| Quote: | Pourquoi ne pas placer ces itérateurs dans un vector ?
|
Je n'aime pas les vector car, quand on fait un erase, les iterateurs sur les élements
suivants ne sont plus valides. J'aime bien qu'on fasse suivre le courrier quand on déménage.
--
Get rid of the final underscore of my address to use it.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|