2016-07-25 71 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];