À 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?
115
std::vector<char> v2(std::move(v))
mais avec astd::string
comme nouvel objet.Réponses:
Eh bien, le meilleur moyen est d'utiliser le constructeur suivant:
ce qui conduirait à quelque chose comme:
la source
Je pense que tu peux juste faire
où MyVector est votre std :: vector.
la source
_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 finstd::string(v.data(), v.size())
,.la source
string(&v[0], v.size())
devrait fonctionner aussi, mais seulement aprèsassert(not v.empty());
, puisque si le vecteur est vide, les deuxv[0]
etv.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 ladata()
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?Où v est à peu près tout itérable. (Plus précisément, begin () et end () doivent renvoyer des InputIterators.)
la source
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'ellestd::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 ().
la source
data()
pour modifier le tampon? Il me semble que si vous appelezdata()
un vecteur non-const, il retournera aT *
(et si votre vecteur est const, 'v [0] `renverra deT const &
toute façon).v
s'agissait d'une chaîne, mais le type cible est une chaîne etv
est 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".
la source
la source