C++ - 需要传递2D数组,但必须动态调整大小

我正在使用一个C++库,它要求我将它传递给一个2D数组。他们的代码示例给出了一个这样的静态大小的数组:C++ - 需要传递2D数组,但必须动态调整大小

double data[][2] = { 

{ 10, 20, },

{ 13, 16, },

{ 7, 30, },

{ 15, 34, },

{ 25, 4, },

};

但我需要传递运行时大小的数据。所以我试图这样做:

// unsigned numBins is passed in to this function and set at run time 

double** binData = new double*[numBins];

for(unsigned i=0; i < numBins; ++i) {

binData[i] = new double[2];

}

//Set the data with something like

// binData[7][0] = 10;

// binData[7][1] = 100;

//Later, diligently delete my data...

但是,这在我使用的库中失败。它绘制了一些垃圾数字的结尾。我知道数组并不是指针。图书馆可能会在某个地方做“sizeof”的时候感到困惑。

如果我无法改变这个库(它是第三方),我该如何去传递它动态大小的数据?

谢谢, 马迪。

回答:

大概API需要一个指向什么它假定是2D阵列的扁平表示的第一个元素。

所以简单的方法如下:

template<typename T> 

struct FlatVectorAs2D {

private:

size_t width;

size_t height;

std::vector<T> flat_vec;

public:

std::vector<T>& base() { return flat_vec; }

std::vector<T> const& base() const { return flat_vec; }

size_t w() const { return width; }

size_t h() const { return height; }

T* operator[](size_t index1) {

return &flat_vec[index1*height];

}

T const* operator[](size_t index1) const {

return &flat_vec[index1*height];

}

FlatVectorAs2D(size_t w = 1, size_t h = 1):width(w), height(h) {

flat_vec.resize(w*h);

}

void resize(size_t w, size_t h) {

width = w;

height = h;

flat_vec.resize(w*h);

}

T* raw() { return flat_vec.data(); }

T const* raw() const { return flat_vec.data(); }

};

用途:

void api_function(double* d); 

int main() {

size_t width = 50;

size_t height = 100;

FlatVectorAs2D<double> buffer(width, height);

buffer[0][1] = 1.0;

api_function(buffer.raw());

}

自然,这将取决于如何准确的API作品。

但是,如果我的猜测是正确的,这将有所帮助。

回答:

尝试这种情况:

typedef double two_doubles[2]; 

int main()

{

two_doubles * p = new two_doubles[300];

// ...

delete[] p;

}

现在p点至200个单位两个双打的阵列的第一子阵列。也就是说,p[i]double[2],而p[i][0],p[i][1]是它的成员元素。

(更好的是使用std::unique_ptr<two_doubles[]> p(new two_doubles[300]);和忘记了存储器管理。)

以上是 C++ - 需要传递2D数组,但必须动态调整大小 的全部内容, 来源链接: utcz.com/qa/260550.html

回到顶部