vecteur.size() en C++

sambocuccio

Membre confirmé
18 Mars 2004
26
0
86
Bastia
Bonjour,
J'obtiens un résultat curieux dans l'utilisation d'un vecteur.
Voici le listing et le résultat.
Merci pour une éventuelle réponse.

#include <iostream>
#include <vector>
using namespace std;

class Suite
{
int t[];
vector<int> v;

public:
Suite();
~Suite();
vector<int> get_v();
void affiche(vector<int>);
};
------------------------------------------
#include "Suite.h"

Suite::Suite()
{
int t[] = {1,2,3};
vector<int> v(t,t+3);
}

Suite::~Suite()
{
}

vector<int> Suite::get_v()
{
return v;
}

void Suite::affiche(vector<int> v)
{
cout << "taille de v = " << v.size();
cout << "\n";
cout << "v[0] = " << v[0];
cout << "\n";
cout << "v[1] = " << v[1];
cout << "\n";
cout << "v[2] = " << v[2];
cout << "\n";
}
-----------------------------------------------------
#include "Suite.h"

int main (int argc, char * const argv[])
{
Suite s;
s.affiche(s.get_v());
}

Et voici le résultat très curieux (vecteur de taille nulle et contenant trois éléments !?). Ou est la faute ?

[Session started at 2006-04-22 12:44:18 +0200.]
taille de v = 0
v[0] = 1
v[1] = 2
v[2] = 3

test has exited with status 0.
 
je ne suis pas un expert du c++, mais voici ma contribution :)
int t[] ne sert à rien dans la classe
et dans le constructeur:
vector<int> v2 ( t, t + (sizeof(t) / sizeof(int)) );
v = v2;
peut-être pas la solution la plus propre, mais ça donne bien
taille de v = 3
v[0] = 1
v[1] = 2
v[2] = 3
le poblème étant que dans le constructeur, tu redéfinis un vecteur, donc autre que celui de la classe.
je ne saurais t'expliquer pourquoi ça affiche bien les 3 valeurs dans ton cas.
 
une autre solution qui me semble plus propre
Bloc de code:
template <class T, size_t N>
vector<T> fillVector(T (&arr)[N])
{
  return vector<T>(arr, arr+N);

}

Suite::Suite()
{
int t[] = {1,2,3};
v = fillVector( t );
}
 
sambocuccio a dit:
Suite::Suite()
{
int t[] = {1,2,3};
vector<int> v(t,t+3);
}
Le constructeur n'est pas bon : il ne faut pas redéclarer les membres de ta classe :
Bloc de code:
Suite::Suite()
{ 
	int tab[] = {1,2,3};
	v = vector<int>(tab,tab+3);
}
 
bon, dernière réponse de ma part :)
Bloc de code:
Suite::Suite()
{
    int t[] = {1,2,3};
    v = vector<int>( t, t+(sizeof(t)/sizeof(int)) );
}

void Suite::affiche(vector<int> v)
{
    cout << "taille de v = " << v.size() << endl;
    for ( unsigned int i = 0; i < v.size(); i++ )
    {
        cout << "v[" << i << "] = " << v[i] << endl;
    }
}