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


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
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