2016-07-25 4 views
1

C++でr行とc列の2次元配列Volatility [r] [c]を動的に割り当てました。何とかptrColumn [r1]で要素(r1、c1)にアクセスできるように、特定の列c1へのポインタptrColumnを作成することは可能ですか?
これまでは、動的ポインタを作成しようとしました。しかし、私はそれをすることはできませんでした。

ありがとうございました!C++で動的に割り当てられた2D配列の1つの行へのポインタ

+0

"動的に割り当てられた2D配列 "はC++では明確に定義されていません。 2次元配列を動的に割り当てるには、少なくとも2つの異なる方法があります。アレイの物理構造に関する詳細情報をメモリに提供する必要があります。 – AnT

答えて

0

いいえ、それは不可能ですあなたが持っている1つの代替は、にあります。オリジナルの配列のtrasposeを持つ別の2D配列を作成しますが、元の配列が変更されるたびにこの配列を更新します。おそらくそれを行う他の方法がありますが、列の配列だけではできません。

+2

Boteのタイトル。 OPは彼が望むものを正しく表現していません。 – EFenix

0

通常、最初の次元は行インデックス用で、2番目の次元は列用です。 まず、ポインタの配列(例えば、int *)のためにメモリを割り当て、ポインタへのポインタとしてADDRESを保存する必要があり:

int** Volatility = new int * [r]; 

は、次に、各列にメモリを割り当てるためにループを配置します。例:

for(int i = 0; i < r; i++) 
     Volatility[i] = new int [c]; 

しかし、インデックスを操作する方法はあなたの願いです。

あなたが最初のインデックスに列を操作したい場合は、単にロジック変更:あなたがVolatility[col][row]を見たよう

int r = 5, c = 10; 
    int** Volatility = new int * [c]; 
    // allocate memory for each column 
    for(int i = 0; i < c; i++) 
    { 
     Volatility[i] = new int [r]; 
    } 

は、単一要素であり、そしてVolatility[col]はcolumtへのポインタです。しかし今では、行へのポインタで作業することはできません。

+0

私は、OPがちょうど逆を望んでいる、つまり、行ではなく列へのポインタを作成すると思います。まあ...質問のタイトルを読んだら、おそらく、あなたは正しいです – EFenix

+0

@AntonioGarridoちょうど – mscnvrsy

+0

新しい返さないNULLはエラーの場合です。それはbad_allocになります。あなたのコードはC++よりもC言語のようです。 – EFenix

0

最も簡単な方法は、私のために、メモリのブロックを予約することである。

double* array2d= new double[r*c]; 

そして、あなたはarray2d +インデックスとしてポインタを計算することができます* R(メモリのブロックは、配列の列を格納し、覚えています最初の列から最後の列まで)。

あなたは、いくつかの場所にポインタがダブル演算子を使用したい場合は+インデックス* rを(この場合は、メモリが行の後に配列行を格納します。

をarray2d使用し、行へのポインタを計算する場合[] []、あなたが使用することができます。このコードの場合

double **array= new double*[r]; 
for (int i=1; i<r; ++i) 
    array[i]= array[i-1]+c; 

を、あなたのコード内で配列[i]の[j]を使用することができ

1

イテレータstrideが必要です。通常ポインターの++演算子は、オフセットが1の新しいポインターを返します。 strideイテレーターの場合、++オペレーターは、cという物理オフセットを持つ新しいstrideイテレーターを返します。したがって、オペレータ[]の場合は、+--です。ここでは簡単な例です:

template< typename Iterator_Type > 
struct stride_iterator 
{ 
    typedef typename std::iterator_traits<Iterator_Type>::value_type    value_type; 
    typedef typename std::iterator_traits<Iterator_Type>::reference     reference; 
    typedef typename std::iterator_traits<Iterator_Type>::difference_type   difference_type; 
    typedef typename std::iterator_traits<Iterator_Type>::pointer     pointer; 
    typedef typename std::iterator_traits<Iterator_Type>::iterator_category    iterator_category; 

    Iterator_Type iterator_; 
    difference_type step_; 

    stride_iterator(Iterator_Type it, difference_type dt) : iterator_(it), step_(dt) {} 

    reference operator [](difference_type dt) 
    { return iterator_[dt*step_]; } 

    //other ctors, dtor and operators 
}; 

この場合、ポインタは2次元配列がdouble** datで保持し、かつアレイの寸法はcrであると仮定し、あなたは

と列のインデックス c1column iteratorを作成することができます
auto col_itor = stride_iterator<double*>{ dat + c1, c }; 

とオペレータとdat[r1][c1]にある要素にアクセスする[]

auto& elem = col_itor[r1]; 
関連する問題