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).
v
fosse 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::string
como o novo objeto.