Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中读取单个输入行中的整数列表+;_C++_Integer - Fatal编程技术网

C++ 在C+中读取单个输入行中的整数列表+;

C++ 在C+中读取单个输入行中的整数列表+;,c++,integer,C++,Integer,我试图从一个输入行读取多个整数到一个数组中 例如,输入:100200300400,所以数组是:a[0]=100,a[1]=200,a[2]=300,a[3]=400 问题是,整数的数量未知,因此数组的大小未知。您可以使用std::vector: std::vector<int> myVector; std::string line; std::getline(std::cin, line); std::istringstream os(line); int i; while(os

我试图从一个输入行读取多个整数到一个数组中 例如,输入:100200300400,所以数组是:a[0]=100,a[1]=200,a[2]=300,a[3]=400
问题是,整数的数量未知,因此数组的大小未知。

您可以使用
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);
std::vector myVector;
std::字符串行;
std::getline(std::cin,line);
std::istringstream操作系统(线路);
int i;
而(操作系统>>i)
myVector.push_back(i);

此代码需要以下内容:
您应该使用自动调整自身大小的容器,例如
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::字符串行;
getline(流内、线内);
std::istringstream此_线(线);
std::istream_迭代器开始(这一行),结束;
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));
#包括
#包括
#包括
#包括
std::向量数;
std::copy(std::istream_迭代器(std::cin),
std::istream_迭代器(),
标准:背面插入器(数字);
或者,正如@Ben Voigt所说的那样,一次性从输入构建向量(如果这是一个选项):

std::向量数(std::istream_迭代器(std::cin),
std::istreamu迭代器();

如果您的输入要求更复杂,您可以用合适的字符串流替换
std::cin

请停止
滥用namepsace std。这是一个非常非常肮脏的习惯,它破坏了所有新来者的思想……我不认为这有Kerrek说的那么糟糕,但是示例代码应该比生产代码更原始。@BenVoigt:我知道这不是一个好的实践,我滥用它的次数很多,特别是当我知道我要写5个以上的
std::
前缀时。他写这条评论是一件好事。@LihO:只要它
在有限的范围内,
使用namespace std;`很好。主要投诉与“远距离操作”有关,这就是为什么在头文件中找到它特别糟糕的原因。Boo to
std::copy
std::vector
知道如何从范围构造自身。这忽略了“单行”要求。什么双关语?您的代码读取整个标准输入流。OP只需要一行。+1通过使用
std::cin
来避开最麻烦的解析问题。不幸的是,如果流是一个局部变量,这就不那么容易了,不过:在这种情况下,需要一组额外的括号。@DietmarKühl:是的,我们之前讨论过这一点,我们在一个
for
循环中使用一个特殊的助手
std::stay
(与
std::move
相反)。我想你是想使用std::istream_迭代器,你想使用合适的括号来避免最麻烦的解析。@DietmarKühl:谢谢你指出了错误的名称。这是避免最麻烦的解析的有效方法吗?是的,它确实避免了最麻烦的解析,但不必要地需要使用C++2011。更微妙的版本是
std::vector values(std::istream\u iterator(这行),(std::istream\u iterator())
(注意第二个参数周围的额外括号)。此外,我还特意使用了
std::istream_迭代器
,而不是
istream_迭代器
;)@迪特马克·吕尔:哦,很好,没有使用C++11乐趣。C++11还允许使用
{}
而不是
()
,以避免解析为函数声明,对吗?@BenVoigt:是的,我认为这是正确的,尽管我不完全确定:“统一初始化语法”它远远不是统一的,并且
std::vector
支持初始化列表:我还没有完全了解这些和统一初始化之间的交互。由于
std::vector
使用
std::initializer\u list
这应该可以(但需要尝试一下)。
std::vector numbers(std::istream_iterator<int>(std::cin),
                    std::istream_iterator<int>());