如何像在 python 中一样将字符的“n”个副本写入 ostream

问题描述 投票:0回答:5

在Python中,以下指令:

print 'a'*5
将输出
aaaaa
。如何在 C++ 中结合
std::ostream
编写类似的内容以避免
for
构造?

c++ ostream
5个回答
37
投票

最明显的方法是使用

fill_n
:

std::fill_n(std::ostream_iterator<char>(std::cout), 5, 'a');

另一种可能性是只构造一个字符串:

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

8
投票

在 C++20 中,您可以使用

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


4
投票

使用一些棘手的方法:

os << setw(n) << setfill(c) << "";
其中 n 是要写入的字符 c 的数量


2
投票

您可以通过重载 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";
}

1
投票

该标准没有提供任何优雅的方式。但一种可能性(我最喜欢)是使用像这样的代理对象

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);
© www.soinside.com 2019 - 2024. All rights reserved.