如何在C++代码中封装C2D数组(Foo**)
How to wrap C 2D arrays (Foo**) in C++ code?
我使用一个C库,它以Foo**的形式在2D数组上运行。我在C++代码中使用它,所以我需要某种包装器。对于1D数组,它很简单,因为向量迭代器只是指针,但对于2D数组,它会变得更复杂。是否可以在不复制数据的情况下为Foo**制作包装器?
vector<Foo>
的元素存储在动态分配的连续内存中,因此您可以获得指向数组的指针Foo*
,就像您在第一种情况下所做的那样。
但是嵌套向量vector<vector<Foo> >
的元素不是作为连续的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();
这样就不会复制数据,只复制行指针。
我建议构建一个覆盖operator []
的类,该类在内部保存C指针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) { }
}
代码可能不是100%正确,但我希望你能理解并重新实现它。还要确保pointerdata的livetime超过您的c++包装器(还要包装c库的refcount机制?(。operator[]
的优点是,现在你可以这样使用它:
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] );
请注意,您可能希望为Mat<T>
实现自定义迭代器,使其与STL函数一起工作。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 使用指针从C++中的数组中获取最大值
- C++使用整数的压缩数组初始化对象
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '