2017-10-20 3 views
2

ただの簡単な質問です。 私はいくつかの整数を受け取り、配列に入れたいが、入力が同様になることが期待されているユーザー によって与えられますように私はそれのサイズがわからない:1 2 3 4 5タイプのメモリを割り振る方法は、そのサイズがわからない場合はどうすればいいですか?

#include <iostream> 
using namespace std; 
int main() 
{ 
    int *contain; 
    int y; 
    int i=0; 
    char c; 

    while(true) 
    { 
     cin>>contain[i]; 
     i++; 
     c=getchar(); 
     if(c=='\n') 
     break; 
    } 
} 
+4

で働いて参照してください。簡単にして、 'std :: vector'を使いましょう。 –

+4

アイテムを追加するにつれて大きくなるコンテナにそれらを読み込みます。例えばstd :: vector。そうすれば、読んでいく人の数を事前に知る必要はありません。 – acraig5075

+0

これはデータ構造の質問であるため、余分なスペースを割り当てることができません。 – Nznin

答えて

3

使用std::vector。数字を読んで、0が読み込まれるまで、vecotrにそれらを格納する

実証例あなたが始めるために、(それはあまりにもベクトルに格納されます):

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> myvector; 
    int myint; 

    std::cout << "Please enter some integers (enter 0 to end):\n"; 

    do { 
    std::cin >> myint; 
    myvector.push_back (myint); 
    } while (myint); 

    std::cout << "myvector stores " << int(myvector.size()) << " numbers.\n"; 

    return 0; 
} 

出力:

Please enter some integers (enter 0 to end): 
1 2 3 4 5 0 
myvector stores 6 numbers. 

Cのようなコードでは、たとえばrealloc()を使用し、新しい番号が到着するたびにサイズを1ずつ増やす必要があります(非常に非効率的です)。

+0

配列のサイズ変更操作は、大きすぎるサイズ変更を避けるために、1だけでなく、増分的に行われることがよくあります。 #randomTip – alseether

+1

@alseetherだから私はこれが非常に非効率的だと言ったのです。実際には、再割り当てが必要になるたびにサイズを2倍にします。 – gsamaras

+0

だから、それは償却割り当てのような意味ですか – Nznin

7

std::vectorstd::istream_iteratorを使用してください。あなたはあらかじめサイズを知る必要はありません。ユーザーはあなたがその番号を割り当てることができますサイズを入力すると

#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <vector> 
using namespace std; 

int main() { 
    // Input 
    vector<int> data(istream_iterator<int>(cin), {}); 

    // Output 
    for (auto i : data) 
     cout << i << endl; 

    // Output 2: suggested by alfC 
    copy(data.begin(), data.end(), ostream_iterator<int>(cout, " ")); 
    return 0; 
} 

入力

1 2 3 4 5 

出力

1 
2 
3 
4 
5 
1 2 3 4 5 

は、それがIdeone

+0

それは良い答えです、Nzimは代わりにそれを受け入れます。 – gsamaras

+1

このようなクールな答えは、ループの代わりに 'std :: copy(data.begin()、data.end()、std :: ostream_iterator (cout、" "));で終わるべきです。 – alfC

+0

あなたのお手伝いをありがとうが、私はベクトルとistream_iteratorの新しい人であるかを見なければならない – Nznin

関連する問題