Memcpy二维矢量

时间:2015-10-09 21:37:52

标签: c++ vector stl

长话短说,我有一个二维向量,我需要memcpy()。如何获得指向数据结构的第一个元素的指针?

另外,鉴于它在连续内存中,我可以传入这个指针和总大小,对吗?

以下代码是否有效?

vector < vector <int> > vec;
//  .. assume it's populate and built up here
int* ptr = vec[0].data();  // use this pointer

3 个答案:

答案 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

每个内部数组都存在于内存中的不同位置,绝不相邻。

然而,根据您正在做什么以及您需要复制数据的位置,您可以遍历所有子向量并将每个内容按顺序存储到目的地。