Могу ли я привести 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