2010-03-25 31 views
11

Estoy tratando de pasar un valor de C++ a TCL. Como no puedo pasar los punteros sin el uso de algunos módulos complicados, estaba pensando en convertir un vector en una matriz de caracteres y luego pasar esto como una cadena terminada nula (que es relativamente fácil).¿Cómo transformar un vector <int> en una cadena?

que tienen un vector de la siguiente manera:

12, 32, 42, 84 

que quiero convertir en algo como:

"12 32 42 48" 

El enfoque que estoy pensando es utilizar un iterador para recorrer el vector y luego convierta cada entero en su representación de cadena y luego agréguelo a una matriz char (que se crea dinámicamente inicialmente al pasar el tamaño del vector). ¿Es esta la manera correcta o hay una función que ya lo hace?

+0

Wow, yo también. Exactamente este escenario! –

Respuesta

40

¿Qué hay de:

std::stringstream result; 
std::copy(my_vector.begin(), my_vector.end(), std::ostream_iterator<int>(result, " ")); 

entonces puede pasar el puntero del result.str().c_str()

+0

Esto no incluirá los espacios, ¿o sí? –

+0

El espacio se pasa al iterador, por lo que se incluirán. – stefaanv

+2

Señor, nunca más me olvidaré de ostream_iterator y copio. Gracias. –

2

Has acertado, pero puedes usar std::ostringstream para crear tu matriz de caracteres.

#include <sstream> 

std::ostringstream StringRepresentation; 
for (vector<int>::iterator it = MyVector.begin(); it != MyVector.end(); it++) { 
    StringRepresentation << *it << " "; 
} 

const char * CharArray = StringRepresentation.str().c_str(); 

En este caso, CharArray es solo para lectura. Si desea modificar los valores, tendrá que copiarlo. Puede simplificar esto usando Boost.Foreach.

3

que haría uso de un stringstream para crear la cadena. Algo así como:

std::vector<int>::const_iterator it; 
std::stringstream s; 
for(it = vec.begin(); it != vec.end(); ++it) 
{ 
    if(it != vec.begin()) 
     s << " "; 

    s << *it; 
} 

// Now use s.str().c_str() to get the null-terminated char pointer. 
+0

+1 para evitar el espacio final de mi sugerencia. –

+0

A expensas de comparaciones adicionales if (it! = Vec.begin()). – Viet

4

Puede utilizar copy en conjunción con un objeto stringstream y el adaptador ostream_iterator:

#include <iostream> 

#include <sstream> 
#include <string> 
#include <vector> 
#include <algorithm> 
using namespace std; 

int main() 
{ 
    vector<int> v; 
    v.push_back(12); 
    v.push_back(32); 
    v.push_back(42); 
    v.push_back(84); 

    stringstream ss; 
    copy(v.begin(), v.end(), ostream_iterator<int>(ss, " ")); 
    string s = ss.str(); 
    s = s.substr(0, s.length()-1); // get rid of the trailing space 

cout << "'" << s << "'"; 

    return 0; 
} 

salida es:

'12 32 42 84'

+0

Gracias por eliminación de espacios finales ... – Legend

+0

En caso de que su problema con tener VS2015 sobre el uso de ostream_iterator, incluyen como archivo de cabecera. – Akshay

Cuestiones relacionadas