2011-12-20 27 views
30

En C++, ¿cuál es la forma más sencilla de convertir un vector de ints (es decir, vector<int>) en una cadena?Conversión de un vector a cadena

+4

¿Una cadena de qué? ¿Cómo piensas convertir cada entero en una cadena? ¿Representan los códigos de caracteres ASCII, o está tratando de construir una lista de números separados por comas? – meagar

+0

¿Cómo desea que se vea la salida? – Mark

+0

Digamos que el vector es: [1, 4, 7, 4, 9, 7], la cadena será "1,4,7,4,9,7" – shn

Respuesta

40

Tal std::ostream_iterator y std::ostringstream:

#include <vector> 
#include <string> 
#include <algorithm> 
#include <sstream> 
#include <iterator> 
#include <iostream> 

int main() 
{ 
    std::vector<int> vec; 
    vec.push_back(1); 
    vec.push_back(4); 
    vec.push_back(7); 
    vec.push_back(4); 
    vec.push_back(9); 
    vec.push_back(7); 

    std::ostringstream oss; 

    if (!vec.empty()) 
    { 
    // Convert all but the last element to avoid a trailing "," 
    std::copy(vec.begin(), vec.end()-1, 
     std::ostream_iterator<int>(oss, ",")); 

    // Now add the last element with no delimiter 
    oss << vec.back(); 
    } 

    std::cout << oss.str() << std::endl; 
} 
+7

Vale la pena señalar que 'vec.end() - 1 'solo está bien definido si uno sabe _de seguro_ que' vec' no está vacío. – ildjarn

+1

@ildjarn: Buen punto. Lo mismo para 'vec.back()'. –

+0

con este enfoque, ¿es posible forzar algún tipo de relleno? por ejemplo, para que todos los números usen 4 posiciones, independientemente de la cantidad de dígitos que tengan –

5

Aquí es una alternativa que utiliza un iterador de salida personalizado. Este ejemplo se comporta correctamente para el caso de una lista vacía. Este ejemplo muestra cómo crear un iterador de salida personalizado, similar al std::ostream_iterator.

#include <iterator> 
#include <vector> 
#include <iostream> 
#include <sstream> 

struct CommaIterator 
: 
    public std::iterator<std::output_iterator_tag, void, void, void, void> 
{ 
    std::ostream *os; 
    std::string comma; 
    bool first; 

    CommaIterator(std::ostream& os, const std::string& comma) 
    : 
    os(&os), comma(comma), first(true) 
    { 
    } 

    CommaIterator& operator++() { return *this; } 
    CommaIterator& operator++(int) { return *this; } 
    CommaIterator& operator*() { return *this; } 
    template <class T> 
    CommaIterator& operator=(const T& t) { 
    if(first) 
     first = false; 
    else 
     *os << comma; 
    *os << t; 
    return *this; 
    } 
}; 

int main() { 
    // The vector to convert 
    std::vector<int> v(3,3); 

    // Convert vector to string 
    std::ostringstream oss; 
    std::copy(v.begin(), v.end(), CommaIterator(oss, ",")); 
    std::string result = oss.str(); 
    const char *c_result = result.c_str(); 

    // Display the result; 
    std::cout << c_result << "\n"; 
} 
34

por lo general lo hago de esta manera ...

#include <string> 
#include <vector> 

int main(int argc, char* argv[]) 
{ 
    std::vector<char> vec; 
    //... do something with vec 
    std::string str(vec.begin(), vec.end()); 
    //... do something with str 
    return 0; 
} 
+0

¿qué archivos de encabezado deben incluirse? – qed

+0

Esto es bueno para mostrar, pero no se puede usar para unir con delimitador arbitrario. – mtk

0
template<typename T> 
string str(T begin, T end) 
{ 
    stringstream ss; 
    bool first = true; 
    for (; begin != end; begin++) 
    { 
     if (!first) 
      ss << ", "; 
     ss << *begin; 
     first = false; 
    } 
    return ss.str(); 
} 

Ésta es la función str que puede hacer que los enteros se convierten en una cadena y no en un char por lo que el número entero representa. También funciona para dobles.

+0

Estaba confundido su llamada al constructor de cadenas con una llamada a una función llamada str. Druciferre no imprimirá una lista separada de números de coma, intentará convertir los números en un char. – kpgbrink

+0

Lo siento, la pregunta no fue lo suficientemente específica como para saber exactamente lo que quería. No leí los otros comentarios. – kpgbrink