Sie können die std::accumulate()
Standardfunktion aus dem Header <numeric>
verwenden (funktioniert, weil Eine Überladung von operator +
ist für string
s definiert, die die Verkettung ihrer zwei Argumente zurückgibt):
Alternativ können Sie einen effizienteren, kleinen for
-Zyklus verwenden:
Das ist so einfach, dass es mich erstaunt, wie viele kluge Leute es vermasselt haben.
C ++ 03:
%Vor%C ++ 11: (die MSVC2010-Teilmenge)
%Vor%C ++ 11:
%Vor% Verwenden Sie nicht std::accumulate
für String-Verkettung , es ist ein klassischer Schlemiel der Maler Algorithmus , sogar schlechter als das übliche Beispiel, das strcat
in C verwendet. Ohne die C ++ 11-Verschiebungssemantik entstehen für jedes Element des Vektors zwei unnötige Kopien des Akkumulators. Selbst mit der Bewegungssemantik wird immer noch eine unnötige Kopie des Akkumulators für jedes Element benötigt.
Die drei obigen Beispiele sind O (n) .
std::accumulate
ist O (n ^ 2) für Strings.
Sie könnten std::accumulate
O (n) für Strings angeben, indem Sie einen benutzerdefinierten Funktor angeben:
Beachten Sie, dass s
eine Referenz auf nicht-const sein muss, der Lambda-Rückgabetyp muss eine Referenz sein (daher decltype(auto)
) und der Body muss +=
nicht +
verwenden.
Meine persönliche Wahl wäre die bereichsbasierte for-Schleife, wie in Oktalists Antwort .
Boost bietet auch eine schöne Lösung:
%Vor%Dies druckt:
zuerst, Sekunde
Auf jeden Fall finde ich den std::accumulate()
einen Missbrauch dieses Algorithmus (ungeachtet der Komplexitätsprobleme).
Ein bisschen spät auf die Party, aber ich mochte die Tatsache, dass wir Initialisierungslisten verwenden können:
%Vor%Dann können Sie einfach (Python-Stil) aufrufen:
%Vor%Google Abseil hat die Funktion absl :: StrJoin, die das tut, was Sie brauchen.
Beispiel aus ihrer Kopfzeile .
Beachten Sie, dass das Trennzeichen auch ""
Tags und Links c++ stl string-concatenation stringstream stdstring