Gibt es eine schnellere / alternative / "bessere" Möglichkeit, eine Zeichenfolge aus einem Zeichenvektor zu initialisieren, ohne (offensichtlich) zuerst eine Zeichenfolge im C-Stil zu erstellen und dann eine std :: Zeichenfolge zu erstellen?
115
std::vector<char> v2(std::move(v))
aber mit einemstd::string
als neuem Objekt.Antworten:
Der beste Weg ist, den folgenden Konstruktor zu verwenden:
was zu so etwas führen würde wie:
quelle
Ich denke du kannst es einfach tun
Dabei ist MyVector Ihr std :: vector.
quelle
_ITERATOR_DEBUG_LEVEL=1
(in diesem Fall scheint es einwandfrei zu funktionieren).Mit C ++ 11 können Sie
std::string(v.data())
oder, wenn Ihr Vektor'\0'
am Ende kein enthält , ,std::string(v.data(), v.size())
.quelle
string(&v[0], v.size())
funktionieren, aber erst danachassert(not v.empty());
, da, wenn der Vektor leer ist, beidev[0]
undv.front()
undefiniertes Verhalten aufrufen würden. Abgesehen von der syntaktischen Einfachheit, den Address-of-Operator nicht verwenden zu müssen, ist dies der eigentliche Vorteil derdata()
Funktion von C ++ 11 , die auch auf einem leeren Vektor funktioniert.std::string(v.data())
möglicherweise zu einer längeren Zeichenfolge. Verwenden Sie diesen Weg also nicht.std::string(v.data(), v.size())
, was in der Antwort genau aus diesem Grund ausdrücklich erwähnt wurde?Wobei v so ziemlich alles iterierbar ist. (Insbesondere begin () und end () müssen InputIterators zurückgeben.)
quelle
Der Vollständigkeit halber ist ein anderer Weg
std::string(&v[0])
(obwohl Sie sicherstellen müssen, dass Ihre Zeichenfolge nullterminiert ist undstd::string(v.data())
im Allgemeinen vorzuziehen ist.Der Unterschied besteht darin, dass Sie die erstere Technik verwenden können, um den Vektor an Funktionen zu übergeben, die den Puffer ändern möchten, was mit .data () nicht möglich ist.
quelle
data()
den Puffer nicht ändern? Es sieht für mich so aus, als würdedata()
ein a-nicht konstanter Vektor a zurückgebenT *
(und wenn Ihr Vektor const ist, würde 'v [0] `T const &
ohnehin a zurückgeben).v
es eine Zeichenfolge wäre, aber der Zieltyp ist eine Zeichenfolge undv
ein Vektor. (Aber es ist schön zu sehen, dass C ++ 17 Strings Parität mit Vektor gibt.)Ich mag Stefans Antwort (11. September 13), möchte sie aber etwas stärker machen:
Wenn der Vektor mit einem Nullterminator endet, sollten Sie nicht (v.begin (), v.end ()) verwenden: Sie sollten v.data () (oder & v [0] für diejenigen vor C ++ 17) verwenden. .
Wenn v keinen Nullterminator hat, sollten Sie (v.begin (), v.end ()) verwenden.
Wenn Sie begin () und end () verwenden und der Vektor eine abschließende Null hat, erhalten Sie beispielsweise eine Zeichenfolge "abc \ 0", die die Länge 4 hat, aber eigentlich nur "abc" sein sollte.
quelle
quelle