2015-10-09 2 views
0

Короче говоря, у меня есть 2-й вектор, который мне нужен для memcpy(). Как получить указатель на первый элемент структуры данных?Memcpy a 2-d vector

Кроме того, учитывая, что он находится в непрерывной памяти, я могу просто передать этот указатель и общий размер, правильно?

Будет ли работать следующий код?

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

Почему «Будет ли работать следующий код?»? Ты это пробовал? –

+6

Нет, это не смежно. Сожалею. –

+0

@ Mark: from cplusplus.com 'Поскольку элементы в векторе гарантированно сохраняются в смежных местах хранения в том же порядке, что и представленный вектором, извлеченный указатель может быть смещен для доступа к любому элементу массива. ' – Logicrat

ответ

6

У вас нет ни одного двумерного вектора, у вас есть вектор, который содержит другие векторы. Каждый вектор, рассматриваемый индивидуально, имеет непрерывное хранилище, но они не соприкасаются друг с другом - нет способа сделать то, что вы хотите, с помощью одной копии.

Вы можете использовать Boost Multi-dimensional Array Library для обработки одного вектора как двухмерного, который затем позволит вам получить все содержимое сразу.

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]; 
} 
0

Вы не можете хранить содержимое, потому что на самом деле у вас нет единого непрерывного массива. У вас есть данные, состоящие из многих частей.

Внешний вектор управляет его внутренним массивом. Этот массив состоит из внутренних векторных объектов, каждый из которых управляет отдельными внутренними массивами int. Так что это не просто один кусок памяти для всего.

Чтобы попытаться визуализировать:

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 

Каждый внутренний массив существует в другом месте в памяти, ни в коем случае рядом друг с другом.


Однако в зависимости от того, что вы делаете, и где вам нужно скопировать данные делать, вы могли бы быть в состоянии перебрать все суб-векторы и тетсру каждого из их содержимого последовательно по назначению.

Смежные вопросы