Я хочу создать функцию, которая возьмет строку и целое число как параметры и возвратит строку, которая содержит строковый параметр, повторил данное количество раз.
Например:
std::string MakeDuplicate( const std::string& str, int x )
{
...
}
Вызов MakeDuplicate( "abc", 3 );
возвратился бы "abcabcabc"
.
Я знаю, что могу сделать это только цикличным выполнением x количество раз, но я уверен, что должен быть лучший путь.
я не вижу проблемы с цикличным выполнением, просто удостоверьтесь, что вы делаете резерв сначала:
std::string MakeDuplicate( const std::string& str, int x )
{
std::string newstr;
newstr.reserve(str.length()*x); // prevents multiple reallocations
// loop...
return newstr;
}
В какой-то момент он должен быть петлей. Возможно, вы сможете скрыть петли в какой-то необычном языке идиоме, но в конечном итоге вам придется петлю.
Для небольшого «X» простой цикл - ваш друг. Для больших «х и относительно коротких» ул «мы можем подумать о« умнее »решении, используя уже объединенную строку.
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) (я думаю, что это может быть написано более приятнее, но идея там).
РЕДАКТИРОВАНИЕ: Я был межнутым сам и сделал некоторые тесты, сравнив три решения на моем ноутбуке с Visual Studio (версия повторного использования, простой петлей с PrealLocation, простой копией и петлей-1 без предварительной обработки). Результаты, как и ожидалось: для небольшого x (<10) Prealocation версии, как правило, быстрее всего, никаких преавтоматок не было немного медленнее, для более высокого ускорения версии «повторного использования» действительно значительна (log n vs n сложность). Ницца, я просто не могу придумать какую-либо реальную проблему, которая может использовать ее: O)
Существует альтернатива петле, ее называют рекурсию , а также рекурсию хвостовой рекурсии является самым красивым разнообразием, поскольку вы можете теоретически сделать это До конца времени - просто как цикл: D
PS, хвост-рекурсия часто синтаксический сахар для петли - однако в случае процедурных языков (C ++) компилятор, как правило, при потере, поэтому Рекурсион хвоста не оптимизирован, и у вас может закончиться память (но если вы написали рекурсию, которая запускается из памяти, чем у вас больших проблем): D
Больше сокращений, пожалуйста !!
Рекурсия, очевидно, не является конструкцией, используемой в информатике для одной и той же работы, что и цикла