多次元配列の実装 – プログラミング – Home

通知
すべてクリア

[解決済] 多次元配列の実装


DOSKOI-PANDA
 DOSKOI-PANDA
(@DOSKOI-PANDA)
ゲスト
結合: 22年前
投稿: 55
Topic starter  

VC++ 6.0 で開発しています。
3次元配列を実装するのに以下の様な方法を取っております。

-----------------------------------------------------
template <class COBJARRAY>
// COBJARRAY must be CArray<class, class&>
class CRealArray : public COBJARRAY {
public:
CRealArray() {}
CRealArray(const CRealArray& oArray) {
UINT nSize = oArray.GetSize();
SetSize(nSize);
for (UINT i = 0; i < nSize; i++) {
SetAt(i, oArray[i]);
}
}
CRealArray& operator = (const CRealArray& oArray) {
UINT nSize = oArray.GetSize();
SetSize(nSize);
for (UINT i = 0; i < nSize; i++) {
SetAt(i, oArray[i]);
}
return *this;
};
};

struct StData {
UINT nId;
LPSTR lpszName;
};

typedef CArray<StData,StData&> CstDataArray;
typedef CRealArray<CstDataArray> CDataArray;
typedef CArray<CDataArray,CDataArray&> CstData2DArray;
typedef CRealArray<CstData2DArray> CData2DArray;
typedef CArray<CData2DArray,CData2DArray&> CstData3DArray;
typedef CRealArray<CstData3DArray> CData3DArray;
-----------------------------------------------------

本来、

typedef CArray<StData,StData&> CDataArray;
typedef CArray<CDataArray,CDataArray&> CData2DArray;
typedef CArray<CData2DArray,CData2DArray&> CData3DArray;

とだけ、やりたいところをCArray で作ったクラスは CObject の
派生クラスになってしまうため、こんな面倒なことになっている
わけですが、もっとエレガントな方法はないものでしょうか?

vector ですと、[]によるアクセスはできない(と思った)ので
使ってません。CArray の周辺のクラスだけでやりたいと思って
ます。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> vector ですと、[]によるアクセスはできない(と思った)ので
> 使ってません。

できますよ。


返信引用
Kazuki
 Kazuki
(@Kazuki)
ゲスト
結合: 22年前
投稿: 41
 

vectorは使わないとなってるのですが…
vectorでも[]によるアクセスは可能です

#include <iostream>
#include <vector>

typedef std::vector< std::vector< std::vector<int> > > ivector3;

int main(int argc,char **argv)
{
ivector3 iv3(10,std::vector< std::vector<int> >(10,std::vector<int>(10)));

iv3[1][2][3] = 100;
std::cout << iv3[1][1][1] << , << iv3[1][2][3] << std::endl;

return 0;
}


返信引用
DOSKOI-PANDA
 DOSKOI-PANDA
(@DOSKOI-PANDA)
ゲスト
結合: 22年前
投稿: 55
Topic starter  

失礼しました。
調べてみたところvector でも使えました>[]

ですが、あらかじめ resize() しておかないと、要素の
参照が行えず、insert() の方も、iterator の使い方が
解りづらいので、Add()が使える CArray 系のクラスを
使いたいところです。方法はないでしょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

> ですが、あらかじめ resize() しておかないと、要素の
> 参照が行えず、

CArrayであっても同じではないかと。

> insert() の方も、iterator の使い方が
> 解りづらいので、Add()が使える CArray 系のクラスを
> 使いたいところです。

vector<T>::push_back() と CArray<T>::Add() は
機能的にコンパチです。集合の末尾に追加してくれます。


返信引用
DOSKOI-PANDA
 DOSKOI-PANDA
(@DOSKOI-PANDA)
ゲスト
結合: 22年前
投稿: 55
Topic starter  

> vector<T>::push_back() と CArray<T>::Add() は
> 機能的にコンパチです。集合の末尾に追加してくれます。

ありがとうございます。
やっぱり vector 使う方が素直ですかねぇ。

そっちでやってみます。
ありがとうございました>みなさま。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました