1

私はC ++が初めてで、これについて一晩考えました。2次元配列を作成したいのですが、最初の次元の長さが与えられています。2 番目の次元の長さは 1 から増加します。たとえば、2 次元配列 a[][] の場合、a[0][] には 1 つの要素があり、a[1][] には 2 つの要素があり、a[2][] には 3 つの要素があります。等

難しい構造のようには聞こえませんが、それを作成するための 2 が見つかりません。できることは ax * x 配列を作成することだけです。これは、スペースの半分が無駄になっていることを意味します。

誰でも何か考えがありますか?前もって感謝します。

4

4 に答える 4

1

配列の動的割り当てを検討してみてください。

動的配列割り当て

多次元配列を作成する別の方法は、ポインターへのポインターとして知られる概念を使用することです。ロンが木曜日に言ったように、ほとんどの人は、行と列を持つスプレッドシートのような 2D 配列を考えていますが (これで問題ありません)、「ボンネットの下」では、C++ は ptr を ptr に使用しています。まず、ベース ポインターの作成から始めます。次に、行ポインタの配列を割り当て、最初のアドレスをベース ポインタに割り当てます。次に、各行の列データを保持するメモリを割り当て、行ポインタ配列にアドレスを割り当てます

しかし、CPP を初めて使用する場合は、大量のデータを扱うことはないと思いますので、メモリについて心配する必要はありません。

于 2012-04-17T22:00:34.923 に答える
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];

しかし今回は、不要になったときにこの構造を削除することについて心配する必要があります。

于 2012-04-17T22:00:53.053 に答える
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++ を学習するためにこれを行っているのでない限り、そのような基本的なデータ構造を提供するために、おそらくある種の数学ライブラリ (またはその他のもの) を使用する必要があります。彼らはそれをはるかに効率的かつ安全に実装します。

于 2012-04-17T22:03:08.137 に答える
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

おっと、配列のように見えますが、配列という意味ではありません。「配列」の動的サイズが必要な場合は、マッピングを使用できます。はい、それは最初の解決策です:

#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

私の2番目の解決策は、 array に似たものを使用することですが、サイズ変更機能があります。操作 [] をオーバーライドして、ユーザーに対して自動的に作成する必要があります。

#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
于 2012-04-18T04:34:32.843 に答える