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 の周辺のクラスだけでやりたいと思って
ます。
> vector ですと、[]によるアクセスはできない(と思った)ので
> 使ってません。
できますよ。
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;
}
失礼しました。
調べてみたところvector でも使えました>[]
ですが、あらかじめ resize() しておかないと、要素の
参照が行えず、insert() の方も、iterator の使い方が
解りづらいので、Add()が使える CArray 系のクラスを
使いたいところです。方法はないでしょうか?
> ですが、あらかじめ resize() しておかないと、要素の
> 参照が行えず、
CArrayであっても同じではないかと。
> insert() の方も、iterator の使い方が
> 解りづらいので、Add()が使える CArray 系のクラスを
> 使いたいところです。
vector<T>::push_back() と CArray<T>::Add() は
機能的にコンパチです。集合の末尾に追加してくれます。
> vector<T>::push_back() と CArray<T>::Add() は
> 機能的にコンパチです。集合の末尾に追加してくれます。
ありがとうございます。
やっぱり vector 使う方が素直ですかねぇ。
そっちでやってみます。
ありがとうございました>みなさま。