Ich möchte 'n' Leerzeichen (oder eine beliebige Zeichenfolge) am Anfang einer Zeichenfolge in C ++ einfügen. Gibt es eine direkte Möglichkeit, dies mit std :: strings oder char * strings zu tun?
ZB in Python könnte man das einfach machen
>>> "." * 5 + "lolcat"
'.....lolcat'
Antworten:
Im speziellen Fall der Wiederholung eines einzelnen Zeichens können Sie Folgendes verwenden
std::string(size_type count, CharT ch)
:NB. Dies kann nicht zum Wiederholen von Zeichenfolgen mit mehreren Zeichen verwendet werden.
quelle
Es gibt keine direkte idiomatische Möglichkeit, Zeichenfolgen in C ++ zu wiederholen, die dem Operator * in Python oder dem Operator x in Perl entsprechen. Wenn Sie ein einzelnes Zeichen wiederholen, funktioniert der Konstruktor mit zwei Argumenten (wie in den vorherigen Antworten vorgeschlagen) gut:
Dies ist ein erfundenes Beispiel dafür, wie Sie einen Ostringstream verwenden können, um einen String n-mal zu wiederholen:
Abhängig von der Implementierung kann dies etwas effizienter sein, als die Zeichenfolge n-mal einfach zu verketten.
quelle
Verwenden Sie eine der Formen von string :: insert:
Dadurch wird am Anfang der Zeichenfolge (Position 0) "....." (fünf Punkte) eingefügt.
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich wollte das Gleiche tun und habe eine meiner Meinung nach einfachere Lösung gefunden. Es scheint, dass cout diese Funktion mit cout.fill () integriert hat. Eine vollständige Erklärung finden Sie unter dem Link
http://www.java-samples.com/showtutorial.php?tutorialid=458
Ausgänge
quelle
cout << "" << endl;
Für die Zwecke des vom OP bereitgestellten Beispiels reicht der ctor von std :: string aus :
std::string(5, '.')
. Wenn jedoch jemand nach einer Funktion sucht, mit der std :: string mehrmals wiederholt werden kann:quelle
Wie Commodore Jaeger anspielte, glaube ich nicht, dass eine der anderen Antworten diese Frage tatsächlich beantwortet; In der Frage wird gefragt, wie eine Zeichenfolge und kein Zeichen wiederholt werden soll.
Die Antwort von Commodore ist zwar richtig, aber ziemlich ineffizient. Hier ist eine schnellere Implementierung. Die Idee ist, Kopiervorgänge und Speicherzuweisungen zu minimieren, indem zuerst die Zeichenfolge exponentiell vergrößert wird:
Wir können auch ein definieren
operator*
, um der Python-Version etwas näher zu kommen:Auf meinem Computer ist dies ungefähr 10x schneller als die von Commodore bereitgestellte Implementierung und ungefähr 2x schneller als eine naive Lösung, die n-1-mal anhängt.
quelle
+=
interne Schleife in Ihrer for-Schleife auch eine Art Schleife enthält, diestr.size()
Iterationen ausführt.str.size()
wächst in jeder Iteration der äußeren Schleife, sodass die innere Schleife nach jeder Iteration der äußeren Schleife mehr Iterationen durchführen muss. Ihre und die naive 'n-malige' Implementierung implementieren insgesamt beide Kopierzeichenn * period
. Ihre Implementierung führt aufgrund der Initiale nur eine Speicherzuweisung durchreserve
. Ich denke, Sie haben Ihre Implementierung mit einem eher kleinenstr
und einem großen Profil versehenn
, aber nicht auch mit einem großenstr
und einem kleinenn
.str
und kleinn
zwischen den beiden Ansätzen. Ich glaube, dies hat mehr mit der gesamten Pipeline zu tun als mit der Vorhersage von Zweigen an sich. Es gibt auch Probleme bei der Datenausrichtung , die berücksichtigt werden müssen. Sie sollten eine neue Frage stellen, um herauszufinden, warum dies prozessor- / speicherfreundlicher ist. Ich bin sicher, dass dies großes Interesse wecken und eine bessere Antwort erhalten würde, als ich hier geben kann.rep movsb
ist eine der effizientesten Möglichkeiten zum Kopieren, zumindest für mittlere bis große Kopien. Die mikrocodierte Implementierung hat einen nahezu konstanten Startaufwand (sowohl bei AMD als auch bei Intel), z. B. bei Sandybridge, ~ 15 bis 40 Zyklen plus 4 Zyklen pro 64B-Cache-Zeile (bester Fall) . Für kleine Kopien ist eine SSE-Schleife am besten geeignet, da sie keinen Startaufwand hat. Aber dann ist es abhängig von Branchenfehlvorhersagen.Sie sollten Ihren eigenen Stream-Manipulator schreiben
quelle
ITNOA
Sie können dazu die C ++ - Funktion verwenden.
quelle