首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将C++20范围写入标准输出

将C++20范围写入标准输出
EN

Stack Overflow用户
提问于 2021-01-12 08:17:45
回答 1查看 146关注 0票数 3

我可以从vector中获取几个int,并使用迭代器将它们放到标准输出中:

代码语言:javascript
运行
复制
std::vector<int> v{0,1,2,3,4,5};
std::copy_n(v.begin(),
    3,
    std::ostream_iterator<int>(std::cout, ":"));

我可以使用新的C++20范围从vector中获取几个int,并在for循环中使用|运算符将它们放到标准输出中,使用<<一次一个值。

代码语言:javascript
运行
复制
for(int n : std::views::all(v)
    | std::views::take(3))
{
    std::cout << n << '/';
}

如何才能将std::views::all(v) | std::views::take(3)的结果放到标准输出中,而不显式地通过值循环?

类似于:

代码语言:javascript
运行
复制
std::views::all(v)
    | std::views::take(4)
    | std::ostream_iterator<int>(std::cout, " ");

代码语言:javascript
运行
复制
std::cout << (std::views::all(v)
    | std::views::take(4));
EN

Stack Overflow用户

回答已采纳

发布于 2021-01-12 08:28:29

您正在寻找的具体内容是使用新的ranges算法:

代码语言:javascript
运行
复制
std::ranges::copy(v | std::views::take(4),
        std::ostream_iterator<int>(std::cout, " "));

您不需要直接使用views::all,上面的内容就足够了。

您也可以直接使用fmtlib:

代码语言:javascript
运行
复制
// with <fmt/ranges.h>
// this prints {0, 1, 2, 3}
fmt::print("{}\n", v | std::views::take(4));

或者使用fmt::join获得更多控制(这允许您在指定分隔符的同时对每个元素应用格式字符串):

代码语言:javascript
运行
复制
// this prints [00:01:02:03]
fmt::print("[{:02x}]\n", fmt::join(v | std::views::take(4), ":"));
票数 7
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65676338

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档