Я хочу вставить 'n' пробелы (или любую строку) в начале строки в С++. Есть ли какой-либо прямой способ сделать это, используя строки std:: string или char *?
например. в Python вы можете просто сделать
>>> "." * 5 + "lolcat"
'.....lolcat'
Я хочу вставить 'n' пробелы (или любую строку) в начале строки в С++. Есть ли какой-либо прямой способ сделать это, используя строки std:: string или char *?
например. в Python вы можете просто сделать
>>> "." * 5 + "lolcat"
'.....lolcat'
std::string foo = std::string(5, '.') + "lolcat";
Посмотрите std::string конструкторы.
Нет прямого идиоматического способа повторения строк в С++, эквивалентных оператору * в 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 раз.
Используйте одну из форм строки:: insert:
std::string str("lolcat");
str.insert(0, 5, '.');
В начале строки (позиция 0) будет вставлено "....." (пять точек).
Я знаю, что это старый вопрос, но я хотел сделать то же самое и нашел то, что я считаю более простым решением. Похоже, что cout имеет эту функцию, встроенную в cout.fill(), см. Ссылку для "полного" объяснения
http://www.java-samples.com/showtutorial.php?tutorialid=458
cout.width(11);
cout.fill('.');
cout << "lolcat" << endl;
выходы
.....lolcat
Как сказал 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 раз".
Вы должны написать свой собственный манипулятор потока
cout < мульти (5) < "независимо" < < "Lolcat";
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();
}
Для целей примера, предоставленного 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;
}