2012-04-17 38 views
1

私はC++を初めて使いました。私は2次元の配列を作成したい、最初の次元の長さが与えられます。二次元の長さは1から増加します。 2次元配列a [] []、a [0] []は1要素、a [1] []は2要素、a [2] []は3要素などです。2次元のステップ配列をC++で

音が出ませんハード構造のように、私はそれを作成するための2つを見つけることができません - 私がすることができますすべてのスペースの半分を意味するx *アレイを作成することです私のために無駄です。

誰でも知っていますか?前もって感謝します。

+4

、それは非常に大きな配列でない限り、その後の最も簡単な方法は、単に「無駄な」スペースを心配しないことです。 –

+0

ベクトルを使うことができれば、これは完璧です。 – chris

答えて

1

std::vectorソリューション:

vector< vector<int> > stairs; 

for(int i = 0; i < n; i++) // n is size of your array 
    stairs[i].resize(i+1); 

また、無地のポインタを使用してこれを行うことができます。

int * stairs[n]; 
for(int i = 0; i < n ; i++) 
    stairs[i] = new int[i+1]; 

しかし、この時間は、あなたはそれが不要になったときに、この構造を削除しないを心配する必要があります。

+2

おそらく、新しいC++ユーザーに未処理のポインタと保護されていない動的メモリ割り当てを使用させることはお勧めしません。 – enobayram

+0

これは簡単な解決策です。私はそれを試す時間がありませんでしたが、私はできるだけ早くそれを行い、あなたに戻ってきます。また、「無駄なスペース」を無視してパフォーマンスにどのような影響があるかを見てみましょう。 –

+0

走った後、私はこれが私の望むものだと思う。ありがとう。私はまたこれを試みた: の配列< vector>階段; 私は配列のサイズを知っていますが、それはC++のように思われます。 –

1

ご使用のアレイの動的割り当てを検討してください。

Dynamic array allocation

ポインタへのポインタとして 既知の概念を使用して多次元配列を作成する別の方法。 Ronが木曜日に言ったように、行と列を持つスプレッドシート(​​ちょうど である)のように2D配列の を考えているのですが、C++はptrをptrsに使用しています。まず、 は基本ポインタの作成から始まります。次に、行 の配列を割り当て、最初のポインタのアドレスをベースポインタに割り当てます。 次に、各列の列データを保持し、行ポインタの配列

で アドレスを割り当てるメモリを割り当てるしかし、あなたはCPPに新しいしている場合、私はあなたが多数に対処されないことを前提としデータはメモリについて心配しないでください!

1

1つの解決策は、サイズx *(x + 1)/ 2の1次元データ配列を保持するクラスを定義し、適切なタイプのインデックス作成を行うためにオーバーロードtype & operator()(int r, int c)をオーバーロードすることです。

template<class datatype, int size> 
class strange2dArray { 
    datatype data[size*(size+1)/2]; 

    datatype & operator()(int r, int c) { 
     // assert if the indexes are correct 
     return data[r*(r+1)/2+c]; 
    } 
}; 

ところで、あなたがC++を学ぶためにこれをやっている場合を除き、あなたはおそらく、このような基本的なデータ構造を提供するために数学ライブラリ(または何でも)のいくつかの種類を使用する必要があります。彼らはもっと効率的かつ安全にそれを実装します。

0

まず者は、Pythonのテストを見てみましょう:

>>> a=[] 
>>> a[0]=3 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
IndexError: list assignment index out of range 
>>> a={} 
>>> a[0]=3 

はおっと、配列のように見え、それが配列であることを意味しdoes't。 "array"の動的サイズが必要な場合は、マッピングを使用できます。 はい、それは最初のソリューションです:

#include <map> 
#include <iostream> 
using namespace std; 

typedef std::map<int, int> array_d2; //length of second dimensional is increased 
array_d2 myArray[10] ; //length of first dimensional is given 


int main() 
{ 
myArray[0][1] = 3; 
myArray[0][2] = 311; 

//following are tests 
cout << myArray[0][1] << endl; 
cout << myArray[0][2] << endl; 

return 0; 
} 

(出力は:)

$ ./test 
3 
311 

である私の第二の溶液は、複数のアレイのようなものを使用していますが、サイズ変更機能を持って、あなたがオーバーライドすべきことです操作[]をクリックすると、自動的にユーザーに表示されます。

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

//length of second dimensional is increased 
class array_d2 { 
    int m_size; 
    vector<int> m_vector; 
    public: 
    array_d2 (int size=10) { 
     m_size = size; 
     m_vector.resize(m_size); 
    }; 
    int& operator[] (int index) { 
     if (index >= m_size) { 
     m_size = index + 1; 
     m_vector.resize(m_size); 
    } 
    return m_vector[index]; 
    }; 
}; 

array_d2 myArray[10] ; //length of first dimensional is given 


int main() 
{ 
myArray[0][1] = 3; 
myArray[0][20] = 311; 
myArray[1][11] = 4; 
myArray[1][12] = 411; 


//following are tests 
cout << myArray[0][1] << endl; 
cout << myArray[0][20] << endl; 
cout << myArray[1][11] << endl; 
cout << myArray[1][12] << endl; 

return 0; 
} 

(出力がある)

$ ./test1 
3 
311 
4 
411