Sem (o óbvio) construir primeiro uma string de estilo C e então usá-la para criar uma string std :: string, existe uma maneira mais rápida / alternativa / "melhor" de inicializar uma string a partir de um vetor de caracteres?
Sem (o óbvio) construir primeiro uma string de estilo C e então usá-la para criar uma string std :: string, existe uma maneira mais rápida / alternativa / "melhor" de inicializar uma string a partir de um vetor de caracteres?
Respostas:
Eu acho que você pode apenas fazer
std::string s( MyVector.begin(), MyVector.end() );
onde MyVector é seu std :: vector.
_ITERATOR_DEBUG_LEVEL=1(nesse caso, parece funcionar bem).
Com C ++ 11, você pode fazer std::string(v.data())ou, se o seu vetor não contiver um '\0'no final std::string(v.data(), v.size()),.
string(&v[0], v.size())deve funcionar também, mas só depois assert(not v.empty());, já que se o vetor estiver vazio, ambos v[0]e v.front()invocariam um comportamento indefinido. Esse, além da simplicidade sintática de não ter que usar o operador address-of, é o real benefício da data()função do C ++ 11 , que funciona mesmo em um vetor vazio.
std::string(v.data())pode levar uma string mais longa. Portanto, não use desta forma.
std::string(v.data(), v.size()), o que foi explicitamente mencionado na resposta exatamente por esse motivo?
std::string s(v.begin(), v.end());
Onde v é praticamente qualquer coisa iterável. (Especificamente, begin () e end () devem retornar InputIterators.)
Apenas para completar, outra maneira é std::string(&v[0])(embora você precise garantir que sua string tenha terminação nula estd::string(v.data()) seja geralmente a preferida.
A diferença é que você pode usar a técnica anterior para passar o vetor para funções que desejam modificar o buffer, o que você não pode fazer com .data ().
data()para modificar o buffer? Parece-me que se você chamar data()um vetor não const, ele retornará a T *(e se o seu vetor for const, 'v [0] `retornará a de T const &qualquer maneira).
vfosse uma string, mas o tipo de destino é uma string e vé um vetor. (Mas é bom ver que C ++ 17 dará paridade de strings com vetor.)
Gosto da resposta de Stefan (11 de setembro de 13), mas gostaria de torná-la um pouco mais forte:
Se o vetor terminar com um terminador nulo, você não deve usar (v.begin (), v.end ()): você deve usar v.data () (ou & v [0] para aqueles anteriores a C ++ 17) .
Se v não tiver um terminador nulo, você deve usar (v.begin (), v.end ()).
Se você usar begin () e end () e o vetor tiver um zero final, você terminará com uma string "abc \ 0" por exemplo, que tem comprimento 4, mas deveria ser apenas "abc".
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))mas com astd::stringcomo o novo objeto.