Вопрос:
Я хочу вставить ‘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; }