如何在不输入n的情况下输入数组中的元素?(c++)

How to input elements in an array WITHOUT inputting n? (c++)

本文关键字:输入 元素 c++ 情况下 数组      更新时间:2023-10-16

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

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示例

然而,假设你希望忽略所有这些C++的敬畏,强烈劝阻IMHO,你可以:

#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. 需要猜测CCD_ 3
  2. 或者在读取的元素多于MAX_SIZE时手动处理重新分配

因此:使用std::vector

请改用std::vector<long long> a;

然后使用long long temp;cin >> temp;a.push_back(temp);

这意味着矢量将随着添加更多数据而自动增长。从某种意义上说,有更聪明的方式,但我的方式具有清晰的优势。

现在,酷猫们不担心重复的push_back,因为他们相信C++标准库实现可以为您保持良好的内存。但如果必须这样做,那么std::vector确实允许您通过其reserve方法设置初始容量:如果您愿意,您仍然可以将向量增长到该容量之外。

您需要知道输入的结束位置。在您的情况下,看起来输入适合一行。您可以读取该行,从中构建字符串流,并从中读取逗号分隔的项目,如下所示:

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()来知道您输入了多少数据。

有几种方法。最重要的是,如果你不知道值的数量,你需要使用一个可以根据需要增长的容器。为此,你有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++有许多不错的实用程序函数和类,可以使它变得更简单。

使用标准算法函数std::copy和一些迭代器助手(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所指出的,它可以更简单,因为有一个向量构造函数重载占用迭代器范围,所以真正需要的只是

std::vector<int> vector(std::istream_iterator<int>(std::cin),
                        std::istream_iterator<int>());

尝试使用指针数组(更通用的动态分配数组元素的方法(:

#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;
}