我使用C庫以Foo **的形式在2D數組上運行。我在C++代碼中使用它,所以我需要某種包裝。使用1D數組很簡單,因爲矢量迭代器只是指針,但在2D的情況下它變得更加複雜。是否可以在不復制數據的情況下爲Foo **創建一個包裝?如何在C++代碼中包裝C二維數組(Foo **)?
3
A
回答
3
vector<Foo>
的元素存儲在一個動態分配的連續內存中,因此您可以像第一種情況那樣獲取數組的指針Foo*
。
但是,嵌套向量vector<vector<Foo> >
的元素沒有存儲爲連續的二維數組,因此無法直接獲取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();
你沒有複製數據,只是行指針的方式。
1
我會建議構建一個覆蓋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職能的工作。
相關問題
- 1. 屏幕在C++中包裝二維數組
- 2. 替代二維數組在C#
- 3. C++二維數組
- 4. C#將二維數組包裝到球體中
- 5. C++中的二維數組
- 6. C++中的二維數組
- 7. c中的二維數組#
- 8. 如何一維數組轉換爲二維數組在C#
- 9. C中的二維數組如何變成一維數組?
- 10. Objective-C中的二維數組Objective-C
- 11. 如何在C中實現結構的二維數組C
- 12. c# - 如何反轉二維數組
- 13. C++如何填寫二維數組
- 14. 迭代包裝在對象中的二維數組
- 15. 在C中分配二維數組中的一維數組#
- 16. 按位|在二維數組中C
- 17. extern在C中聲明二維數組?
- 18. 二維數組在c#中的表?
- 19. c - 在二維數組中檢查null
- 20. 在C中的二維數組切片#
- 21. 在C#中乘以二維數組
- 22. 在C中打印二維數組
- 23. 如何在C++異常處理中包裝我的C代碼?
- 24. C#,旋轉二維數組
- 25. C++填充二維數組
- 26. C二維數組旋轉
- 27. 二維數組值C++
- 28. C++二維動態數組
- 29. C++二維數組問題
- 30. 二維數組錯誤C++
你想爲C庫提供一個STL容器(將其轉換爲'Foo **'),還是想用'Foo **'構建一個STL容器? – zakinster 2013-05-14 11:25:53