C++ 如何在C+中包装c2d数组(Foo**)+;密码?

C++ 如何在C+中包装c2d数组(Foo**)+;密码?,c++,c,stl,wrapper,C++,C,Stl,Wrapper,我使用一个C库,它以Foo**的形式在2D数组上运行。我在C++代码中使用它,所以我需要某种包装。对于一维数组,它很简单,因为向量迭代器只是指针,但对于二维数组,它会变得更复杂。是否可以在不复制数据的情况下为Foo**创建包装器?向量的元素存储在动态分配的连续内存中,因此您可以像在第一种情况下一样获得指向数组的指针Foo* 但是嵌套向量vector的元素不是作为连续的2D数组存储的,因此不能直接获得Foo** 您可以尝试以下方法: vector<vector<Foo> >

我使用一个C库,它以Foo**的形式在2D数组上运行。我在C++代码中使用它,所以我需要某种包装。对于一维数组,它很简单,因为向量迭代器只是指针,但对于二维数组,它会变得更复杂。是否可以在不复制数据的情况下为Foo**创建包装器?

向量的元素存储在动态分配的连续内存中,因此您可以像在第一种情况下一样获得指向数组的指针
Foo*

但是嵌套向量
vector
的元素不是作为连续的2D数组存储的,因此不能直接获得
Foo**

您可以尝试以下方法:

vector<vector<Foo> > data;
vector<Foo*> data_rows;
for(auto it = data.begin(); it != data.end(); ++it) {
    //in c++11, you can use data() instead of casting begin()
    data_rows.push_back(it->data());
}
Foo** c_data = data_rows.data();
矢量数据;
矢量数据行;
for(auto it=data.begin();it!=data.end();+it){
//在c++11中,可以使用data()代替casting begin()
数据行。向后推(it->data());
}
Foo**c_data=data_rows.data();

这样,您就不需要复制数据,只需要复制行指针。

我建议构建一个覆盖
操作符[]
的类,它在内部保存C指针Foo**

例如:


请注意,您可能希望为
Mat
实现自定义迭代器,以使其与STL函数一起工作。

您希望为您的C库提供STL容器(将其转换为
Foo**
),还是希望用
Foo**
构建STL容器?您可能应该使用
vector
作为目标,与malloc分配的内存不同,这更像是C++y。然后可以执行
vec.data()
以获得
Foo**
template <class T>
class Mat<T> {
private: T** ptr; int n; int m; //< 2D array is of size n x m
public: Mat( int n, int m ) : n(n), m(m) {}
Col<T> operator[]( int k ) { assert(k<n); return Col<T>(*(ptr+k*n)); }
T& get(int k, int i ) { return *(*(ptr+k*n)+i); }
}
template <class T>
class Col<T> { private: T* ptr;
public: T& operator[]( int i ) { return *(ptr+i); }
Col<T>(T* ptr) : ptr(ptr) { }
}
Foo** ptr = from_some_c_library();
Mat<Foo> mat(ptr,3,4);
Foo& element_at_2_2 = mat[2][2];
assert( mat.get(2,2) == mat[2][2] );