Как получить указатель std::vector на необработанные данные?

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

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

void process_data(const void *data);

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

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

Работала так, как ожидалось.

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

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

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

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

process_data(&something);

И это:

process_data(&something.begin());

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

Ответ 1

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

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

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

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

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

Ответ 2

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

Ответ 3

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

process_data (&something [0]);