Для маленьких «х» простой цикл ваш друг. Для больших 'x и относительно коротких' str 'мы можем придумать «более разумное» решение, повторно используя уже конкатенированную строку.
std::string MakeDuplicate( const std::string& str, unsigned int x ) {
std::string newstr;
if (x>0) {
unsigned int y = 2;
newstr.reserve(str.length()*x);
newstr.append(str);
while (y<x) {
newstr.append(newstr);
y*=2;
}
newstr.append(newstr.c_str(), (x-y/2)*str.length());
}
return newstr;
}
Или что-то в этом роде: o) (Я думаю, что это можно написать более хорошим способом, но идея есть).
РЕДАКТИРОВАТЬ: я сам был проинструктирован и провел несколько тестов, сравнивая три решения на моем ноутбуке с визуальной студией (версия с повторным использованием, простой цикл с предварительным распределением, простой копирование и цикл 1 без предварительного выделения). Ожидаемые результаты: для малых x (<10) версия предварительного выделения обычно самая быстрая, никакое предварительное распределение не было чуть-чуть медленнее, для большего x ускорение версии «повторного использования» действительно существенно (log n против n сложности). Хорошо, я просто не могу вспомнить ни одной реальной проблемы, которая могла бы ее использовать: o) </p>