我有一个动态分配的2D数组Volatility [r] [c],在C ++中有r行和c列。以某种方式可以创建一个指针ptrColumn到某个列c1,这样我可以用ptrColumn [r1]访问元素(r1,c1)吗?
到目前为止,我试图创建动态指针。但我没有设法做到这一点。
谢谢!
答案 0 :(得分:1)
您需要一个stride
迭代器。普通指针的++
运算符返回一个偏移量为1
的新指针;对于stride
迭代器,++
运算符将返回一个具有物理偏移stride
的新c
迭代器;因此对于运营商[]
,+
和--
;这是一个简单的例子:
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
};
这种情况下,假设持有2D数组的指针为double** dat
,并且数组的维度为r
c
,您可以在列创建column iterator
使用
c1
auto col_itor = stride_iterator<double*>{ dat + c1, c };
并使用operator []
访问dat[r1][c1]
处的元素
auto& elem = col_itor[r1];
答案 1 :(得分:0)
通常第一维用于行索引,第二维用于列。
首先,你应该为指针数组分配内存(例如int *
)并将addres保存为指针指针:
int** Volatility = new int * [r];
然后安排循环为每一行分配内存。 E.g:
for(int i = 0; i < r; i++)
Volatility[i] = new int [c];
但是你的目标是如何使用索引。
如果要在第一个索引上使用列,只需更改逻辑:
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][row]
是单个元素,而Volatility[col]
是指向columt的指针。但是现在你无法使用指向行的指针。
答案 2 :(得分:0)
对我来说,最简单的方法是保留内存块:
double* array2d= new double[r*c];
然后,你可以将指针计算为array2d + index * r(记住,内存块按列列出,从第一列到最后一列)。
如果要计算指向行的指针,请使用array2d + index * r(在这种情况下,内存会在行之后存储数组。
如果你想让某些地方的指针使用double operator [] [],你可以使用:
double **array= new double*[r];
for (int i=1; i<r; ++i)
array[i]= array[i-1]+c;
对于此代码,您可以在代码中使用array [i] [j]。
答案 3 :(得分:0)
不,那是不可能的。你有一个替代方案是创建另一个2D数组,其中包含原始数组的traspose但是没用,因为每次原始数组更改时你都必须更新这个数组。也许还有其他方法可以做到这一点,但是一系列的专栏都没有。