OVH Cloud OVH Cloud

std::vector vers double*

3 réponses
Avatar
Mungo Deepdelver[CEA][SDF]
Bonjour,
j'utilise l'implementation gnu de la stl.
actuellemnt pour passer d'un std::vector<double*> a un double *
je proc=E9de comme dans ce petit exemple :

const int n =3D 10;

std::vector<double> V(n);

for(int i=3D0;i<n;i++)
V[i] =3D 42.;

double *T =3D &V[0];

for(int i=3D0;i<n;i++)
cout << T[i] << endl;

Est-ce que cela fonctionne quelque soit l'impl=E9mentation de la stl ?
Autrement dit est-ce que V[0] renvoie bien toujours une r=E9ference vers
un double qui est le premier double dans un tableau (au sens C) o=F9 sont
rang=E9s les elements de mon std::vector .

V[0] pourrait renvoyer par exemple une r=E9ference vers un objet de type
ref pour lequel l'op=E9rateur de convertion operator double() est
d=E9fini. Prendre l'adresse de cet objet ref pour l'affecter dans un double
* provoquerait alors une erreur =E0 la compilation.

J'=E9sp=E8re que ma question est bien pos=E9e.

Bien =E0 vous,
S=E9bastien

--

int main(){int j=3D1234,putchar();char t[]=3D":@abcdefghij-lmnopqrstuv"
"wxyz.\n",*i=3D"@jq:.pn.q:ibf.gd\noz.dn@ew\nlwh-i",*strchr();while(*i)
{j+=3Dstrchr(t,*i++)-t;j%=3Dsizeof t-1;putchar(t[j]);}return 0;}

3 réponses

Avatar
Mungo Deepdelver[CEA][SDF]
On Sat, 5 Mar 2005, Mungo Deepdelver[CEA][SDF] wrote:


Bonjour,
j'utilise l'implementation gnu de la stl.
actuellemnt pour passer d'un std::vector<double*> a un double *
std::vector<double>

je procéde comme dans ce petit exemple :

const int n = 10;

std::vector<double> V(n);

for(int i=0;i<n;i++)
V[i] = 42.;

double *T = &V[0];

for(int i=0;i<n;i++)
cout << T[i] << endl;

Est-ce que cela fonctionne quelque soit l'implémentation de la stl ?
Autrement dit est-ce que V[0] renvoie bien toujours une réference vers
un double qui est le premier double dans un tableau (au sens C) où sont
rangés les elements de mon std::vector .

V[0] pourrait renvoyer par exemple une réference vers un objet de type
ref pour lequel l'opérateur de convertion operator double() est
défini. Prendre l'adresse de cet objet ref pour l'affecter dans un doub le
* provoquerait alors une erreur à la compilation.

J'éspère que ma question est bien posée.

Bien à vous,
Sébastien

--

int main(){int j34,putchar();char t[]=":@abcdefghij-lmnopqrstuv"
"wxyz.n",*i="@jq:.pn.q:",*strchr();while(*i)
{j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}



--

int main(){int j34,putchar();char t[]=":@abcdefghij-lmnopqrstuv"
"wxyz.n",*i="@jq:.pn.q:",*strchr();while(*i)
{j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}

Avatar
Loïc Joly
Bonjour,
j'utilise l'implementation gnu de la stl.
actuellemnt pour passer d'un std::vector<double*> a un double *
je procéde comme dans ce petit exemple :

const int n = 10;

std::vector<double> V(n);

for(int i=0;i<n;i++)
V[i] = 42.;

double *T = &V[0];

for(int i=0;i<n;i++)
cout << T[i] << endl;

Est-ce que cela fonctionne quelque soit l'implémentation de la stl ?
Autrement dit est-ce que V[0] renvoie bien toujours une réference vers
un double qui est le premier double dans un tableau (au sens C) où sont
rangés les elements de mon std::vector .


Initialement, ce n'était pas certain, même si toutes les implémentations
le faisaient. Depuis, un ajout de la norme précise que c'est légal.

--
Loïc

Avatar
kanze
Mungo Deepdelver[CEA][SDF] wrote:

j'utilise l'implementation gnu de la stl. actuellemnt pour
passer d'un std::vector<double*> a un double * je procéde
comme dans ce petit exemple :

const int n = 10;

std::vector<double> V(n);

for(int i=0;i<n;i++)
V[i] = 42.;

double *T = &V[0];

for(int i=0;i<n;i++)
cout << T[i] << endl;

Est-ce que cela fonctionne quelque soit l'implémentation de la
stl ?


Oui. Originalement, il n'était pas garanti par la norme, mais
toutes les implémentations le permettaient, et depuis, on a
changé la norme pour le garantir.

Autrement dit est-ce que V[0] renvoie bien toujours une
réference vers un double qui est le premier double dans un
tableau (au sens C) où sont rangés les elements de mon
std::vector .


Oui. Ce qu'on a effectivement ajouté à la norme, c'est la
garantie que les éléments d'un std::vector soient contigus.

V[0] pourrait renvoyer par exemple une réference vers un objet
de type ref pour lequel l'opérateur de convertion operator
double() est défini.


Ça n'a jamais été permis. Le problème de fond, c'est qu'il faut
que std::vector supporte des choses comme :

v[ i ].function() ;

Or, le langage C++ ne permet pas le surcharge de l'opérateur
`.'. Du coup, la seule façon pour que ça marche, c'est que
l'opérateur renvoie une référence à l'élément même.

C'est une faiblesse du langage, même si pour des raisons
d'interface avec le C (et avec tant de API existant), on
n'aimerait pas le voir servir dans std::vector.

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