ページ 11

二次元配列を要素とするコンテナについて

Posted: 2015年6月15日(月) 13:24
by akil
二次元配列を要素とするコンテナ(実質三次元配列)を作ることは可能なのでしょうか?

コード:

vector<int [100][100]> a


コード:

vector<int **> b
としてもうまくいきません。

コード:

vector<vector<vector<int>>>> c
とやるほかないのでしょうか?

Re: 二次元配列を要素とするコンテナについて

Posted: 2015年6月15日(月) 13:38
by usao
>二次元配列を要素とするコンテナ

こんな…?

コード:

struct Array2D{  int val[100][100];  };

std::vector< Array2D > The3D;

Re: 二次元配列を要素とするコンテナについて

Posted: 2015年6月15日(月) 15:10
by みけCAT
akil さんが書きました:

コード:

vector<int **> b
としてもうまくいきません。
きちんと実装すればうまく行きそうだと思います。
ただ、よくわかりませんが「スマートポインタ」を使った方がいいのでしょうか?

Re: 二次元配列を要素とするコンテナについて

Posted: 2015年6月15日(月) 17:08
by かずま
[2][3] ならいいけれど、[100][100]のようにサイズが大きいと
コピーに時間がかかります。

コード:

#include <iostream>
#include <vector>
using namespace std;
 
struct A2 {
    int v[3][4];
    int* operator[](size_t n) { return v[n]; }
};

int main()
{
    vector<A2> a(2);

    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 4; k++) {
                cout << ' ' << &a[i][j][k];
                a[i][j][k] = (i+1)*100 + (j+1)*10 + (k+1);
            }
            cout << endl;
        }
        cout << endl;
    }
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 4; k++) {
                cout << ' ' << a[i][j][k];
            }
            cout << endl;
        }
        cout << endl;
    }
}

Re: 二次元配列を要素とするコンテナについて

Posted: 2015年6月15日(月) 21:31
by みけCAT
たしかにコピーされるかという問題はありますね。
みけCAT さんが書きました:きちんと実装すればうまく行きそうだと思います。
この「きちんと実装すればうまく行きそう」というのは、「コンパイルエラーにならない」という意味です。
akil さんが書きました:

コード:

vector<vector<vector<int>>>> c
とやるほかないのでしょうか?
C++11のstd::arrayを使ったり

コード:

vector<std::array<std::array<int, 100>, 100> > a;
二次元配列もどきクラスを自作したり

コード:

struct array100x100 {
	int data[100 * 100];
	int* operator[](int idx) {
		return data + 100 * idx;
	}
};

vector<array100x100> a;
などの方法があります。