std::vector vers double*
Le
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é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 double
* provoquerait alors une erreur à la compilation.
J'éspère que ma question est bien posée.
Bien à vous,
Sébastien
--
int main(){int j=1234,putchar();char t[]=":@abcdefghij-lmnopqrstuv"
"wxyz.",*i="@jq:.pn.q:ibf.gdoz.dn@ewlwh-i",*strchr();while(*i)
{j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}
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 .
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 double
* provoquerait alors une erreur à la compilation.
J'éspère que ma question est bien posée.
Bien à vous,
Sébastien
--
int main(){int j=1234,putchar();char t[]=":@abcdefghij-lmnopqrstuv"
"wxyz.",*i="@jq:.pn.q:ibf.gdoz.dn@ewlwh-i",*strchr();while(*i)
{j+=strchr(t,*i++)-t;j%=sizeof t-1;putchar(t[j]);}return 0;}

Poser une question


--
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;}
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
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.
Oui. Ce qu'on a effectivement ajouté à la norme, c'est la
garantie que les éléments d'un std::vector soient contigus.
Ç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