2011-03-08 10 views
1

のようなものとすることができるオブジェクトの二次元アレイの必要性効率/エレガントな二次元コンテナ

myList<myObject*> myContainer::getRow(int a){ 
    if(a < 0 && a>=this->height) 
     return; 
    myList<myObject*> hlp; 
    for(int i=0; i<this->width; i++) 
     hlp.append(this->arr[a][i]); 
    return hlp; // returns a copy. Could also be a pointer if created with new. 
} 

他の方法も同様の行に従うことができます。リストオブジェクトを作成し、それを要求されたもので満たす。

私の質問:私はここで説明しているコンテナクラスを作成するエレガントな方法を考えることができます。例えば、リストオブジェクトの作成と塗りつぶしを避けることができますが、引き続き抽象化やユーザビリティを維持することができます。または、STLなどで何かを忘れてしまった場合は、アドバイスをお願いします。

答えて

4

STLには、スライスを使用して行と列として表示できるvalarrayコンテナがありますが、手動で行うか、ラッパークラスにラップする必要があります。また、スライスはvalarrayの値を表します(コピーではありません)。しかし、数値で使用され、ビット最適化されるように設計されています。イテレータはなく、拡張できません。それは通常のSTLコンテナのコンセプトに従いません。あなたがブーストを使用できない場合、それはまだ迅速かつ汚れた回避策として使用することができます。

std::valarray<float> array(16); 
// we can view it as a 4x4 matrix. 
// this represents the first line 
array[std::slice(0,4,1)]; 
// and the second column 
array[std::slice(1,4,4)]; 
// you cannot use the sliced array directly. they don't 
// have operator[], but they have operator=(valarray), and 
// valarray has a constructor that takes sliced arrays as input. 
0

あなたが目指すスピードは? background.e.gのようなリストのようなもので処理すると、getRow()とgetColumn()とgetDiagonal()を一定時間で取得することができます。 ベクター。 (ポインタを返すだけの場合)

初期化後にコンテナが大きくなるか、サイズが固定されますか?

コンテナのサイズがmとnの場合は、サイズがnのm std :: vectorsを格納できます。 n個のstd :: vectorのサイズはm、n + std :: vectorsのサイズは異なります。 行、coloumns、および対角線を記述する。 getメソッドは実装が簡単で、at()または[]メソッド/演算子の場合 3つのエントリを変更します。

+0

BatchyXのようなものが欠けていました。たぶん私は対角線のスライスを自分で書く必要があるかもしれませんが、今はstd :: sliceの存在が分かっているので、多くの助けになります。 – deo

関連する問題