OVH Cloud OVH Cloud

std::vector

14 réponses
Avatar
hannibal200480
Bonjour,

Voici une partie du programme ecrit en c++ dont je dispose

int l,m,w;

vector< vector<Vector3D>* > pVector0;

/*Vector3D est declare comme une classe de points 3D*/


if(l=3D=3D0)
{
if(m >=3D (int)pVector0.size())
for(w=3D(int)pVector0.size();w<=3D(int)(m-pVector0.size()+1);w++)=

{
pVector0.push_back(new vector<Vector3D>);
}
pVector0[m]->push_back(pos);
}
else
{
=2E..
}



Je n'arrive pas a ajouter des elements (i.e. points 3D) au pVector0[m]

Auriez-vous une id=E9e pour ajouter des =E9l=E9ments au pVector0[m]?

Merci

10 réponses

1 2
Avatar
Fabien LE LEZ
On Thu, 14 Jul 2005 11:50:10 -0400, :

int l,m,w;


Essaie de créer des noms de variables plus explicites.
D'autre part, tu fais du C++, pas du C, donc déclarer les variables en
bloc au début est généralement une mauvaise idée.

vector< vector<Vector3D>* > pVector0;


AMHA, il y a une erreur ici : pourquoi diable fais-tu un tableau de
pointeurs vers des tablaux ?

Essaie donc

vector< vector<Vector3D> > ma_matrice_de_points;

Avatar
hannibal200480
avec la declaration vector< vector<Vector3D> > ma_matrice_de_points


la partie du programme devient


int l,m,w;

vector< vector<Vector3D> > ma_matrice_de_points;

/*Vector3D est declare comme une classe de points 3D*/


if(l==0)
{
if(m >= (int)pVector0.size())

for(w=(int)ma_matrice_de_points.size();w<=(int)(m-ma_matrice_de_point s.size()+1);w++)
{
ma_matrice_de_points.push_back(new vector<Vector3D>);
}
ma_matrice_de_points[m]->push_back(pos);
}
else
{
...
}

ma_matrice_de_points est un vecteur de vecteur. Ce que je voulais faire
c'est d'ajouter le point 3D, pos, a la position m dans le vecteur.

Toujours, Je n'arrive pas a ajouter des elements (i.e. points 3D) au
pVector0[m] .

Merci




Fabien LE LEZ wrote:
On Thu, 14 Jul 2005 11:50:10 -0400, :


int l,m,w;



Essaie de créer des noms de variables plus explicites.
D'autre part, tu fais du C++, pas du C, donc déclarer les variables e n
bloc au début est généralement une mauvaise idée.


vector< vector<Vector3D>* > pVector0;



AMHA, il y a une erreur ici : pourquoi diable fais-tu un tableau de
pointeurs vers des tablaux ?

Essaie donc

vector< vector<Vector3D> > ma_matrice_de_points;





Avatar
Fabien LE LEZ
On Thu, 14 Jul 2005 13:11:25 -0400, :

ma_matrice_de_points.push_back(new vector<Vector3D>);


Inutile.

Avatar
Fabien LE LEZ
On Thu, 14 Jul 2005 13:11:25 -0400, :

ma_matrice_de_points est un vecteur de vecteur.


Non, un tableau de tableaux.

Ce que je voulais faire
c'est d'ajouter le point 3D, pos, a la position m dans le vecteur.


Connais-tu à l'avance la taille du tableau ?
Si tu mets le point à une position donnée, les lignes précédentes
doivent-elles rester vides ?

De toutes façons, ton code est mal parti.
Oublie toute notion de pointeur et de new, ça n'a rien à faire ici.

Commençons par les bases : si tu veux rajouter n éléments identiques à
un std::vector<> v, la seule bonne manière que je connaisse est :

v.insert (v.end(), n);
ou
v.insert (v.end(), n, element_modele);

Donc, si tu as un
vector< vector<Machin> > v;
et que tu veux rajouter n vector<Machin> vides à la fin :

v.insert (v.end(), n);


Je ne suis pas sûr qu'un vector<vector<>> soit idéal pour représenter
une matrice. Si tu veux une matrice, cherche donc "matrice" dans
Google :
<http://groups.google.com/groups?as_q=matrice&as_ugroup=fr.comp.lang.c%2B%2B>

Avatar
hannibal200480
Je pense que :

vector< vector<Vector3D> > v;
v.insert (v.end(), n);

me convient.

Comment ajouter un élément Vector3D à la kieme vector<Vector3D> ?

Merci

Fabien LE LEZ wrote:
On Thu, 14 Jul 2005 13:11:25 -0400, :


ma_matrice_de_points est un vecteur de vecteur.



Non, un tableau de tableaux.


Ce que je voulais faire
c'est d'ajouter le point 3D, pos, a la position m dans le vecteur.



Connais-tu à l'avance la taille du tableau ?
Si tu mets le point à une position donnée, les lignes précédent es
doivent-elles rester vides ?

De toutes façons, ton code est mal parti.
Oublie toute notion de pointeur et de new, ça n'a rien à faire ici.

