OVH Cloud OVH Cloud

boucle for sur std::vector [debutant]

48 réponses
Avatar
AG
Bonjour,

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 :



std::vector<int> n;

for(std::vector<int>::iterator i=n.begin();i!=n.end();i++)
{
}

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++)
{
}


Que choisir ? Si je n'ai pas besoin de l'iterator dans la boucle, la
seconde solution est-elle meilleure (plus lisible, plus simple, plus
rapide ? )

AG.

10 réponses

1 2 3 4 5
Avatar
kanze
korchkidu wrote:
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?


Pour faire de l'optimisation prématurée:-).

Sérieusement, si tu commences de zéro, que tu n'as pas d'autres
habitudes, et qu'il faut choisir, ++i a l'avantage qu'il ne
serait probablement jamais plus lent. En revanche, si tu as déjà
une autre habitude, ou que tu dois écrire du code dans un projet
qui as déjà une autre habitude, la différence en performance
n'est pas assez pour valoir le changement.

--
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


Avatar
Matthieu Moy
Fabien LE LEZ writes:

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++.


Oui, mais alors, il faut programmer en ++C ?

--
Matthieu


Avatar
AG
Fabien LE LEZ wrote:
for_each (n.begin(), n.end(), Predicat);


du coup, voilà ou je me retrouve :


class BitGen : public RandInt
{
public:
int GetBit(void);
void GetBits( std::vector<int> & bits);
private:

};


int BitGen::GetBit(void)
{
return draw_one()<GetRandMax()/2 ? 0 : 1;
}


void BitGen::GetBits(std::vector<int> & bits)
{
std::generate(bits.begin(),bits.end(),BitGen::GetBit);
}


et l'erreur de compilation suivante :

bitgen.cpp(17) : error C2664: 'generate' : cannot convert parameter 3
from 'int (void)' to 'int (__thiscall *)(void)'
None of the functions with this name in scope match the target type


A priori j'ai pas besoin de vous filer le code de RandInt, mais si vous
pensez que ça vient de là... faut l'dire.

Bon ben là je séche. Je vois bien que c'est du au fait que la fonction
GetBit() fait partie de la classe (si je la sort de la classe, ça
compile, mais j'ai pas envie de la sortir de la classe.

Please, no comment sur le nom des mes fonctions, GetBit et GetBits... je
le changerais promis.

C dur le C++

AG.

Avatar
Fabien LE LEZ
On 9 Feb 2005 05:29:33 -0800, :

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?


Pour faire de l'optimisation prématurée:-).


Pas forcément. C'est comme passer un std::string par référence
constante au lieu de le passer par valeur : c'est un idiome ; si on ne
le respecte pas, le lecteur va passer du temps à se demander pourquoi.


--
;-)



Avatar
Olivier Azeau
AG wrote:
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.


Si les classes sont différentes, pourquoi les initialiser dans la même
boucle ?


Avatar
Loïc Joly
Matthieu Moy wrote:
Fabien LE LEZ writes:


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++.



Oui, mais alors, il faut programmer en ++C ?


Bin, C++, ça veut bien dire qu'on prend C, qu'on l'incrémente
quelquepart dans son coin, mais que ce que voit l'utilisateur, çà reste
C... Donc ce serait pas mal effectivement, le ++C...

--
Loïc



Avatar
Fabien LE LEZ
On Wed, 09 Feb 2005 22:39:19 +0100, Loïc Joly
:

Bin, C++, ça veut bien dire qu'on prend C, qu'on l'incrémente
quelquepart dans son coin, mais que ce que voit l'utilisateur, çà reste
C... Donc ce serait pas mal effectivement, le ++C...


Objection, Votre Honneur. Si on doit changer le nom du langage qui
nous occupe, autant choisir un truc qui ne rappelle pas le C (Ça
évitera à des programmeurs C de s'auto-proclamer experts en C++).

Etant donné qu'il s'agit d'un langage multi-paradigme comportant pas
mal de bizarreries, je propose de l'appeler le Bazar[*].


[*] et tant pis si ça rappelle le B ;-)


--
;-)

Avatar
AG
Olivier Azeau wrote:

Si les classes sont différentes, pourquoi les initialiser dans la même
boucle ?
pas les initialiser, faire des calculs avec. Par exemple, calculer la

moyenne des notes des deux classes.

Mais on pourrait continuer longtemps comme ça. L'exemple est trop
mauvais pour raisonner dessus je pense.

Avatar
Olivier Azeau
AG wrote:
Olivier Azeau wrote:

Si les classes sont différentes, pourquoi les initialiser dans la même
boucle ?


pas les initialiser, faire des calculs avec. Par exemple, calculer la
moyenne des notes des deux classes.

Mais on pourrait continuer longtemps comme ça.


Certainement.

L'exemple est trop mauvais pour raisonner dessus je pense.


Peut être.
Mais alors c'est quoi ton "bon" exemple ?

Le fait est qu'initialiser 2 vector dans une même boucle est difficile à
justifier excepté pour de l'optimisation (et encore dans ce cas là, ça
se discute)
En pratique, soit tes 2 vector de même taille sont dans une même classe
et alors je ne vois pas de raison pour ne pas en faire un seul, soit ils
sont dans des classes différentes et alors je ne vois pas de raison pour
les initialiser simultanément.


Avatar
korchkidu
Olivier Azeau wrote:

En pratique, soit tes 2 vector de même taille sont dans une même classe
et alors je ne vois pas de raison pour ne pas en faire un seul,
C'est un peu rapide comme conclusion je trouve.

Pour moi, une animation est un vector d'ensemble d'articulation. Si je
dois gerer 2 animations en paralleles et seulement 2, je ne vois
vraiment pas pourquoi je ne pourrais pas avoir 2 vector de la meme
taille... Parce que faire une structure pour ca, c'est un peu trop je
trouve...

K.

1 2 3 4 5