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