长话短说,我有一个二维向量,我需要memcpy()。如何获得指向数据结构的第一个元素的指针?
另外,鉴于它在连续内存中,我可以传入这个指针和总大小,对吗?
以下代码是否有效?
vector < vector <int> > vec;
// .. assume it's populate and built up here
int* ptr = vec[0].data(); // use this pointer
答案 0 :(得分:6)
您没有单个二维矢量,您有一个包含其他矢量的矢量。每个矢量,单独考虑,具有连续存储,但它们不相邻 - 没有办法用一个副本做你想要的。
您可以使用Boost Multi-dimensional Array Library将单个矢量视为二维矢量,这样您就可以立即获取整个内容。
答案 1 :(得分:2)
不,只有每个vector<int>
都有连续的内存。所以你有什么:
vector < vector <int> > vec;
// ...
int** ptr = new *int[vec.size()];
for (int i = 0; i < vec.size(); ++i) {
ptr[i] = &vec[i][0];
}
答案 2 :(得分:0)
您无法记忆内容,因为您实际上没有一个连续的数组。您的数据由许多部分组成。
外部向量管理其内部数组。该数组由内部矢量对象组成,每个内部矢量对象管理它们自己独立的内部内部数组。所以这不仅仅是整个事情的一大块记忆。
尝试将其可视化:
vector<vector<int>> object
|
|-----> internal array:
vector<int>object
|
|------> internal array:
int
int
int
vector<int>object
|
|------> internal array:
int
int
int
vector<int>object
|
|------> internal array:
int
int
int
每个内部数组都存在于内存中的不同位置,绝不相邻。
然而,根据您正在做什么以及您需要复制数据的位置,您可以遍历所有子向量并将每个内容按顺序存储到目的地。