GNT sans publicité, site mobile, fonctionnalitées exclusives...

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;}
Lire les 3 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Mungo Deepdelver[CEA][SDF]
Le #237956
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;}

Loïc Joly
Le #237955
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

kanze
Le #237951
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

Publicité
Suivre les réponses
Poster une réponse
Anonyme