【发布时间】:2012-02-19 23:03:19
【问题描述】:
我正在尝试将单个输入行中的多个整数读入一个数组 例如。输入:100 200 300 400,所以数组是:a[0] = 100, a[1] = 200, a[2] = 300, a[3] = 400 问题是,整数的个数是未知的,所以数组的大小是未知的。
【问题讨论】:
我正在尝试将单个输入行中的多个整数读入一个数组 例如。输入:100 200 300 400,所以数组是:a[0] = 100, a[1] = 200, a[2] = 300, a[3] = 400 问题是,整数的个数是未知的,所以数组的大小是未知的。
【问题讨论】:
您应该使用自动调整大小的容器,例如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> 并且你想使用适当的括号来避免最麻烦的解析。
std::vector<int> values(std::istream_iterator<int>(this_line), (std::istream_iterator<int>()))(注意第二个参数周围的额外括号)。另外,我故意使用std::istream_iterator<int> 而不是istream_iterator<int> ;)
{} 而不是(),以避免解析为函数声明,对吧?
std::vector<T> 支持初始化列表:我还没有完全理解这些和统一初始化之间的交互。由于std::vector<T> 使用std::initializer_list<T> 这应该没问题(不过需要尝试一下)。
您可以为此使用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;。这是一个非常非常肮脏的习惯,它毁了所有新人的思想......
std:: 前缀时。他写这篇评论时做了一件好事。
s within a limited scope, using namespace std;` 就可以了。主要抱怨与“远距离操作”有关,这就是为什么在头文件中找到它特别糟糕的原因。
插入器和流迭代器可以很好地做到这一点:
#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 知道如何从一个范围构造自己。
std::cin 来回避最棘手的解析问题。不幸的是,如果流是局部变量,这将不会那么容易:在这种情况下,需要额外的一组括号。
for 循环中完成了所有事情,使用了一个临时帮助程序 std::stay(与 std::move 相反)。