2016-11-05 67 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? –