В python следующая инструкция: print 'a'*5
выведет aaaaa
. Как написать что-то подобное на C++ в сочетании с std::ostream
s, чтобы избежать конструкции for
?
Как записать «n» копии символа в ostream, как в python
Ответы (5)
Очевидным способом будет fill_n
:
std::fill_n(std::ostream_iterator<char>(std::cout), 5, 'a');
Другой возможностью было бы просто построить строку:
std::cout << std::string(5, 'a');
ostreambuf_iterator
?
- person Columbo; 24.05.2015
std:fill_n
для потока, но, что более важно, позволяют избежать динамического выделения памяти, необходимого для построения (а затем уничтожения) строки. (Почему они не могут исключить динамическое выделение памяти для постоянной строки времени компиляции... Я уверен, что есть веская причина...)
- person Cody Gray; 03.10.2020
Используйте какой-нибудь хитрый способ: os << setw(n) << setfill(c) << "";
Где n - количество символов c для записи
setfill(' ')
после работы здесь. Кстати, решение с fill_n может быть нарушено os << setw(5) << left << fill_n(...)
- созданием a aaaa
: D...
- person PiotrNycz; 11.07.2012
В C++20 для этого можно использовать std::format
. :
std::cout << std::format("{:a<5}", "");
Вывод:
aaaaa
А пока вы можете использовать библиотеку {fmt}, на которой основан std::format
. {fmt} также предоставляет функцию print
, которая делает это еще проще и эффективнее (godbolt):
fmt::print("{:a<5}", "");
Отказ от ответственности: я автор {fmt} и C++20 std::format
.
Вы можете сделать что-то подобное, перегрузив оператор *
для std::string. Вот небольшой пример
#include<iostream>
#include<string>
std::string operator*(const std::string &c,int n)
{
std::string str;
for(int i=0;i<n;i++)
str+=c;
return str;
}
int main()
{
std::string str= "foo";
std::cout<< str*5 <<"\n";
}
Стандарт не предусматривает какого-либо элегантного способа. Но одна из возможностей (моя любимая) — использовать такой прокси-объект
class repeat_char
{
public:
repeat_char(char c, size_t count) : c(c), count(count) {}
friend std::ostream & operator<<(std::ostream & os, repeat_char repeat)
{
while (repeat.count-- > 0)
os << repeat.c;
return os;
}
private:
char c;
size_t count;
};
а затем использовать его таким образом
std::cout << repeat_char(' ', 5);
"abc"_s * 3
илиstd::string ("abc") * 3
для обозначения"abcabcabc"
на этот вопрос. - person chris   schedule 11.07.2012operator*(string, size_t)
дляstring
точно так же плоха (или хороша), как и перегрузкаoperator+(string, string)
. Не лучше и не хуже — смысл умножения на натуральное число как многократного сложения — фундаментальная математика, нет оправдания непониманию одного, а не другого. Вероятно, это также отчасти потому, что ваш вопрос жалуется на стандарт и предлагает изменить его (ни одно из них не по теме), в дополнение к вопросу о мотивации :-p - person Steve Jessop   schedule 11.07.2012