複数の要素数を持つ配列の動的生成

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
comet

複数の要素数を持つ配列の動的生成

#1

投稿記事 by comet » 11年前

二度目の質問失礼致します。
配列を動的生成する場合は

コード:

int* a;
int number=10;
a=new int[number];
delete[]a;
のようにすればよいとおぼえたのですが
b[10][10]
のような、要素数を二つ持つ配列の要素数を
2つとも変数にするためにはどうすればよいのでしょうか?

コード:

int* b;
int x=10;
int y=10;
b=new int[x][y];
のように書くとエラーが出ます。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 複数の要素数を持つ配列の動的生成

#2

投稿記事 by みけCAT » 11年前

・1列ずつ確保する(警告:各列の領域が連続になるかは保証されない、高い確率で連続にならない)

コード:

int main() {
	int** b;
	int x = 10, y = 10;
	// 生成
	b = new int*[x];
	for (int i = 0; i < x; i++)b[i] = new int[y];
	// 開放
	for (int i = 0; i < x; i++)delete[] b[i];
	delete[] b;
	return 0;
}
・1次元配列new int[x * y]を確保し、2次元配列とみなして利用する(b[j]の代わりにb[y * i + j]にアクセスする)
ソースコード省略

・1次元配列を2次元配列として利用できるように、
[]演算子をオーバーロードしてbがデータ配列のx*i番目(0-origin)の要素へのポインタを返すようなクラスを作成する

コード:

#include <cstdio>

template<typename T>
class two_d_array {
	private:
		T* array;
		unsigned int row_size, col_size;
	public:
		two_d_array() {
			array = new T[1];
			row_size = 1;
			col_size = 1;
		}
		two_d_array(unsigned int row, unsigned int col) {
			array = new T[col * row];
			row_size = row;
			col_size = col;
		}
		two_d_array(const two_d_array<T>& tda) {
			unsigned int all_size = tda.col_size * tda.row_size;
			array = new T[all_size];
			row_size = tda.row_size;
			col_size = tda.col_size;
			for (unsigned int i = 0; i < all_size; i++) array[i] = tda.array[i];
		}
		~two_d_array() {
			delete[] array;
		}
		two_d_array<T>& operator=(const two_d_array<T>& tda) {
			unsigned int all_size = tda.col_size * tda.row_size;
			delete[] array;
			array = new T[all_size];
			row_size = tda.row_size;
			col_size = tda.col_size;
			for (unsigned int i = 0; i < all_size; i++) array[i] = tda.array[i];
			return *this;
		}
		T* operator[](unsigned int idx) {
			return array + col_size * idx;
		}
		const T* operator[](unsigned int idx) const {
			return array + col_size * idx;
		}
};

int main() {
	int x = 10, y = 10;
	two_d_array<int> b(x, y);
	b[2][3] = 123;
	b[4][5] = 456;
	two_d_array<int> c = b;
	two_d_array<int> d;
	printf("%d\n", c[2][3]);
	printf("%d\n", c[4][5]);
	c[4][5] = 789;
	printf("%d\n", c[4][5]);
	printf("%d\n", b[4][5]);
	d = b;
	printf("%d\n",d[2][3]);
	d[2][3] = 101112;
	printf("%d\n",d[2][3]);
	printf("%d\n",b[2][3]);
	return 0;
}
などの方法が考えられます。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 複数の要素数を持つ配列の動的生成

#3

投稿記事 by みけCAT » 11年前

comet さんが書きました:b[10][10]
のような、要素数を二つ持つ配列の要素数を
2つとも変数にするためにはどうすればよいのでしょうか?
前の投稿ではC++と仮定しましたが、質問文中に言語が指定されていないので、
Javaを使うというのも一つの手です。

コード:

public class Main
{
	public static void main (String[] args) {
		int x = 10, y = 10;
		int[][] b = new int[x][y];
	}
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

comet

Re: 複数の要素数を持つ配列の動的生成

#4

投稿記事 by comet » 11年前

みけCATさん、ありがとうございます。
使用言語を明記しなかったのは私の落ち度でありました。すいません

長いこと返信せず失礼いたしました。
ソースコードを書いていただいた二例についていろいろ試してみましたが、
なるほど、基本的には一例目で対応できますね。
ただダブルポインタやオペレータなど未習得の技術が多いので勉強して出直します。
ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る