• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

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

c/c++ 来源:Madeleine P. Vincent 3次浏览

我正在使用一个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作品。

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


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)