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

Вопрос:Я хочу вставить 'n' пробелы (или любую строку) в начале строки в С++. Есть ли какой-либо прямой способ сделать это, используя строки std:: string или char *? например. в Python вы можете просто сделать >>> "." * 5 + "lolcat" '.....lolcat' Ответ №1std::string foo = std::string(5, '.') + "lolcat"; Посмотрите std::string конструкторы. Ответ №2Нет прямого

Вопрос:

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

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

>>> «.» * 5 + «lolcat» ‘…..lolcat’ Ответ №1std::string foo = std::string(5, ‘.’) + «lolcat»;

Посмотрите std::string конструкторы.

Ответ №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 раз”.

Ответ №6

Вы должны написать свой собственный манипулятор потока

cout < мульти (5) < “независимо” < < “Lolcat”;

Ответ №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; }

Оцените статью
Добавить комментарий