std::views::istream 与 std::views::take

Bla*_*ger 3 c++ c++20 std-ranges

我用 g++ 12.2.1 编译了以下代码:

#include <iostream>
#include <ranges>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
    std::vector<int> vi;
    std::ranges::copy(std::views::istream<int>(std::cin) | std::views::take(3), std::back_inserter(vi));
    for (auto i : vi)
        std::cout << i << ' ';
}
Run Code Online (Sandbox Code Playgroud)

输入:

1 2 3
4
Run Code Online (Sandbox Code Playgroud)

输出:1 2 3

为什么我必须输入 4 个数字而不是 3 个数字并丢弃最后一个数字?怎么解决?

康桓瑋*_*康桓瑋 6

当你完成输入时1 2 3并没有views::istream<int>(std::cin) | views::take(3)到达结尾,因为它的迭代器只是指向最后一个元素,并没有传递到结尾

您可以使用CTRL+ D(对于 Linux)或CTRL+ Z(对于 Windows)来终止输入,例如

1 2 3
Ctrl + D
Run Code Online (Sandbox Code Playgroud)