7

サイズを知らずに配列の配列または多次元配列を宣言したい。

この場合、単純な配列を使用して行ったのと同様のことを実行したいと思います。

int *array;
cin >> size;
array = new int[size];

たぶん私は次のようなポインタのポインタを初期化するためにループすることができます:

int **array;
cin >> rows >> col;
array = new *int[rows]
for (int i = 0; i < rows; ++i)
    array[i] = new int[col];

しかし、より良い解決策が存在する場合は、これを行わないことをお勧めします。

4

4 に答える 4

6

std :: vectorを使用してみませんか?

std::vector<std::vector<int> > array;

ポインタの配列を使用したくない場合は、サイズを取得して行の配列としてアクセスした後に動的に割り当てる1つの大きな配列を使用できます。

int rows = 10;
int columns = 20;

int* array = new int[rows * columns];

for (int count = 0; count < rows; count++)
{
   int* row = &array[count * columns];

   for (int inner_count = 0; inner_count < columns; inner_count++)
   {
      int* element = &row[inner_count];

      //do something
   }
}

delete [] array;
于 2012-10-10T23:56:12.433 に答える
2

ループバージョンを使用する必要があります。1つの大きなブロックを割り当てて、それに独自のint*インデックスを作成するという、わずかな改善を1つ行うことができます。

int **array;
int *storage;
cin >> rows >> col;
array = new *int[rows];
storage = new int[rows*col];
for (int i = 0; i < rows; ++i)
    array[i] = storage + col * i;

array[i][j]これには、配列にアクセスするための構文を引き続き使用できるという優れたプロパティがあります。

于 2012-10-11T00:03:58.993 に答える
1

単一のstd::vectorを使用して、2次元配列全体を含み、それをクラスでラップして詳細を非表示にすることができます。次に例を示します。これは、およびdata( row, col )で要素への参照を返すメンバー関数を使用します。配列の各エントリがそのとの積に初期化される2次元行列の例を含めました。このクラスのインスタンスがスコープ外になると、デフォルトのデストラクタが呼び出されてメモリが解放されます。そのため、メモリを解放するためにdelete[]を呼び出すことを覚えておく必要はありません。マトリックスのすべての要素はメモリ内で隣接します。これはキャッシュフレンドリーであり、優れたパフォーマンスを提供するはずです。rowcolintrowcol

#include <iostream>
#include <vector>
#include <stdexcept>

template <typename T>
class matrix {
    std::vector<T> data_;
public:
    size_t const rows_;
    size_t const cols_;
    matrix(size_t rows, size_t cols)
        : rows_(rows)
        , cols_(cols)
        , data_( rows * cols )
    {}
    T& data( size_t row, size_t col ) {
        if (row > rows_ || col > cols_) throw std::out_of_range("matrix");
        return data_[ row * cols_ + col ];
    }
};

int main( int argc, char** argv )
{
    matrix<int> array(100,100);

    for(size_t r=0; r < array.rows_; ++r) {
        for(size_t c=0; c < array.cols_; ++c) {
            array.data(r,c) = r * c;
        }
    }

    std::cout << "8 x 7 = " << array.data(8,7) << std::endl;

    return 0; // array goes out of scope here, memory released automatically
}

これを実行すると、

8 x 7 = 56
于 2012-10-11T04:45:35.200 に答える
0

気になるなら、ヘルパーがいるともう少し便利になります

template <typename T>
struct C3DArray
{
    vector<vector<vector<T>>> m;
    C3DArray(int size_x, int size_y, int size_z)
        : m(make(T(), size_z, size_y, size_x))
    { }

    template <typename U> static std::vector<U> make(U v, size_t n) {
        return { n, std::move(v) };
    }

    template <typename U, typename... Dim> static auto make(U v, size_t n, Dim... other)
        -> std::vector<decltype(make(v, other...))> {
        return { n, make(v, other...) };
    }
};

これは可変個引数を使用します。次のように使用します。

C3DArray<int> arr(3,4,20);
于 2012-10-11T00:08:51.807 に答える