जैसा कि कमोडोर जैगर ने कहा, मुझे नहीं लगता कि वास्तव में इस सवाल का कोई अन्य उत्तर है; सवाल पूछता है कि एक स्ट्रिंग को कैसे दोहराया जाए, चरित्र नहीं।
जबकि कमोडोर द्वारा दिया गया उत्तर सही है, यह काफी अक्षम है। यहां एक तेज़ कार्यान्वयन है, यह विचार है कि स्ट्रिंग को पहले तेजी से बढ़ाकर संचालन और मेमोरी आवंटन को कम करना है:
#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;
}
हम operator*पायथन संस्करण के करीब कुछ पाने के लिए भी परिभाषित कर सकते हैं :
#include <utility>
std::string operator*(std::string str, std::size_t n)
{
return repeat(std::move(str), n);
}
मेरी मशीन पर यह कमोडोर द्वारा दिए गए कार्यान्वयन की तुलना में लगभग 10 गुना तेज है, और एक भोले 'एपेंड एन - 1 बार' समाधान की तुलना में लगभग 2x तेज है ।