在Python中,以下指令:
print 'a'*5
将输出aaaaa
。如何在 C++ 中结合 std::ostream
编写类似的内容以避免 for
构造?
最明显的方法是使用
fill_n
:
std::fill_n(std::ostream_iterator<char>(std::cout), 5, 'a');
另一种可能性是只构造一个字符串:
std::cout << std::string(5, 'a');
std::format
: 轻松编写一个字符的多个副本
std::cout << std::format("{:a<5}", "");
输出:
aaaaa
如果
std::format
不可用,您可以使用{fmt}库,它是基于的。 {fmt} 还提供了 print
函数,使这变得更加简单和高效 (godbolt):
fmt::print("{:a<5}", "");
除了比使用
ostream[_iterator]
更简洁之外,这还保证了输出不会与其他线程的输出(如果有)交错。
免责声明:我是 {fmt} 和 C++20 的作者
std::format
。
使用一些棘手的方法:
os << setw(n) << setfill(c) << "";
其中 n 是要写入的字符 c 的数量
您可以通过重载 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);