Как получить std :: vector указатель на необработанные данные? - PullRequest
144 голосов
/ 26 июня 2011

Я пытаюсь использовать std::vector как массив char.

Моя функция принимает пустой указатель:

void process_data(const void *data);

Прежде чем я просто использовал этот код:

char something[] = "my data here";
process_data(something);

Который работал как ожидалось.

Но теперь мне нужна динамичность std::vector, поэтому я попробовал этот код:

vector<char> something;
*cut*
process_data(something);

Вопрос в том, как передать вектор символов в мою функцию, чтобы я мог получить доступ к необработанным данным вектора (независимо от того, какой это формат - с плавающей точкой и т. Д.)?

Я пробовал это:

process_data(&something);

А это:

process_data(&something.begin());

Но он вернул указатель на бессмысленные данные, и последний дал предупреждение: warning C4238: nonstandard extension used : class rvalue used as lvalue.

Ответы [ 3 ]

221 голосов
/ 26 июня 2011

&something дает вам адрес std::vector объекта, а не адрес данных, которые он содержит. &something.begin() дает вам адрес итератора, возвращаемый begin() (как предупреждает компилятор, это технически не разрешено, поскольку something.begin() является выражением rvalue, поэтому его адрес не может быть получен).

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

  • &something[0] или &something.front() (адрес элемента с индексом 0) или

  • &*something.begin() (адрес элемента, на который указывает итератор, возвращаемый begin()).

В C ++ 11 новая функция-член была добавлена ​​в std::vector: data(). Эта функция-член возвращает адрес начального элемента в контейнере, как и &something.front(). Преимущество этой функции-члена в том, что ее можно вызывать, даже если контейнер пуст.

72 голосов
/ 26 июня 2011

something.data() вернет указатель на пространство данных вектора.

12 голосов
/ 26 июня 2011

Вместо этого возьмите указатель на первый элемент:

process_data (&something [0]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...