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

我可以使用迭代器intvector将它们放入标准输出中取出几个s :

std::vector<int> v{0,1,2,3,4,5};
std::copy_n(v.begin(),
    3,
    std::ostream_iterator<int>(std::cout, ":"));

我可以使用新的C ++ 20米范围采取几个int从A Svector把它们输出到标准输出与|操作者在for使用循环中,一个值在一个时间<<

for(int n : std::views::all(v)
    | std::views::take(3))
{
    std::cout << n << '/';
}

如何将结果放入std::views::all(v) | std::views::take(3)标准输出而无需显式循环值?

就像是:

std::views::all(v)
    | std::views::take(4)
    | std::ostream_iterator<int>(std::cout, " ");

或者

std::cout << (std::views::all(v)
    | std::views::take(4));

回答

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

std::ranges::copy(v | std::views::take(4),
        std::ostream_iterator<int>(std::cout, " "));

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

您也可以直接使用 fmtlib:

// with <fmt/ranges.h>
// this prints {0, 1, 2, 3}
fmt::print("{}n", v | std::views::take(4));

fmt::join用于获得更多控制(这使您除了指定分隔符外,还可以将格式字符串应用于每个元素):

// this prints [00:01:02:03]
fmt::print("[{:02x}]n", fmt::join(v | std::views::take(4), ":"));


以上是将C++20范围写入标准输出的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>