私は大きい2D配列int**
としてイメージを返すライブラリを使用しています。私はint*
1D配列に変換する必要があります。私は、メモリ・ブロックをコピーすることによって、かなり速いそれを行うことができたと思う:ダブルポインタ配列を単一ポインタに高速変換すると、おそらく連続している可能性があります
// have int labels** as 2D array, also have rows and cols
//create 1D array
int *labels1D = new int[rows*cols];
//copy contents
for(int i = 0; i < rows; i++) {
// Here I don't know anything about how those arrays were allocated
// Maybe std::copy would handle it for me?
std::copy_n(labels[i], cols, labels1D + i*cols);
}
ので最初の質問が、私はここに、より良い何かを行うことができるかどうかですか?図書館がブラックボックスであると仮定して、ここでは安全ですか?
私は、ライブラリのコードを変更することはあまりしたくないが、私はthis->currentLabels
私の側ライブラリ内のソース列が作成されたさらにどのように見つけた:
int** currentLabels; //in class declaration
...
// in the code
this->currentLabels = new int*[this->height];
for (int i = 0; i < this->height; ++i) {
this->currentLabels[i] = new int[this->width];
for (int j = 0; j < this->width; ++j) {
// some code for setting the value
}
}
は、行の値のように見えるとコラムは知られている。
ので2番目の質問は次のとおりです。私はそれが1つのメモリブロックに2次元配列を割り当てる作るためにこのコードを変更することができます。
this->currentLabels = malloc(nrows*sizeof(int*) + (nrows*(ncolumns*sizeof(int)));
私はその後、ちょうどコピーせずに私の1Dアレイに何とかそれをマッピングできるようにしますメモリ?
EDIT:@SamVarshavchikのおかげで、マッピングは次のように動作しているようだ:
// Allocate 2-D array as one block:
// Allocate pointers:
int** labels = new int*[rows];
// Allocate data:
auto ptr=new int[rows*cols];
for(int i = 0; i < rows; i++) {
labels[i] = &ptr[i*cols];
}
// fill with values ranging 0 to certain number
for(int i = 0; i < rows; i++){
for(int j = 0; j < cols; j++){
// the code for setting the values
labels[i][j] = i+j;
}
}
// have int labels** as 2D array, also have rows and cols
//create 1D array
int *labels1D; // = new int[rows*cols];
//assign contents:
labels1D = &labels[0][0];
ライブラリのコードでそれを破壊するための正しい方法は
delete[] ptr; //user2079303 fixed
delete[] labels;
のようです
はい、ライブラリコードを変更して1次元配列を割り当て、各行に別々にポインタの配列を割り当てることができます。しかし、ライブラリにはおそらくこの2次元配列の割り当てを解除しようとするコードがあります。それを見つけて同様の変更を加える必要があります。また、既存のライブラリコードは 'new'を使用しているので、' malloc'を使用する代わりに、それに固執してください。このユースケースでは、 'malloc'と' new'の間に究極の違いはありません。 –
@SamVarshavchikありがとう、私はそれを行う方法を探していますが、私はそれを実装する方法を得ることができません。なぜなら、1次元配列のために、ポインタブロック 'nrows * sizeof(int *) ' – Slowpoke
これは複雑ではありません。 1次元配列は 'auto ptr = new int [width * height]'として割り当てられ、行番号nへのポインタは '&ptr [n * width]'になります。かなり簡単。 –