C++でr行とc列の2次元配列Volatility [r] [c]を動的に割り当てました。何とかptrColumn [r1]で要素(r1、c1)にアクセスできるように、特定の列c1へのポインタptrColumnを作成することは可能ですか?
これまでは、動的ポインタを作成しようとしました。しかし、私はそれをすることはできませんでした。
ありがとうございました!C++で動的に割り当てられた2D配列の1つの行へのポインタ
答えて
いいえ、それは不可能ですあなたが持っている1つの代替は、にあります。オリジナルの配列のtrasposeを持つ別の2D配列を作成しますが、元の配列が変更されるたびにこの配列を更新します。おそらくそれを行う他の方法がありますが、列の配列だけではできません。
Boteのタイトル。 OPは彼が望むものを正しく表現していません。 – EFenix
通常、最初の次元は行インデックス用で、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へのポインタです。しかし今では、行へのポインタで作業することはできません。
最も簡単な方法は、私のために、メモリのブロックを予約することである。
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]を使用することができ
イテレータ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
で保持し、かつアレイの寸法はc
でr
であると仮定し、あなたは
c1
で
column iterator
を作成することができます
auto col_itor = stride_iterator<double*>{ dat + c1, c };
とオペレータとdat[r1][c1]
にある要素にアクセスする[]
auto& elem = col_itor[r1];
- 1. 静的に割り当てられた配列へのアクセスVSへの静的に割り当てられた配列へのポインタによるアクセス
- 2. ポインタと動的に割り当てられた配列は
- 3. C - 動的2D配列の文字と割り当てのスキャン
- 4. C++ 2D配列クラスの動的割り当て
- 5. ポインタへの*&配列の割り当て
- 6. C++バブルソート動的に割り当てられた配列
- 7. 動的に割り当てられたポインタ配列のメモリを拡張する
- 8. C++ 2D配列へのポインタ
- 9. に基づいて、C++での動的に割り当てられた配列
- 10. 構造体にポインタを動的に割り当てた配列
- 11. C++ポインタの配列が割り当てられない
- 12. 配列へのポインタの配列の割り当て
- 13. C++で動的に割り当てられた構造体の2D配列を作成する方法は?
- 14. Cの配列へのポインタ:アドレスの算術と配列の割り当て
- 15. ポインタの配列の動的割り当て
- 16. CUDAで動的に割り当てられた配列コピー
- 17. 2D配列を動的に割り当てる
- 18. ポインタ配列の動的メモリ割り当て
- 19. スマートポインタの2D配列を動的に割り当てるための構文
- 20. ポインタへのポインタ、動的メモリ割り当て
- 21. 動的に割り当てられた行列の値の入力 - C
- 22. 動的に割り当てられたchar配列に行を1つずつ取得する
- 23. C++関数から動的に割り当てられた2D配列を返す方法
- 24. 割り当てられた2D配列に書き込む
- 25. 文字列へのポインタの配列の割り当て
- 26. 行列とC++での配列の配列とそれらの動的割り当て
- 27. Cで動的に割り当てられた配列メンバーを削除する
- 28. 格納データ動的に割り当てられた配列
- 29. Cでの2D配列のメモリ割り当て
- 30. C++での2D配列のメモリ割り当て
"動的に割り当てられた2D配列 "はC++では明確に定義されていません。 2次元配列を動的に割り当てるには、少なくとも2つの異なる方法があります。アレイの物理構造に関する詳細情報をメモリに提供する必要があります。 – AnT