Commençons par les bases : si tu veux rajouter n éléments identiq ues à
un std::vector<> v, la seule bonne manière que je connaisse est :

v.insert (v.end(), n);
ou
v.insert (v.end(), n, element_modele);

Donc, si tu as un
vector< vector<Machin> > v;
et que tu veux rajouter n vector<Machin> vides à la fin :

v.insert (v.end(), n);


Je ne suis pas sûr qu'un vector<vector<>> soit idéal pour représe nter
une matrice. Si tu veux une matrice, cherche donc "matrice" dans
Google :
<http://groups.google.com/groups?as_q=matrice&as_ugroup=fr.comp.lan g.c%2B%2B>




Avatar
Fabien LE LEZ
http://www.giromini.org/usenet-fr/repondre.html
Avatar
Alexandre
vector< vector<Vector3D> > v;
v.insert (v.end(), n);
me convient.
Comment ajouter un élément Vector3D à la kieme vector<Vector3D> ?


essaie d'initialiser avec
vector< vector<Vector3D> > v(nb_lignes,Vector3D(nb_colonnes));
si tu connais à l'avance les nombres et si Vector3D possède un constructeur
par défaut.

Pour lire/écrire le i,j Vector3D, il suffit de faire
v[i][j] = Vector3D(...);

Mais dans l'ensemble tu vas t'embeter avec ça. L'idéal c'est d'avoir une
classe matrice (eventuellement basée sur vector<vector<T>>), soit tu en
prends une qui existe et qui convient, soit tu en fais une toi-même, du
genre :

template <class elt> class matrice_simple
{
typedef std::vector<elt> ligne;
private:
std::vector<ligne> Elements;
public:
matrice_simple(int nb_l, int nb_c):Elements(nb_l, ligne(nb_c)){}
elt& operator()(int l, int c){return Elements[l][c];}
const elt& operator()(int l,int c) const {return Elements[l][c];}
};




Merci

Fabien LE LEZ wrote:
On Thu, 14 Jul 2005 13:11:25 -0400, :


ma_matrice_de_points est un vecteur de vecteur.



Non, un tableau de tableaux.

Ce que je voulais faire c'est d'ajouter le point 3D, pos, a la position m
dans le vecteur.



Connais-tu à l'avance la taille du tableau ?
Si tu mets le point à une position donnée, les lignes précédentes
doivent-elles rester vides ?

De toutes façons, ton code est mal parti. Oublie toute notion de pointeur
et de new, ça n'a rien à faire ici.

Commençons par les bases : si tu veux rajouter n éléments identiques à
un std::vector<> v, la seule bonne manière que je connaisse est :

v.insert (v.end(), n);
ou
v.insert (v.end(), n, element_modele);

Donc, si tu as un vector< vector<Machin> > v;
et que tu veux rajouter n vector<Machin> vides à la fin :

v.insert (v.end(), n);


Je ne suis pas sûr qu'un vector<vector<>> soit idéal pour représenter
une matrice. Si tu veux une matrice, cherche donc "matrice" dans
Google :
<http://groups.google.com/groups?as_q=matrice&as_ugroup=fr.comp.lang.c%2B%2B>




Avatar
Fabien LE LEZ
On Sat, 16 Jul 2005 15:07:21 +0200, "Alexandre"
:

elt& operator()(int l, int c){return Elements[l][c];}


A priori, on écrira plutôt "Elements.at(l).at(c)", sauf si le profiler
dit que c'est trop lent (ce qui est plutôt rare).

Avatar
James Kanze
Fabien LE LEZ wrote:
On Sat, 16 Jul 2005 15:07:21 +0200, "Alexandre"
:


elt& operator()(int l, int c){return Elements[l][c];}



A priori, on écrira plutôt "Elements.at(l).at(c)", sauf si le
profiler dit que c'est trop lent (ce qui est plutôt rare).


A priori, on écrira Elements[l][c], et on se servir d'une
version de la bibliothèque qui aborte le programme avec message
d'erreur dans le cas où il y a une erreur de bornes.

On n'utilise at() que si on veut une exception -- c-à-d qu'on
s'attend à attrapper l'erreur plus haut et récupérer. Ce qui est
très rare.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34


Avatar
Jean-Marc Desperrier
James Kanze wrote:
A priori, on écrira Elements[l][c], et on se servir d'une
version de la bibliothèque qui aborte le programme avec message
d'erreur dans le cas où il y a une erreur de bornes.

On n'utilise at() que si on veut une exception -- c-à-d qu'on
s'attend à attrapper l'erreur plus haut et récupérer. Ce qui est
très rare.


Les exceptions ralentissent le programme quand elles ne sont pas prises ?

En tout cas je préfèrerais un exception de type accès mémoire à un
abort, car la solution d'arrêter tout et de partir sur un abort dès
qu'il y a un problème ne me semble pas universelle.
Dans un certain nombre de programmes la robustesse est plus importante,
et soit en travaillant sur la conception, soit en y arrivant facilement
parceque la structure des opérations est simple, on souhaite plutôt
placer un catch global rattrapant tous les types d'exception, annuler
l'opération en cours, et continuer les opérations.

1 2