Я знаю, что вы можете просто сделать: &theVector[0]
, но этот стандарт? Всегда ли это гарантировано?
Если нет, есть ли лучший, менее "хакерский" способ сделать это?
Я знаю, что вы можете просто сделать: &theVector[0]
, но этот стандарт? Всегда ли это гарантировано?
Если нет, есть ли лучший, менее "хакерский" способ сделать это?
Да, это поведение гарантировано. Хотя я не могу это процитировать, стандарт гарантирует, что векторные элементы хранятся последовательно в памяти, чтобы это разрешить.
Есть одно исключение:
Он не будет работать для vector<bool>
из-за специализации шаблона.
http://en.wikipedia.org/wiki/Sequence_container_%28C%2B%2B%29#Specialization_for_bool
Эта специализация пытается сохранить память путем упаковки bools
вместе в бит-поле. Однако он нарушает некоторую семантику и как таковой &theVector[0]
на vector<bool>
не будет работать.
В любом случае vector<bool>
широко признается ошибкой, поэтому альтернативой является использование std::deque<bool>
.
С++ 11 предоставляет метод data()
на std::vector
, который возвращает T*
. Это позволяет:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vector = {1,2,3,4,5};
int* array = vector.data();
std::cout << array[4] << std::endl; //Prints '5'
}
Однако выполнение этого (или любого из описанных выше способов) может быть опасным, поскольку указатель может стать недействительным, если вектор изменен. Это можно показать с помощью
#include <iostream>
#include <vector>
int main()
{
std::vector<int> vector = {1,2,3,4,5};
int* array = vector.data();
vector.resize(100); //This will reserve more memory and move the internal array
//This _may_ end up taking the place of the old array
std::vector<int> other = {6,7,8,9,10};
std::cout << array[4] << std::endl; //_May_ now print '10'
}
Это может привести к сбою или сделать что угодно, поэтому будьте осторожны с этим.
Мы можем сделать это с помощью метода data(). С++ 11 предоставляет этот метод. Он возвращает указатель на первый элемент в векторе. vector Даже если он пуст, мы можем без проблем справиться с этой функцией
vector<int>v;
int *arr = v.data();
Менее "хакерский" способ? Ну, вы можете просто скопировать:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> vect0r;
int array[100];
//Fill vector
for(int i = 0; i < 10 ; i++) vect0r.push_back( i ) ;
//Copy vector to array[ ]
for( i = 0; i < vect0r.size(); i++) array[i] = vect0r[i];
//Dispay array[ ]
for( i = 0; i < vect0r.size(); i++) cout<< array[i] <<" \n";
cout<<" \n";
return 0;
}
Подробнее здесь: Как преобразовать вектор в массив в С++