Aparte de (lo obvio) construir una cadena de estilo C primero y luego usarla para crear una std :: string, ¿hay una forma más rápida / alternativa / "mejor" de inicializar una cadena a partir de un vector de caracteres?
Aparte de (lo obvio) construir una cadena de estilo C primero y luego usarla para crear una std :: string, ¿hay una forma más rápida / alternativa / "mejor" de inicializar una cadena a partir de un vector de caracteres?
Respuestas:
Creo que puedes hacer
std::string s( MyVector.begin(), MyVector.end() );
donde MyVector es su std :: vector.
_ITERATOR_DEBUG_LEVEL=1(en cuyo caso parece funcionar bien).
Con C ++ 11, puede hacer std::string(v.data())o, si su vector no contiene un '\0'al final std::string(v.data(), v.size()),.
string(&v[0], v.size())debería funcionar también, pero solo después assert(not v.empty());, ya que si el vector está vacío, ambos v[0]e v.front()invocarían un comportamiento indefinido. Eso, aparte de la simplicidad sintáctica de no tener que usar el operador address-of, es el beneficio real de la data()función de C ++ 11 , que funciona incluso en un vector vacío.
std::string(v.data())puede llevar una cadena más larga. Así que no lo use de esta manera.
std::string(v.data(), v.size()), que se mencionó explícitamente en la respuesta por esa razón exacta?
std::string s(v.begin(), v.end());
Donde v es prácticamente cualquier cosa iterable. (Específicamente begin () y end () deben devolver InputIterators.)
Solo para completar, otra forma es std::string(&v[0])(aunque debe asegurarse de que su cadena tenga terminación nula y std::string(v.data())generalmente sea la preferida.
La diferencia es que puede usar la técnica anterior para pasar el vector a funciones que quieran modificar el búfer, lo que no puede hacer con .data ().
data()para modificar el búfer? Me parece que si llama data()a un vector no constante, devolverá un T *(y si su vector es constante, 'v [0] `devolverá un de T const &todos modos).
vfuera una cadena, pero el tipo de destino es una cadena y ves un vector. (Pero es bueno ver que C ++ 17 le dará a las cadenas paridad con el vector)
Me gusta la respuesta de Stefan (11 de septiembre de 2013) pero me gustaría hacerla un poco más fuerte:
Si el vector termina con un terminador nulo, no debe usar (v.begin (), v.end ()): debe usar v.data () (o & v [0] para aquellos anteriores a C ++ 17) .
Si v no tiene un terminador nulo, debe usar (v.begin (), v.end ()).
Si usa begin () y end () y el vector tiene un cero final, terminará con una cadena "abc \ 0", por ejemplo, que es de longitud 4, pero en realidad debería ser solo "abc".
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))pero con astd::stringcomo el nuevo objeto.