2016-11-05 127 views
9

输入:5如何输入数组中的元素而不输入n? (C++)

long long n; 
cin>>n; 
long long a[n]; 
for(long long i=0;i<n;i++){ 
    cin>>a[i]; 
} 

如何阵列的I输入元件,而无需输入n

这是我期待已久:

输入:1,2,3,4,5

cout << a[0] 

输出:

+0

请参阅http://en.cppreference.com/w/cpp/container/vector(具体来说,在页面底部的例子) – OMGtechy

+0

你有没有想过上限的数组,然后也许我可以帮你。 – NeoR

+0

不,不。你不明白。我想* cin *没有* cin * n的元素本身。 – Nson

回答

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更多元素处理重新分配;

因此:使用std::vector !!

4

使用改为。

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

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

这些天,酷猫不必担心重复的push_back,因为他们信任C++标准库实现,以保持内存的完整性和完整性。但是,如果你必须,那么std::vector确实允许你通过其reserve方法设置初始的容量:如果你愿意,你仍然可以增加你的矢量。

+0

我认为这个问题更多的是关于如何在事先没有输入数字的情况下阅读元素,而不是如何存储它们? –

+0

是的,你可能是正确的。你的回答很不错,加上一个。 – Bathsheba

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

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)); 

它可以像保罗-G注意,甚至简单,因为有一个vector constructor overload接受一个迭代器的范围,因此,所有真正需要的是

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

为什么显示错误的方式来做到这一点?另外,当你可以简单地使用'std :: vector nums(std :: istream_iterator (std :: cin),{});为什么使用更长的istream + back_inserter? –