Лучший способ создать строку, содержащую несколько копий другой строки

Я хочу создать функцию, которая возьмет строку и целое число как параметры и возвратит строку, которая содержит строковый параметр, повторил данное количество раз.

Например:

std::string MakeDuplicate( const std::string& str, int x )
{
    ...
}

Вызов MakeDuplicate( "abc", 3 ); возвратился бы "abcabcabc".

Я знаю, что могу сделать это только цикличным выполнением x количество раз, но я уверен, что должен быть лучший путь.

5
задан Richard 11 January 2010 в 15:01
поделиться

4 ответа

я не вижу проблемы с цикличным выполнением, просто удостоверьтесь, что вы делаете резерв сначала:

std::string MakeDuplicate( const std::string& str, int x )
{
    std::string newstr;
    newstr.reserve(str.length()*x); // prevents multiple reallocations

    // loop...

    return newstr;
}
19
ответ дан 18 December 2019 в 05:36
поделиться

В какой-то момент он должен быть петлей. Возможно, вы сможете скрыть петли в какой-то необычном языке идиоме, но в конечном итоге вам придется петлю.

7
ответ дан 18 December 2019 в 05:36
поделиться

Для небольшого «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)

4
ответ дан 18 December 2019 в 05:36
поделиться

Существует альтернатива петле, ее называют рекурсию , а также рекурсию хвостовой рекурсии является самым красивым разнообразием, поскольку вы можете теоретически сделать это До конца времени - просто как цикл: D

PS, хвост-рекурсия часто синтаксический сахар для петли - однако в случае процедурных языков (C ++) компилятор, как правило, при потере, поэтому Рекурсион хвоста не оптимизирован, и у вас может закончиться память (но если вы написали рекурсию, которая запускается из памяти, чем у вас больших проблем): D

Больше сокращений, пожалуйста !!

Рекурсия, очевидно, не является конструкцией, используемой в информатике для одной и той же работы, что и цикла

2
ответ дан 18 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: