尝试将 std::copy() 与 std::back_inserter 一起使用以读取 std::cin 时的不同结果
Different results when trying to use std::copy() with std::back_inserter to read from std::cin
我写的时候, I was trying to scan a space-separated input string and store it in a vector. A user建议使用std::back_inserter
和std::copy()
接受输入,超过std::istringstream
的用法:
std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(vec));
这看起来不错(而且效果也不错!)。但是,当我将代码复制粘贴到 Visual Studio 中时,它只会在非数字输入时中断,例如:
3 2 1 4<space/no-space>k
这是 MVCC 中的错误吗?
我正在使用 MVCC v14.27 (142) 和 Visual Studio 2019 (16.7)。
我明白是怎么回事了。
当您使用 std::getline() 读取一些文本然后将其放入 std::stringstream 以使用 while 循环处理它时,您只读取了一行文本(直到输入键)然后停止读取输入。
当您使用 while(std::cin>>x) 或将 std::copy 与 std::input_iterator 一起使用时,它会从 std::cin 中提取信息,直到它可以提取信息' t parse or until it gets to the end of input - 它跳过所有空格(包括回车键)
在这种情况下,我们正在读取 int 值,因此 std::getline()/std::stringstream/while 方法恰好获取一行文本,然后 while 继续提取 int 直到结束输入 - 在这种情况下,它是我们读取的字符串的结尾。
但是当使用 while(std::cin>>x) 或 std::copy 时,究竟什么表示输入结束?它不是回车键,因为那是空格。如果您要重定向来自文件的输入,它将是文件的末尾。但是交互地,如何让键盘输入结束呢?
- 在 Unix 中 shell 你按下 Ctrl-D 键
- 在 Windows 上按 Ctrl-Z 键作为新行的第一个字符
这里有更多信息:
我的示例在 rextester.com 上工作的原因是您将输入输入到一个小框中,因此它必须作为文件重定向 - 它不是真正的交互式。
我写的时候std::back_inserter
和std::copy()
接受输入,超过std::istringstream
的用法:
std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(vec));
这看起来不错(而且效果也不错!)。但是,当我将代码复制粘贴到 Visual Studio 中时,它只会在非数字输入时中断,例如:
3 2 1 4<space/no-space>k
这是 MVCC 中的错误吗?
我正在使用 MVCC v14.27 (142) 和 Visual Studio 2019 (16.7)。
我明白是怎么回事了。
当您使用 std::getline() 读取一些文本然后将其放入 std::stringstream 以使用 while 循环处理它时,您只读取了一行文本(直到输入键)然后停止读取输入。
当您使用 while(std::cin>>x) 或将 std::copy 与 std::input_iterator 一起使用时,它会从 std::cin 中提取信息,直到它可以提取信息' t parse or until it gets to the end of input - 它跳过所有空格(包括回车键)
在这种情况下,我们正在读取 int 值,因此 std::getline()/std::stringstream/while 方法恰好获取一行文本,然后 while 继续提取 int 直到结束输入 - 在这种情况下,它是我们读取的字符串的结尾。
但是当使用 while(std::cin>>x) 或 std::copy 时,究竟什么表示输入结束?它不是回车键,因为那是空格。如果您要重定向来自文件的输入,它将是文件的末尾。但是交互地,如何让键盘输入结束呢?
- 在 Unix 中 shell 你按下 Ctrl-D 键
- 在 Windows 上按 Ctrl-Z 键作为新行的第一个字符
这里有更多信息:
我的示例在 rextester.com 上工作的原因是您将输入输入到一个小框中,因此它必须作为文件重定向 - 它不是真正的交互式。