Могу ли я привести std:: vector<int>* к int*?

Допустим, у меня есть std::vector<int>* foo; и я должен использовать его как int* (массив int, а не указатель на int) для старой библиотеки типов C PVM. Насколько я понимаю, это может сработать, так как vector хранит свои элементы рядом друг с другом в памяти, как массивы. Так я попробовал (int*)foo, но каким-то образом я получаю ошибку, которую я не могу отладить, поэтому я думаю, что это должно быть проблемой. Есть идеи, мысли, элегантные обходные пути?

2 ответа

Решение

Вы не можете привести вектор непосредственно к массиву, потому что векторный объект состоит из указателей на данные массива, а не самих данных массива, которые выделяются динамически. Чтобы получить доступ к базовому массиву, используйте data() функция-член:

std::vector<int> vec;

int *arr = vec.data();

Или же

std::vector<int> *vecp = new std::vector<int>;

int *arr = vecp->data();

Да, ты можешь. Вы должны предпочесть этот ответ @ApproachingDarknessFish для использования std::vector::data который был введен в C++11.

Однако, если вы используете более старую версию C++, вы можете просто использовать &foo[0] чтобы получить int* к началу контейнера.

Смотрите этот вопрос, почему std::vector::data предпочтительнее &foo.front() а также &foo[0] (оба, которые приведут к неопределенному поведению, если foo пустой!)

Посмотрите на этот ответ относительно смежного макета std::vector память, которая ссылается на стандарт:

23.2.6 Шаблон класса вектор [вектор]

1 Вектор - это контейнер последовательности, который поддерживает итераторы произвольного доступа. Кроме того, он поддерживает (амортизируется) операции вставки и удаления с постоянным временем в конце; вставить и стереть в середине взять линейное время. Управление хранилищем осуществляется автоматически, хотя могут быть даны подсказки для повышения эффективности. Элементы вектора хранятся непрерывно, а это означает, что если v является вектором, где T - некоторый тип, отличный от bool, то он подчиняется тождеству &v[n] == &v[0] + n для всех 0 <= n

Другие вопросы по тегам