Преобразование вектора в массив - есть ли «стандартный» способ сделать это? - PullRequest
11 голосов
/ 30 декабря 2011

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

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

Ответы [ 4 ]

20 голосов
/ 30 декабря 2011

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

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

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

13 голосов
/ 21 марта 2014

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

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

1 голос
/ 04 июля 2017

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

  vector<int>v;
  int *arr = v.data();
0 голосов
/ 30 декабря 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...