将C++20范围写入标准输出
我可以使用迭代器int从vector将它们放入标准输出中取出几个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), ":"));