2016-07-25 89 views
1

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

谢谢!在C++中动态分配二维数组中的一行的指针

+0

“动态分配的二维数组“在C++中不是一个明确定义的术语。至少有两种不同的方式来动态分配二维数组。您需要在内存中提供有关阵列物理结构的更多信息。 – AnT

回答

0

不,那是不可能的,你有一种选择是。用原始数组的traspose创建另一个二维数组,但因为您拥有而没用每次更改原始数组时更新此数组。也许还有其他方法可以做到这一点,但是一些列没有。

+2

Bote问题的标题。 OP没有正确表达他/她想要的。 – EFenix

0

通常,第一个维度用于行索引,第二个维度用于列索引。 首先,你应该为指针的阵列(例如int *)分配内存和ADDRES作为指针保存的指针:

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

然后安排循环为每一行分配内存。例如:

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的指针。但是现在你不能使用指向行的指针。

+0

我认为OP想要的恰恰相反,即创建指向列的指针,而不是行。那么......看完这个问题的标题后,也许,你说得对 – EFenix

+0

@AntonioGarrido确切地说是 – mscnvrsy

+0

新不返回NULL是错误的情况。它th_ bad_alloc。你的代码似乎比C++更加C++ – EFenix

0

最简单的方法,对我来说,是预留的内存块:

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

那么,就可以计算出指针作为array2d +指数* R(记住,内存块存储阵列列从第一列到最后一列)。

如果你想计算指针行,如果你想指针使用array2d +指数* R(在这种情况下,存储器存储行后矩阵行。

在一些地方采用双运营商[] [],您可以使用:

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

对于这个代码,你可以在你的代码中使用数组[i] [j]

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

dat[r1][c1]与操作者
auto col_itor = stride_iterator<double*>{ dat + c1, c }; 

和访问该元素[]

auto& elem = col_itor[r1];