C++ 如何书写';n';将字符复制到ostream,就像python中一样

C++ 如何书写';n';将字符复制到ostream,就像python中一样,c++,ostream,C++,Ostream,在python中,以下指令:print'a'*5将输出aaaaaa。C++如何结合代码> STD::OsStase >,以避免< > 构造? < P> std::fill_n(std::ostream_iterator<char>(std::cout), 5, 'a'); std::fill_n(std::ostream_迭代器(std::cout),5,'a'); 另一种可能是构造一个字符串: std::cout << std::string(5, 'a');

在python中,以下指令:
print'a'*5
将输出
aaaaaa
。C++如何结合<>代码> STD::OsStase<代码> >,以避免< <代码> > <代码>构造?

< P>
std::fill_n(std::ostream_iterator<char>(std::cout), 5, 'a');
std::fill_n(std::ostream_迭代器(std::cout),5,'a');
另一种可能是构造一个字符串:

std::cout << std::string(5, 'a');

std::cout您可以通过重载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";
}
#包括
#包括
std::string运算符*(常量std::string&c,int n)
{
std::字符串str;
对于(int i=0;i使用一些巧妙的方法:

os在C++20中,您可以使用来执行以下操作:

std::cout << std::format("{:a<5}", "");
同时,您可以使用,
std::format
是基于。{fmt}还提供了
print
功能,使这一过程更加简单和高效():


fmt::print(“{:aI只是想指出我在尝试引入类似于
“abc”\u s*3
std::string(“abc”)*3
的内容时受到的抨击。@chris:这部分是因为人们不理解重载
操作符*(string,size\t)
字符串的
与重载
运算符+(字符串,字符串)一样坏(或好)
。不好也不坏——自然数乘法作为重复加法的含义是基础数学,没有理由误解其中一个,而不是另一个。这可能部分是因为你的问题抱怨标准,并建议对其进行更改(两者都不是主题)除了问一个关于动机的问题:-pTricky和problem,因为填充字符在完成后不会自动重置。@Jerry这是真的。但这不是一个严重的问题,因为
setfill(“”)
在这里工作之后。顺便说一句,fill_n解决方案可能会被
操作系统破坏。您不使用
ostreambuf_迭代器有什么特殊原因吗?@Columbo:没有,只是不想向(最终)来自Python的人解释ostream_迭代器和ostreambuf_迭代器之间的区别可能不在乎区别(当然,如果有人问过,我可能会提到他们。也许令人惊讶的是,前者在GCC和Clang上产生了更高效的目标代码。它们不仅可以展开流的
std:fill\n
操作,而且更重要的是,它避免了构造所需的动态内存分配。)(然后销毁)一个字符串。(为什么他们不能删除编译时常量字符串的动态内存分配…,我相信这有一个很好的理由…@CodyGray:如果你看到一个长度为5(编译时常量或其他)的字符串的动态分配),您应该得到一个更好的实现。短字符串优化已经众所周知几十年了。无可否认,gcc花了很长时间才添加它,但即使是它现在也已经做了相当长的时间了。
fmt::print("{:a<5}", "");