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?
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?
Antworten:
Ich denke du kannst es einfach tun
std::string s( MyVector.begin(), MyVector.end() );
Dabei ist MyVector Ihr std :: vector.
_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()).
string(&v[0], v.size())funktionieren, aber erst danach assert(not v.empty());, da, wenn der Vektor leer ist, beide v[0]und v.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 der data()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?
std::string s(v.begin(), v.end());
Wobei v so ziemlich alles iterierbar ist. (Insbesondere begin () und end () müssen InputIterators zurückgeben.)
Der Vollständigkeit halber ist ein anderer Weg std::string(&v[0])(obwohl Sie sicherstellen müssen, dass Ihre Zeichenfolge nullterminiert ist und std::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.
data()den Puffer nicht ändern? Es sieht für mich so aus, als würde data()ein a-nicht konstanter Vektor a zurückgeben T *(und wenn Ihr Vektor const ist, würde 'v [0] ` T const &ohnehin a zurückgeben).
ves eine Zeichenfolge wäre, aber der Zieltyp ist eine Zeichenfolge und vein 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.
vector<char> vec;
//fill the vector;
std::string s(vec.begin(), vec.end());
std::vector<char> v2(std::move(v))aber mit einemstd::stringals neuem Objekt.