je débute avec l'utiliation des vecteurs de la stl, et je me demandais
comment écrire une boucle for. J'ai vu dans les news une méthode assez
courante :
La première solution est plus indépendante du conteneur : si tu changes ton vecteur par une liste, tu auras juste à changer le type de l'itérateur dans ta boucle for, et le code du parcours reste le même.
que devrais-je changer dans la deuxième boucle si je passe d'un vecteur à une liste ?
Tout : on ne peut pas accéder au n-ème élément d'une liste l par l[n]. Même si on pouvait, la complexité serait probablement linéaire en n, donc à éviter. Même chose pour d'autres conteneurs qui ne définissent pas operator[] pour accéder aux éléments.
Outre le risque qu'évoque Olivier Azeau dans un autre post, il y a mieux dans ce cas précis : soit le constructeur de vecteur, soit l'algorithme fill : // 10 elements initialises a 42 std::vector<int> v1(10, 42); // 10 elements, remplis a 42 std::vector<int> n1(10); std::fill(v.begin(), v.end(), 42);
La première solution est plus indépendante du conteneur : si tu
changes ton vecteur par une liste, tu auras juste à changer le type de
l'itérateur dans ta boucle for, et le code du parcours reste le même.
que devrais-je changer dans la deuxième boucle si je passe d'un vecteur
à une liste ?
Tout : on ne peut pas accéder au n-ème élément d'une liste l par l[n].
Même si on pouvait, la complexité serait probablement linéaire en n,
donc à éviter. Même chose pour d'autres conteneurs qui ne définissent
pas operator[] pour accéder aux éléments.
Outre le risque qu'évoque Olivier Azeau dans un autre post, il y a mieux
dans ce cas précis : soit le constructeur de vecteur, soit l'algorithme
fill :
// 10 elements initialises a 42
std::vector<int> v1(10, 42);
// 10 elements, remplis a 42
std::vector<int> n1(10);
std::fill(v.begin(), v.end(), 42);
La première solution est plus indépendante du conteneur : si tu changes ton vecteur par une liste, tu auras juste à changer le type de l'itérateur dans ta boucle for, et le code du parcours reste le même.
que devrais-je changer dans la deuxième boucle si je passe d'un vecteur à une liste ?
Tout : on ne peut pas accéder au n-ème élément d'une liste l par l[n]. Même si on pouvait, la complexité serait probablement linéaire en n, donc à éviter. Même chose pour d'autres conteneurs qui ne définissent pas operator[] pour accéder aux éléments.
Outre le risque qu'évoque Olivier Azeau dans un autre post, il y a mieux dans ce cas précis : soit le constructeur de vecteur, soit l'algorithme fill : // 10 elements initialises a 42 std::vector<int> v1(10, 42); // 10 elements, remplis a 42 std::vector<int> n1(10); std::fill(v.begin(), v.end(), 42);
AG
Olivier Azeau wrote:
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20 entiers représentants les distributions de notes pour deux classes d'élèves différentes.
Olivier Azeau wrote:
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la
meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour
faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20
entiers représentants les distributions de notes pour deux classes
d'élèves différentes.
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20 entiers représentants les distributions de notes pour deux classes d'élèves différentes.
Jean-Marc Bourguet
AG writes:
Jean-Marc Bourguet wrote:
AG writes:
Olivier Azeau wrote:
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20 entiers représentants les distributions de notes pour deux classes d'élèves différentes. Les classes sont contraintes a avoir le meme nombre d'eleves de nos
jours?
non, mais par contre, dans toutes les classes, les notes vont de 0 à 20.
Il te faudrait donc 21 entiers :-)
-- 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
AG <ag@tb.fr> writes:
Jean-Marc Bourguet wrote:
AG <ag@tb.fr> writes:
Olivier Azeau wrote:
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la
meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour
faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20 entiers
représentants les distributions de notes pour deux classes d'élèves
différentes.
Les classes sont contraintes a avoir le meme nombre d'eleves de nos
jours?
non, mais par contre, dans toutes les classes, les notes vont de 0 à 20.
Il te faudrait donc 21 entiers :-)
--
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
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20 entiers représentants les distributions de notes pour deux classes d'élèves différentes. Les classes sont contraintes a avoir le meme nombre d'eleves de nos
jours?
non, mais par contre, dans toutes les classes, les notes vont de 0 à 20.
Il te faudrait donc 21 entiers :-)
-- 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
korchkidu
Fabien LE LEZ wrote:
On Wed, 09 Feb 2005 11:11:22 +0100, AG :
Bof... Je te conseille d'écrire systématiquement ++i, et de remettre à plus tard l'idée qu'on peut écrire i++.
Pour quelles raisons precisement?
K.
Fabien LE LEZ wrote:
On Wed, 09 Feb 2005 11:11:22 +0100, AG <ag@tb.fr>:
Bof... Je te conseille d'écrire systématiquement ++i, et de remettre à
plus tard l'idée qu'on peut écrire i++.
Bof... Je te conseille d'écrire systématiquement ++i, et de remettre à plus tard l'idée qu'on peut écrire i++.
Pour quelles raisons precisement?
K.
AG
Jean-Marc Bourguet wrote:
AG writes:
Olivier Azeau wrote:
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20 entiers représentants les distributions de notes pour deux classes d'élèves différentes.
Les classes sont contraintes a avoir le meme nombre d'eleves de nos jours?
non, mais par contre, dans toutes les classes, les notes vont de 0 à 20.
Jean-Marc Bourguet wrote:
AG <ag@tb.fr> writes:
Olivier Azeau wrote:
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la
meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour
faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20 entiers
représentants les distributions de notes pour deux classes d'élèves
différentes.
Les classes sont contraintes a avoir le meme nombre d'eleves de nos
jours?
non, mais par contre, dans toutes les classes, les notes vont de 0 à 20.
La, tu prends quand meme le risque que n2 et n1 ne soient pas de la meme taille. Et s'ils l'étaient quelle raison peut-on alors avoir pour faire 2 vecteurs distincts ?
Les exemples de ce type sont légions. imagine deux vecteurs de 20 entiers représentants les distributions de notes pour deux classes d'élèves différentes.
Les classes sont contraintes a avoir le meme nombre d'eleves de nos jours?
non, mais par contre, dans toutes les classes, les notes vont de 0 à 20.
AG
Fabien LE LEZ wrote:
On Wed, 09 Feb 2005 11:11:22 +0100, AG :
Permet moi, en tant que débutant, de repousser ce genre de détails à plus tard,
Bof... Je te conseille d'écrire systématiquement ++i, et de remettre à plus tard l'idée qu'on peut écrire i++.
ok.
Fabien LE LEZ wrote:
On Wed, 09 Feb 2005 11:11:22 +0100, AG <ag@tb.fr>:
Permet moi, en tant que débutant, de repousser ce genre de détails à
plus tard,
Bof... Je te conseille d'écrire systématiquement ++i, et de remettre à
plus tard l'idée qu'on peut écrire i++.
On 09 Feb 2005 11:25:35 +0100, Jean-Marc Bourguet :
non, mais par contre, dans toutes les classes, les notes vont de 0 à 20.
Il te faudrait donc 21 entiers :-)
Depuis quand les demi-points sont interdits ?
-- ;-)
kanze
AG wrote:
Julien Lamy wrote:
je débute avec l'utiliation des vecteurs de la stl, et je me demandais comment écrire une boucle for. J'ai vu dans les news une méthode assez courante :
Je trouve cette méthode lourde à écrire. Plus simplement j'aurais vu (entre autre) :
std::vector<int> n;
for(int i=0;i<n.size();i++) { n[i]=0; }
Que choisir ?
Je suppose que tu veux accéder aux éléments du vecteur dans ta boucle, donc avec un *i dans la premiere version et un n[i] dans la seconde. oui
La première solution est plus indépendante du conteneur : si tu changes ton vecteur par une liste, tu auras juste à changer le type de l'itérateur dans ta boucle for, et le code du parcours reste le même.
que devrais-je changer dans la deuxième boucle si je passe d'un vecteur à une liste ?
Le convertir en boucle du premier type. Il n'y a pas de fonction d'indexation dans std::list.
La seconde solution est effectivement plus lisible *si* tu n'as pas l'habitude des itérateurs.
Au niveau performances, tu devrais obtenir quasiment la même chose, surtout si le traitement dans la boucle est un peu complexe.
Si je n'ai pas besoin de l'iterator dans la boucle, la seconde solution est-elle meilleure (plus lisible, plus simple, plus rapide ? )
Si tu n'as pas besoin de l'itérateur dans la boucle, tu ne modifies pas ton vecteur, et j'ai alors du mal à voir l'intérêt de cette boucle :-)
Il existe bien des cas où tu dois accéder dans plusieurs collections « en parallel ». Les solutions varient selon l'application et ce qu'on fait, mais l'utilisation d'UNE indice est certainement une option à considérer. Mais pas forcément la seule.
-- 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
AG wrote:
Julien Lamy wrote:
je débute avec l'utiliation des vecteurs de la stl, et je
me demandais comment écrire une boucle for. J'ai vu dans
les news une méthode assez courante :
Je trouve cette méthode lourde à écrire. Plus simplement
j'aurais vu (entre autre) :
std::vector<int> n;
for(int i=0;i<n.size();i++)
{
n[i]=0;
}
Que choisir ?
Je suppose que tu veux accéder aux éléments du vecteur dans
ta boucle, donc avec un *i dans la premiere version et un
n[i] dans la seconde. oui
La première solution est plus indépendante du conteneur : si
tu changes ton vecteur par une liste, tu auras juste à
changer le type de l'itérateur dans ta boucle for, et le
code du parcours reste le même.
que devrais-je changer dans la deuxième boucle si je passe
d'un vecteur à une liste ?
Le convertir en boucle du premier type. Il n'y a pas de fonction
d'indexation dans std::list.
La seconde solution est effectivement plus lisible *si* tu
n'as pas l'habitude des itérateurs.
Au niveau performances, tu devrais obtenir quasiment la même
chose, surtout si le traitement dans la boucle est un peu
complexe.
Si je n'ai pas besoin de l'iterator dans la boucle, la
seconde solution est-elle meilleure (plus lisible, plus
simple, plus rapide ? )
Si tu n'as pas besoin de l'itérateur dans la boucle, tu ne
modifies pas ton vecteur, et j'ai alors du mal à voir
l'intérêt de cette boucle :-)
Il existe bien des cas où tu dois accéder dans plusieurs
collections « en parallel ». Les solutions varient selon
l'application et ce qu'on fait, mais l'utilisation d'UNE indice
est certainement une option à considérer. Mais pas forcément la
seule.
--
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
je débute avec l'utiliation des vecteurs de la stl, et je me demandais comment écrire une boucle for. J'ai vu dans les news une méthode assez courante :
Je trouve cette méthode lourde à écrire. Plus simplement j'aurais vu (entre autre) :
std::vector<int> n;
for(int i=0;i<n.size();i++) { n[i]=0; }
Que choisir ?
Je suppose que tu veux accéder aux éléments du vecteur dans ta boucle, donc avec un *i dans la premiere version et un n[i] dans la seconde. oui
La première solution est plus indépendante du conteneur : si tu changes ton vecteur par une liste, tu auras juste à changer le type de l'itérateur dans ta boucle for, et le code du parcours reste le même.
que devrais-je changer dans la deuxième boucle si je passe d'un vecteur à une liste ?
Le convertir en boucle du premier type. Il n'y a pas de fonction d'indexation dans std::list.
La seconde solution est effectivement plus lisible *si* tu n'as pas l'habitude des itérateurs.
Au niveau performances, tu devrais obtenir quasiment la même chose, surtout si le traitement dans la boucle est un peu complexe.
Si je n'ai pas besoin de l'iterator dans la boucle, la seconde solution est-elle meilleure (plus lisible, plus simple, plus rapide ? )
Si tu n'as pas besoin de l'itérateur dans la boucle, tu ne modifies pas ton vecteur, et j'ai alors du mal à voir l'intérêt de cette boucle :-)
Il existe bien des cas où tu dois accéder dans plusieurs collections « en parallel ». Les solutions varient selon l'application et ce qu'on fait, mais l'utilisation d'UNE indice est certainement une option à considérer. Mais pas forcément la seule.
-- 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