Seperti yang disinggung oleh Commodore Jaeger, saya rasa tidak ada jawaban lain yang benar-benar menjawab pertanyaan ini; pertanyaannya menanyakan bagaimana mengulang sebuah string, bukan karakter.
Meskipun jawaban yang diberikan oleh Commodore benar, itu cukup tidak efisien. Berikut adalah implementasi yang lebih cepat, idenya adalah untuk meminimalkan operasi penyalinan dan alokasi memori dengan terlebih dahulu mengembangkan string secara eksponensial:
#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;
}
Kita juga dapat mendefinisikan operator*
untuk mendekati versi Python:
#include <utility>
std::string operator*(std::string str, std::size_t n)
{
return repeat(std::move(str), n);
}
Di komputer saya, ini sekitar 10x lebih cepat daripada implementasi yang diberikan oleh Commodore, dan sekitar 2x lebih cepat daripada solusi naif 'tambahkan n - 1 kali' .