输入:5
long long n;
cin>>n;
long long a[n];
for(long long i=0;i<n;i++){
cin>>a[i];
}
如何在不输入n
的情况下输入数组元素?
这就是我要寻找的:
输入:1,2,3,4,5
cout << a[0]
输出:
1
答案 0 :(得分:7)
C ++中的标准输入过滤器循环是while(cin >> a)
- 这将在没有更多输入或其他不良事件发生之前读取:
#include <vector>
#include <iterator>
#include <iostream>
int main() {
std::vector<int> nums;
while (std::cin >> a) {
nums.push_back(a);
}
std::copy(nums.begin(), nums.end(), ostream_iterator<int>{cout, " "});
}
你也可以使用带有输入迭代器的单行 - 这是读取向量中元素的最短方法:
#include <vector>
#include <iterator>
#include <algorithm>
#include <iostream>
int main() {
std::vector<int> nums(std::istream_iterator<int>(std::cin), {});
std::copy(nums.begin(), nums.end(), std::ostream_iterator<int>{std::cout, " "});
}
假设您希望忽略所有这些C ++的精彩,强烈劝阻恕我直言,您可以:
#include <iostream>
int main() {
const int MAX_SIZE = 100;
int nums[MAX_SIZE];
int a;
int i=0;
while (std::cin >> a) {
nums[i++] = a;
}
// do your output
}
请注意:
MAX_SIZE
, 因此:使用std::vector
!!
答案 1 :(得分:4)
改为使用std::vector<long long> a;
。
然后使用long long temp;
,cin >> temp;
和a.push_back(temp);
。
这意味着当您添加更多数据时,矢量会自动增长。从某种意义上说,更聪明的方式,但我的方式具有清晰度的优势。
现在,酷猫不必担心重复push_back
,因为他们信任C ++标准库实现,以保持内存的良好和未分割。但是,如果必须,std::vector
允许您通过其reserve
方法设置初始容量:如果您愿意,您仍然可以将矢量增加到超出该范围。
答案 2 :(得分:1)
您需要知道输入的结束位置。在您的情况下,看起来输入适合单行。您可以读取该行,从中构造字符串流,并从中读取逗号分隔的项目,如下所示:
string line;
getline(cin, line);
istringstream iss(line);
vector<long long> a;
long long tmp;
while (iss >> tmp) {
a.push_back(tmp);
iss.ignore(1, ',');
}
请注意以上内容如何使用std::vector<long long>
而不是数组。通过这种方法,您只需调用push_back
即可管理数据存储,并通过检查size()
了解您输入了多少数据。
答案 3 :(得分:1)
有几种方法。最重要的是,如果您不知道需要使用可以根据需要增长的容器的值的数量。为此你有std::vector
(已经被其他人提及)。
使用矢量和读取输入的天真方式类似于
std::vector<int> vector;
while (!std::cin.eof())
{
int value;
std::cin >> value;
vector.push_back(value);
}
使用与上述循环类似的方法(但正在工作)将类似于
std::vector<int> vector;
int value;
while (std::cin >> value)
{
vector.push_back(value);
}
然而,C ++有许多不错的实用函数和类,可以使它更简单。
使用standard algorithm函数std::copy
和一些iterator助手(std::istream_iterator
和std::back_inserter
),我们可以写
std::vector<int> vector;
std::copy(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>(),
std::back_inserter(vector));
如paul-g所指出的那样,它可以更简单,因为有一个vector constructor overload需要一个迭代器范围,因此所有真正需要的是
std::vector<int> vector(std::istream_iterator<int>(std::cin),
std::istream_iterator<int>());
答案 4 :(得分:0)
尝试使用指针数组(动态分配数组元素的更通用方法):
#include <iostream>
using namespace std;
int main()
{
int *Arr[1000],i=0,sizeofArr=0;
while(1){
Arr[i] = new int;
cin >> *Arr[i];
if(cin.get() == '\n'){ //exit the loop if ENTER is pressed
break;
}
i++;
sizeofArr++;
}
for (int j=0;j<=sizeofArr;j++){
cout << *Arr[j] <<" ";
}
return 0;
}