it-swarm.com.de

Wie kann man einen String in C ++ variabel oft wiederholen?

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?

Z.B. in Python könnten Sie einfach tun

>>> "." * 5 + "lolcat"
'.....lolcat'
100
Marcus

Im speziellen Fall der Wiederholung eines einzelnen Zeichens können Sie std::string(size_type count, CharT ch) verwenden:

std::string(5, '.') + "lolcat"

NB. Dies kann nicht zum Wiederholen von Zeichenfolgen mit mehreren Zeichen verwendet werden.

142
luke

Es gibt keine direkte idiomatische Möglichkeit, Zeichenfolgen in C++ zu wiederholen * Operator in Python oder dem x Operator in Perl. Wenn Sie ein einzelnes Zeichen wiederholen, funktioniert der Konstruktor mit zwei Argumenten (wie in den vorherigen Antworten vorgeschlagen) gut:

std::string(5, '.')

Dies ist ein ausgedachtes Beispiel dafür, wie Sie einen Ostringstream verwenden können, um eine Zeichenfolge n-mal zu wiederholen:

#include <sstream>

std::string repeat(int n) {
    std::ostringstream os;
    for(int i = 0; i < n; i++)
        os << "repeat";
    return os.str();
}

Abhängig von der Implementierung ist dies möglicherweise etwas effizienter als das einfache n-fache Verketten der Zeichenfolge.

36

Verwenden Sie eine der Formen von string :: insert:

std::string str("lolcat");
str.insert(0, 5, '.');

Dadurch wird "....." (fünf Punkte) am Anfang der Zeichenfolge (Position 0) eingefügt.

17
camh

Ich weiß, dass dies eine alte Frage ist, aber ich wollte dasselbe tun und habe herausgefunden, was ich für eine einfachere Lösung halte. Es scheint, dass cout diese Funktion in cout.fill () eingebaut hat, siehe den Link für eine 'vollständige' Erklärung

http://www.Java-samples.com/showtutorial.php?tutorialid=458

cout.width(11);
cout.fill('.');
cout << "lolcat" << endl;

ausgänge

.....lolcat
10
Ian

Wie Commodore Jaeger angedeutet hat, glaube ich, dass keine 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 ineffizient. Hier ist eine schnellere Implementierung, die Idee ist, Kopiervorgänge und Speicherzuordnungen zu minimieren, indem zuerst die Zeichenfolge exponentiell vergrößert wird:

#include <string>
#include <cstddef>

std::string repeat(std::string str, const std::size_t n)
{
    if (n == 0) {
        str.clear();
        str.shrink_to_fit();
        return str;
    } else if (n == 1 || str.empty()) {
        return str;
    }
    const auto period = str.size();
    if (period == 1) {
        str.append(n - 1, str.front());
        return str;
    }
    str.reserve(period * n);
    std::size_t m {2};
    for (; m < n; m *= 2) str += str;
    str.append(str.c_str(), (n - (m / 2)) * period);
    return str;
}

Wir können auch einen operator* Definieren, um der Python Version näher zu kommen:

#include <utility>

std::string operator*(std::string str, std::size_t n)
{
    return repeat(std::move(str), n);
}

Auf meinem Computer ist dies ungefähr 10x schneller als die von Commodore angegebene Implementierung und ungefähr 2x schneller als eine naive 'n - 1 mal anhängen' Lösung.

8
Daniel

Sie sollten Ihren eigenen Stream-Manipulator schreiben

cout << multi (5) << "whatever" << "lolcat";

6
Roskoto

ITNOA

Sie können dazu die C++ - Funktion verwenden.

 std::string repeat(const std::string& input, size_t num)
 {
    std::ostringstream os;
    std::fill_n(std::ostream_iterator<std::string>(os), num, input);
    return os.str();
 }
3
sorosh_sabz

Für die Zwecke des Beispiels, das durch den ctor des OP std :: string bereitgestellt wird, ist ausreichend: std::string(5, '.'). Wenn jedoch jemand nach einer Funktion sucht, die std :: string mehrmals wiederholt:

std::string repeat(const std::string& input, unsigned num)
{
    std::string ret;
    ret.reserve(input.size() * num);
    while (num--)
        ret += input;
    return ret;
}
2
Pavel