在 C++ 中的单个输入行中读取整数列表
Posted
技术标签:
【中文标题】在 C++ 中的单个输入行中读取整数列表【英文标题】:Reading a list of integer in a single input line in C++ 【发布时间】:2012-02-19 23:03:19 【问题描述】:我正在尝试将单个输入行中的多个整数读入一个数组 例如。输入:100 200 300 400,所以数组是:a[0] = 100, a[1] = 200, a[2] = 300, a[3] = 400 问题是,整数的个数是未知的,所以数组的大小是未知的。
【问题讨论】:
【参考方案1】:您应该使用自动调整大小的容器,例如std::vector
。
例如,像这样的:
#include <string>
#include <iostream>
#include <sstream>
#include <utility>
#include <iterator>
std::string line;
getline(instream, line);
std::istringstream this_line(line);
std::istream_iterator<int> begin(this_line), end;
std::vector<int> values(begin, end);
【讨论】:
我猜你的意思是使用std::istream_iterator<int>
并且你想使用适当的括号来避免最麻烦的解析。
@DietmarKühl:感谢您指出错误的名称。这是避免大多数令人烦恼的解析的有效方法吗?
是的,它绝对避免了最麻烦的解析,但不必要地需要使用 C++2011。一个更微妙的版本是std::vector<int> values(std::istream_iterator<int>(this_line), (std::istream_iterator<int>()))
(注意第二个参数周围的额外括号)。另外,我故意使用std::istream_iterator<int>
而不是istream_iterator<int>
;)
@DietmarKühl:哦,很好,没有使用 C++11 的乐趣。 C++11 还允许使用
而不是()
,以避免解析为函数声明,对吧?
@BenVoigt:是的,我认为这是正确的,尽管我不完全确定:“统一初始化语法”与统一远和std::vector<T>
支持初始化列表:我还没有完全理解这些和统一初始化之间的交互。由于std::vector<T>
使用std::initializer_list<T>
这应该没问题(不过需要尝试一下)。【参考方案2】:
您可以为此使用std::vector
:
std::vector<int> myVector;
std::string line;
std::getline(std::cin, line);
std::istringstream os(line);
int i;
while(os >> i)
myVector.push_back(i);
此代码需要以下内容:<iostream>
、<string>
、<sstream>
和 <vector>
。
【讨论】:
请停止abusing namepsace std;
。这是一个非常非常肮脏的习惯,它毁了所有新人的思想......
我不认为它像 Kerrek 所说的那么糟糕,但示例代码应该比生产代码更原始。
@BenVoigt:我知道这不是一个好习惯,而且我滥用它真的很多,尤其是当我知道我要写超过 5 个 std::
前缀时。他写这篇评论时做了一件好事。
@LihO:只要它s within a limited scope,
using namespace std;` 就可以了。主要抱怨与“远距离操作”有关,这就是为什么在头文件中找到它特别糟糕的原因。【参考方案3】:
插入器和流迭代器可以很好地做到这一点:
#include <iterator>
#include <vector>
#include <iostream>
#include <algorithm>
std::vector<int> numbers;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(numbers));
或者,正如@Ben Voigt 所说,一次性从输入构建向量(如果可以的话):
std::vector numbers(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>());
如果您的输入要求更复杂,您可以将std::cin
替换为合适的字符串流。
【讨论】:
嘘到std::copy
,std::vector
知道如何从一个范围构造自己。
这忽略了“单行”的要求。
什么双关语?您的代码读取整个标准输入流。 OP 只想要一行。
+1 使用std::cin
来回避最棘手的解析问题。不幸的是,如果流是局部变量,这将不会那么容易:在这种情况下,需要额外的一组括号。
@DietmarKühl:是的,我们不久前讨论过这个问题,我们在一个 for
循环中完成了所有事情,使用了一个临时帮助程序 std::stay
(与 std::move
相反)。 以上是关于在 C++ 中的单个输入行中读取整数列表的主要内容,如果未能解决你的问题,请参考以下文章