Konvertieren eines vector<int> in einen string
Ich habe eine vector<int>
container, ganze zahlen (z.B. {1,2,3,4}), und ich möchte um konvertieren zu einem string der form
"1,2,3,4"
Was ist die sauberste Art und Weise zu tun, dass in C++?
In Python ist dies, wie ich es tun würde:
>>> array = [1,2,3,4]
>>> ",".join(map(str,array))
'1,2,3,4'
- Verwandte Themen: stackoverflow.com/questions/4850473/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Definitiv nicht so elegant wie in Python, aber nichts ganz so elegant wie in Python in C++.
Könnte man eine
stringstream
...Sie könnten auch Gebrauch machen von
std::for_each
statt.std::string s = ss.str()
. Wenn Sie möchten, eineconst char*
verwendens.c_str()
. (Beachten Sie, dass, während syntaktisch korrekt,ss.str().c_str()
wird Ihnen eineconst char*
dass die Punkte in ein temporäres, die aufhören wird, zu existieren am Ende des vollständigen Ausdrucks. Das tut weh.)#include <sstream>
Verwendung von std::for_each und lambda können Sie etwas tun, interessant.
Sehen diese Frage für eine kleine Klasse, die ich schrieb. Diese werden nicht gedruckt das nachgestellte Komma. Auch wenn wir davon ausgehen, dass C++14 wird fortgesetzt um uns-range-basiert äquivalente algorithmen wie diese:
join
eher als ein BeitrittOutputIterator
, aber er meint es genauso.Können Sie die Verwendung von std::accumulate. Betrachten Sie das folgende Beispiel
Andere alternative ist die Verwendung von
std::copy
und dieostream_iterator
Klasse:Auch nicht so schön wie Python.
Für diesen Zweck habe ich eine
join
Funktion:Dann verwendet es wie folgt:
Könnte man Fragen, warum ich ging in die Iteratoren. Naja, eigentlich wollte ich umkehren, array, so habe ich es wie folgt:
Im Idealfall würde ich gerne die Vorlage zu dem Punkt, wo es ableiten kann, der char-Typ und die Verwendung von string-streams, aber ich konnte nicht herausfinden noch.
join
Funktion kann verwendet werden, mit Vektoren, wie gut? Können Sie bitte geben Sie Beispiel, ich bin neu in C++.Mit Boost und C++11 erreicht werden könnte dies, wie diese:
Naja, fast. Hier ist das komplette Beispiel:
Kredit Praetorian.
Die Sie behandeln können einen beliebigen Wert geben wie diese:
Dies ist nur ein Versuch, das Rätsel zu lösen gegeben durch 1800 INFORMATIONEN die Bemerkung auf seiner zweiten Lösung fehlt, genericity, nicht ein Versuch, die Frage zu beantworten:
Funktioniert Auf Meiner Maschine(TM).
operator<<
überlastet). Natürlich, ein Typ ohneoperator<<
könnte dazu führen, dass sehr verwirrende Fehlermeldungen.join(v.begin(), v.end(), ",")
. Template-argument Abzug produziert nicht das richtige Ergebnis, wenn diesep
argument ist ein string-literal. Mein Versuch einer Lösung für dieses Problem. Auch die Bereitstellung einer modernen range-basierte überlastung.Viele Vorlage/Ideen. Mir ist nicht so generisch oder effizient, aber ich hatte gerade das gleiche problem und wollte dies werfen in den mix als etwas kurz und bündig. Es gewinnt auf kürzeste Anzahl der Zeilen... 🙂
substr(...)
verwendenpop_back()
zu entfernen, die letzten Zeichen, wird viel mehr klar und sauber dann.Wenn Sie wollen, zu tun
std::cout << join(myVector, ",") << std::endl;
können Sie etwas tun:Hinweis, diese Lösung ist die Verknüpfung direkt in den Ausgabe-stream anstatt eine sekundäre Puffer und wird mit jedem Typen, die einem operator<< auf einen ostream.
Funktioniert das auch, wo
boost::algorithm::join()
schlägt fehl, wenn Sie einevector<char*>
statt einervector<string>
.Ich wie 1800 die Antwort. Allerdings würde ich verschieben des ersten iteration der Schleife, als wie das Ergebnis der if-Anweisung nur die änderungen, sobald nach der ersten iteration
Das kann natürlich auch sein, reduziert bis zu weniger Aussagen, wenn Sie mögen:
++i
Ausnahme, wo Sie wirklich gebrauchti++
denn das war der einzige Weg, Sie würde nicht vergessen wenn es einen Unterschied gemacht. (Es war das gleiche mit mir, BTW.) Sie hatte gelernt, Java vor, wo alle Arten von C-Ismen sind en vogue, und es dauerte ein paar Monate (1 Vorlesung +Labor pro Woche arbeiten), aber in der end-die meisten von Ihnen gelernt, die Gewohnheit zu Prä-Inkrement.Gibt es einige interessante versuche, bietet eine elegante Lösung für das problem. Ich hatte eine Idee, mit Vorlagen-streams, um effektiv zu beantworten, die OP ' s ursprüngliche dilemma. Das ist zwar ein Alter post, ich hoffe, dass die zukünftigen Nutzer, die stolpern das finden meine Lösung vorteilhaft.
Zunächst einige Antworten (darunter die akzeptierte Antwort) fördern nicht die re-usability. Da C++ nicht bieten eine elegante Weise zu verbinden Zeichenfolgen in der standard-Bibliothek (die ich gesehen habe), wird es wichtig, eines zu erstellen, die flexibel und wiederverwendbar. Hier ist meine Chance:
Jetzt zu benutzen, könnte man einfach etwas tun, wie die folgenden:
Beachten Sie, wie die Verwendung von streams macht diese Lösung, die unglaublich flexibel, da können wir speichern unser Ergebnis in ein stringstream, um diese später zurückfordern, oder wir können schreiben Sie direkt an die Standardausgabe, eine Datei oder sogar eine Netzwerk-Verbindung umgesetzt als stream. Der Typ, der gedruckt wird, muss einfach iteratable und kompatibel mit den Quell-stream. STL stellt verschiedene streams, die kompatibel mit einer großen Auswahl von Arten. So konnte man wirklich in die Stadt gehen mit diesem. Aus der Spitze von meinem Kopf, Ihre vector von int, float, double, string, unsigned int, SomeObject* und vieles mehr.
std::stringstream
für große arrays, dastringstream
wird in der Lage sein, um Speicher zuzuweisen optimistisch in die Zukunft, führt zu O(n.log(n)) Leistung anstelle von O(n2) für ein array der Größen
für diese Antwort. Auchstringstream
könnte nicht bauen temporäre strings fürto_string(i)
.Habe ich eine helper-header-Datei fügen Sie eine erweiterte join-Unterstützung.
Fügen Sie einfach den code unten, um Ihre Allgemeine header-Datei und schließen Sie Sie, wenn nötig.
Beispiele:
Den code hinter der Szene:
Hier ist eine generische C++ - 11-Lösung, mit denen Sie zu tun
Der code ist:
Im folgenden ist eine einfache und praktische Art und Weise zu konvertieren Elemente, die in einem
vector
zu einemstring
:Müssen Sie
#include <sstream>
fürostringstream
.Erweiterung auf den Versuch von @sbi an einem generische Lösung, dass nicht nur
std::vector<int>
oder einer bestimmten Rendite string-Typ. Der code unten kann z.B. so verwendet werden:In den originalen code, template-argument der Abzug nicht funktioniert, zu produzieren, das Recht auf Rückkehr-string-Typ, wenn der separator ein string ein literal ist (wie in den Beispielen oben). In diesem Fall werden die Typdefinitionen wie
Str::value_type
in der Funktion Körper sind falsch. Der code geht davon aus, dassStr
ist immer auch eine Art wiestd::basic_string
, so ist es offensichtlich fehl, die für string-Literale.Um dies zu beheben, den folgenden code versucht, um daraus nur die Charakter Typ aus der separator-argument und verwendet Sie, um zu produzieren ein Standard-Rückgabe-string-Typ. Dies wird erreicht, indem
boost::range_value
, die Extrakte, die den Typ des Elements aus dem gegebenen Bereich geben.Nun können wir problemlos eine range-basierte überlastung, die einfach nach vorne, um den iterator-basierten überlast:
Live-Demo bei Coliru
als @capone hat ,
Dann können wir den Aufruf wie folgt aus :
genau wie python :
Ich so etwas wie das
Begann ich mit @sbi Antwort, aber die meiste Zeit endete Rohrleitungen den resultierenden string in einen stream, so erstellt die unter Lösung geleitet werden können, um einen Strom, ohne den overhead für das erzeugen der vollständigen Zeichenfolge im Arbeitsspeicher.
Ist es wie folgt verwendet:
Wo string_join.h:
Habe ich schrieb Sie den folgenden code. Es ist in C# string.join. Es arbeitet mit std::string und std::wstring und viele Arten von Vektoren. (Beispiele in den Kommentaren)
Nennen mag:
Code: