[c++] Conversion vector<T> en T*

Conversion vector<T> en T* [c++] - C++ - Programmation

Marsh Posté le 12-10-2004 à 21:33:48    

Bonsoir,
 
   A l'image de string::c_str(), existe t il une methode pour realiser cette conversion. Sinon quelle serait la méthode la plus économique.
 
Merci.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 12-10-2004 à 21:33:48   

Reply

Marsh Posté le 12-10-2004 à 21:37:34    

serait-il possible, pour commencer, de savoir pourquoi tu veux faire ca?


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
Reply

Marsh Posté le 12-10-2004 à 21:38:53    

Je developpe un wrapper C++ pour encapsuler une lib ecrite  C. Les fonctions C attendent un T* en argument, alors que je travaille avec des vector<T>.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 12-10-2004 à 22:40:20    

vector::begin ....

Reply

Marsh Posté le 12-10-2004 à 23:01:12    

&v[0] également, c'est imposé dans la spécification de std::vector<T>

Reply

Marsh Posté le 12-10-2004 à 23:22:12    

j'ai toujours trouvé ca moche &v[0] :o

Reply

Marsh Posté le 12-10-2004 à 23:23:41    

Joel F a écrit :

j'ai toujours trouvé ca moche &v[0] :o


C'est vector::begin qui est crade je dirais. Rien n'impose dans la norme que celui-ci soit un pointeur

Reply

Marsh Posté le 12-10-2004 à 23:27:19    

Kristoph a écrit :

C'est vector::begin qui est crade je dirais. Rien n'impose dans la norme que celui-ci soit un pointeur


 
o_O
 
pardon
 
vector<float> a.
float* pa = a.begin();
 
ca a plsu de guele que pa = &a[0];

Reply

Marsh Posté le 12-10-2004 à 23:28:35    

Joel F a écrit :

o_O
float* pa = a.begin();


cay pas portable bordel!  :o


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 12-10-2004 à 23:28:59    

schnapsmann a écrit :

cay pas portable bordel!  :o

 
 
 [:le kneu]  [:autobot]  [:alfone]

Reply

Marsh Posté le 12-10-2004 à 23:28:59   

Reply

Marsh Posté le 12-10-2004 à 23:48:28    

hum, de ce que je me souviens, l'implémentation des iterator est dépendantes du système. Ce qui est sur, c'est T == iterator::value_type. Donc faudrait faire T *first = &*begin(); ... faudrait faire une petite recherche la dessus.
 
les reference et const_reference sont des T et l-value-T

Reply

Marsh Posté le 13-10-2004 à 07:57:48    

Farpaitement. D'ailleurs, la STL de base de GCC 3.X (valable au moins pour X=0 et X=1) est comme ça. vector::iterator n'est pas un pointeur, mais un objet (c'est l'une des rares implémentations à le faire d'ailleurs, ce qui justifie pas mal de questions dans sa FAQ).

Reply

Marsh Posté le 13-10-2004 à 09:15:39    

&v.first() est sans doute plus lisible

Reply

Marsh Posté le 13-10-2004 à 21:44:14    

Lam's a écrit :

Farpaitement. D'ailleurs, la STL de base de GCC 3.X (valable au moins pour X=0 et X=1) est comme ça. vector::iterator n'est pas un pointeur, mais un objet (c'est l'une des rares implémentations à le faire d'ailleurs, ce qui justifie pas mal de questions dans sa FAQ).


 
voila merci, JoelF --> DTC  :D


---------------
From now on, you will speak only when spoken to, and the first and last words out of your filthy sewers will be "Sir!"
Reply

Marsh Posté le 13-10-2004 à 21:58:53    

Donc je remplace

Code :
  1. T* pt = new T[ v.size() ];
  2. copy( v.begin(), v.end(), pt );


par

Code :
  1. T* pt = &v.first();


Cela reste portable, si je conclue bien.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-10-2004 à 22:01:25    

oui (ou comme déjà dit &v[0] est également OK)

Reply

Marsh Posté le 13-10-2004 à 22:02:30    

Ok, merci de votre aide.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-10-2004 à 22:04:36    

par contre, si j'étais toi, je rajouterais un T * const p = machin; sinon tu va vite être tenter d'itérer ton vector directement avec p, tu perdrais alors tout le bénéfice des iterator

Reply

Marsh Posté le 13-10-2004 à 22:15:39    

c'est plutot vector::front() au passage.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-10-2004 à 22:16:35    

oui :D

Reply

Marsh Posté le 13-10-2004 à 22:16:41    

La conversion passe bien mais je me fais couillonné par l'API écrite en C au final. Je suis obligé de const_caster au moment de l'appel de la fonction C.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-10-2004 à 22:17:18    

heink ?

Reply

Marsh Posté le 13-10-2004 à 22:19:47    

Code :
  1. void f(int *);
  2. void g(const int *);
  3. void h()
  4. {
  5.   std::vector<int> v;
  6.   f(&v[0]);
  7.   g(&v[0]);
  8. }

Reply

Marsh Posté le 13-10-2004 à 22:19:52    

Code :
  1. void write_cpp( const vector< unsigned char >& p )
  2. {
  3. write_c( const_cast<unsigned char*>( &p.front() ), p.size() );
  4. }


Message édité par xterminhate le 13-10-2004 à 22:24:35

---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le 13-10-2004 à 22:20:23    

ben évidemment, si ton machin C est défaillant niveau constness ...

Reply

Marsh Posté le 13-10-2004 à 22:21:47    

schnapsmann a écrit :

voila merci, JoelF --> DTC  :D


 
ca fait mal  [:everything4free]

Reply

Marsh Posté le 13-10-2004 à 22:22:07    

Distribuer des lib pour un OS récent avec une API en C aussi pourri... je comprends pas.


---------------
Cordialement, Xterm-in'Hate...
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed