2010-12-16 36 views
11

Tengo una función Visual Studio 2008 C++ donde me dan una matriz de cadenas terminadas en nulo const char* y un recuento de el número de cadenas en esa matriz.convirtiendo una matriz de cadenas terminadas nulas const char * a std :: vector <std :: string>

Busco una forma inteligente de convertir una serie de const char* a un impulso std::vector<std::string>

/// @param count - number of strings in the array 
/// @param array - array of null-terminated strings 
/// @return - a vector of stl strings 
std::vector<std::string> Convert(int count, const char* array[]); 

está bien, está bien STL.

Gracias, PaulH

+8

Eso no es un conjunto de '' const char *. ¿Quiere decir que las cadenas se almacenan secuencialmente y separadas por NULL? –

+2

Allí, lo arreglé porque el OP no respondía y la pregunta no tiene ningún sentido. –

+0

Por supuesto que tenía sentido, solo una diferente de la que está sugiriendo –

Respuesta

14

Algo como esto ?:

vector<string> ret(array, array + count); 
+0

@genpfault: Sí, eso sería más fácil :) * gime * a sí mismo ... –

+1

Siempre me sorprende la gente que trata de hacerlo por las malas. +1 por mantenerlo simple. –

+0

excepto que no funciona –

2

Suponiendo que la firma de su función es inadvertidamente mal, quiere usted decir algo como esto?

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

std::vector<std::string> Convert(int count, const char **arr) 
{ 
    std::vector<std::string> vec; 
    vec.reserve(count); 
    std::copy(arr, arr+count, std::back_inserter(vec)); 
    return vec; 
} 

int main() 
{ 
    const char *arr[3] = {"Blah", "Wibble", "Shrug"}; 
    std::vector<std::string> vec = Convert(3, arr); 
    return 0; 
} 
+0

Esto es con lo que comencé y por qué decidí hacer la pregunta. Sabía que había una manera más fácil ... Mi cerebro simplemente no estaba saliendo a la superficie. – PaulH

+0

@PaulH: Sí, es muy fácil olvidar que 'vector' tiene un constructor diseñado exactamente para esta situación, como creo que he probado en este caso :) –

0

Asumo en las cadenas de la matriz están separados por 0s.

std::vector<std::string> Convert(int count, const char* array) 
{ 
    std::vector<std::string> result; 

    for(const char* begin = array; count; --count) 
    { 
    const char* end = begin; 
    for(; *end; ++end); 
    result.push_back(std::string(begin, end)); 
    begin = end + 1; 
    } 

    return result; 
} 
+0

Hable acerca de no trabajar ... –

+0

Hable, de lo contrario es ... –

+0

Este código funciona para la pregunta original, más o menos. Es decir, originalmente la función del interrogador tenía esta firma, por lo que la suposición de que las cadenas están separadas por '\ 0' es razonable. En ese caso, este código funciona. Sin embargo, la pregunta fue editada. –

4

Prueba esto:

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


int main(int argc,char* argv[]) 
{ 
    // Put it into a vector 
    std::vector<std::string> data(argv, argv + argc); 

    // Print the vector to std::cout 
    std::copy(data.begin(), data.end(), std::ostream_iterator<std::string>(std::cout, "\n")); 
} 
Cuestiones relacionadas