Преобразование вектора в массив - существует ли "стандартный" способ сделать это?

Я знаю, что вы можете просто сделать: &theVector[0], но этот стандарт? Всегда ли это гарантировано?

Если нет, есть ли лучший, менее "хакерский" способ сделать это?

Ответ 1

Да, это поведение гарантировано. Хотя я не могу это процитировать, стандарт гарантирует, что векторные элементы хранятся последовательно в памяти, чтобы это разрешить.

Есть одно исключение:

Он не будет работать для 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>.

Ответ 2

С++ 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'
}

Это может привести к сбою или сделать что угодно, поэтому будьте осторожны с этим.

Ответ 3

Мы можем сделать это с помощью метода data(). С++ 11 предоставляет этот метод. Он возвращает указатель на первый элемент в векторе. vector Даже если он пуст, мы можем без проблем справиться с этой функцией

  vector<int>v;
  int *arr = v.data();

Ответ 4

Менее "хакерский" способ? Ну, вы можете просто скопировать:

#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;
}

Подробнее здесь: Как преобразовать вектор в массив в С++