À part (ce qui est évident), construire d'abord une chaîne de style C puis l'utiliser pour créer une chaîne std :: string, existe-t-il un moyen plus rapide / alternatif / "meilleur" d'initialiser une chaîne à partir d'un vecteur de caractères?
À part (ce qui est évident), construire d'abord une chaîne de style C puis l'utiliser pour créer une chaîne std :: string, existe-t-il un moyen plus rapide / alternatif / "meilleur" d'initialiser une chaîne à partir d'un vecteur de caractères?
Réponses:
Je pense que tu peux juste faire
std::string s( MyVector.begin(), MyVector.end() );
où MyVector est votre std :: vector.
_ITERATOR_DEBUG_LEVEL=1(auquel cas cela semble fonctionner correctement).
Avec C ++ 11, vous pouvez faire std::string(v.data())ou, si votre vecteur ne contient pas de a '\0'à la fin std::string(v.data(), v.size()),.
string(&v[0], v.size())devrait fonctionner aussi, mais seulement après assert(not v.empty());, puisque si le vecteur est vide, les deux v[0]et v.front()invoqueraient un comportement indéfini. Cela, mis à part la simplicité syntaxique de ne pas avoir à utiliser l'opérateur address-of, est le véritable avantage de la data()fonction de C ++ 11 , qui fonctionne même sur un vecteur vide.
std::string(v.data())peut entraîner une chaîne plus longue. Alors n'utilisez pas de cette façon.
std::string(v.data(), v.size()), qui a été explicitement mentionné dans la réponse pour cette raison exacte?
std::string s(v.begin(), v.end());
Où v est à peu près tout itérable. (Plus précisément, begin () et end () doivent renvoyer des InputIterators.)
Juste pour être complet, une autre méthode est std::string(&v[0])(même si vous devez vous assurer que votre chaîne se termine par un caractère nul et qu'elle std::string(v.data())est généralement préférable.
La différence est que vous pouvez utiliser l'ancienne technique pour passer le vecteur aux fonctions qui souhaitent modifier le tampon, ce que vous ne pouvez pas faire avec .data ().
data()pour modifier le tampon? Il me semble que si vous appelez data()un vecteur non-const, il retournera a T *(et si votre vecteur est const, 'v [0] `renverra de T const &toute façon).
vs'agissait d'une chaîne, mais le type cible est une chaîne et vest un vecteur. (Mais il est agréable de voir que C ++ 17 donnera la parité des chaînes avec le vecteur.)
J'aime la réponse de Stefan (11 septembre 2013) mais j'aimerais la rendre un peu plus forte:
Si le vecteur se termine par un terminateur nul, vous ne devez pas utiliser (v.begin (), v.end ()): vous devez utiliser v.data () (ou & v [0] pour ceux antérieurs à C ++ 17) .
Si v n'a pas de terminateur nul, vous devez utiliser (v.begin (), v.end ()).
Si vous utilisez begin () et end () et que le vecteur a un zéro de fin, vous vous retrouverez avec une chaîne "abc \ 0" par exemple, qui est de longueur 4, mais ne devrait vraiment être que "abc".
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))mais avec astd::stringcomme nouvel objet.