Элементы в стандартном векторе выделяются как один непрерывный фрагмент памяти.
Вы можете получить указатель на память, взяв адрес первого элемента, что можно сделать несколькими способами:
std::vector<int> vec;
/* populate vec, e.g.: vec.resize(100); */
int* arr = vec.data(); // Method 1, C++11 and beyond.
int* arr = &vec[0]; // Method 2, the common way pre-C++11.
int* arr = &vec.front(); // Method 3, alternative to method 2.
Однако, если вам не нужно передать базовый массив некоторым старым интерфейсам, обычно вы можете просто использовать операторы для вектора напрямую.
Обратите внимание, что вы можете получить доступ только к vec.size()
элементам возвращаемого значения. Доступ к нему - неопределенное поведение (даже если вы думаете, что для него зарезервирована емкость).
Если у вас был указатель на вектор, вы можете сделать то же самое выше, просто разыменовав:
std::vector<int>* vecptr;
int* arr = vecptr->data(); // Method 1, C++11 and beyond.
int* arr = &(*vecptr)[0]; // Method 2, the common way pre-C++11.
int* arr = &vec->front(); // Method 3, alternative to method 2.
Еще лучше, попробуйте получить ссылку на него.
О вашем решении
Вы пришли к решению:
int* vMem = vec->_Myfirst;
Единственный раз, когда это сработает, - это конкретная реализация этой конкретной версии компилятора. Это не является стандартным, поэтому не гарантируется работа между компиляторами или даже разными версиями вашего компилятора.
Может показаться, что все в порядке, если вы разрабатываете только на одной платформе и компиляторе, но лучше сделать это стандартным способом, учитывая выбор.