如何在没有输入n的情况下输入数组中的元素? (C ++)

时间:2016-11-05 10:50:54

标签: c++

  

输入: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

5 个答案:

答案 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, " "});
}

请参阅Ideone example here

假设您希望忽略所有这些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
}

请注意:

  1. 需要猜测MAX_SIZE
  2. 或者在读取比MAX_SIZE更多的元素时手动处理重新分配;
  3. 因此:使用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, ',');
}

Demo.

请注意以上内容如何使用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);
}

But the above loop is wrong

使用与上述循环类似的方法(但正在工作)将类似于

std::vector<int> vector;
int value;
while (std::cin >> value)
{
    vector.push_back(value);
}

然而,C ++有许多不错的实用函数和类,可以使它更简单。

使用standard algorithm函数std::copy和一些iterator助手(std::istream_iteratorstd::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;
}