指向C ++中动态分配的2D数组中的一行

时间:2016-07-25 19:43:17

标签: c++ arrays pointers dynamic

我有一个动态分配的2D数组Volatility [r] [c],在C ++中有r行和c列。以某种方式可以创建一个指针ptrColumn到某个列c1,这样我可以用ptrColumn [r1]访问元素(r1,c1)吗? 到目前为止,我试图创建动态指针。但我没有设法做到这一点。

谢谢!

4 个答案:

答案 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但是没用,因为每次原始数组更改时你都必须更新这个数组。也许还有其他方法可以做到这一点,但是一系列的专栏都没有。

相关问题