Как повторить строку число раз в С++?

Я хочу вставить 'n' пробелы (или любую строку) в начале строки в С++. Есть ли какой-либо прямой способ сделать это, используя строки std:: string или char *?

например. в Python вы можете просто сделать

>>> "." * 5 + "lolcat"
'.....lolcat'

Ответ 2

Нет прямого идиоматического способа повторения строк в С++, эквивалентных оператору * в Python или операторе x в Perl. Если вы повторяете один символ, конструктор с двумя аргументами (как было предложено в предыдущих ответах) работает хорошо:

std::string(5, '.')

Это надуманный пример того, как вы можете использовать ostringstream для повторения строки n раз:

#include <sstream>

std::string repeat(int n) {
    std::ostringstream os;
    for(int i = 0; i < n; i++)
        os << "repeat";
    return os.str();
}

В зависимости от реализации это может быть несколько более эффективным, чем просто конкатенация строки n раз.

Ответ 3

Используйте одну из форм строки:: insert:

std::string str("lolcat");
str.insert(0, 5, '.');

В начале строки (позиция 0) будет вставлено "....." (пять точек).

Ответ 4

Я знаю, что это старый вопрос, но я хотел сделать то же самое и нашел то, что я считаю более простым решением. Похоже, что cout имеет эту функцию, встроенную в cout.fill(), см. Ссылку для "полного" объяснения

http://www.java-samples.com/showtutorial.php?tutorialid=458

cout.width(11);
cout.fill('.');
cout << "lolcat" << endl;

выходы

.....lolcat

Ответ 5

Как сказал Commodore Jaeger, я не думаю, что какие-либо другие ответы на самом деле отвечают на этот вопрос; вопрос задает вопрос о том, как повторять строку, а не символ.

Хотя ответ Commodore верен, он довольно неэффективен. Вот более быстрая реализация, идея состоит в том, чтобы минимизировать операции копирования и распределения памяти, сначала экспоненциально увеличивая строку:

#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*, чтобы получить что-то ближе к версии Python:

#include <utility>

std::string operator*(std::string str, std::size_t n)
{
    return repeat(std::move(str), n);
}

На моей машине это примерно в 10 раз быстрее, чем реализация Commodore, и примерно в 2 раза быстрее, чем наивное решение "добавить n - 1 раз".

Ответ 7

ITNOA

Вы можете использовать функцию C++ для этого.

 std::string repeat(const std::string& input, size_t num)
 {
    std::ostringstream os;
    std::fill_n(std::ostream_iterator<std::string>(os), num, input);
    return os.str();
 }

Ответ 8

Для целей примера, предоставленного OP std :: string ctor, достаточно: std::string(5, '.'). Однако, если кто-то ищет функцию для повторения std :: string несколько раз:

std::string repeat(const std::string& input, unsigned num)
{
    std::string ret;
    ret.reserve(input.size() * num);
    while (num--)
        ret += input;
    return ret;
}