Как преобразовать вектор в массив - PullRequest
308 голосов
/ 27 мая 2010

Как конвертировать std::vector<double> в double array[]?

Ответы [ 10 ]

486 голосов
/ 27 мая 2010

Это довольно простой трюк, поскольку спецификация гарантирует, что векторы сохраняют свои элементы непрерывно:

std::vector<double> v;
double* a = &v[0];
135 голосов
/ 27 мая 2010

Зачем? Вам необходимо уточнить: нужен ли вам указатель на первый элемент массива или массив?

Если вы вызываете функцию API, которая ожидает первого, вы можете сделать do_something(&v[0], v.size()), где v - это вектор double с. Элементы вектора смежны.

В противном случае вам просто нужно скопировать каждый элемент:

double arr[100];
std::copy(v.begin(), v.end(), arr);

Убедитесь, что не только thar arr достаточно велик, но и заполнен arr, или у вас есть неинициализированные значения.

71 голосов
/ 14 октября 2016

Для C ++ 11 , vector.data() добьются цели.

16 голосов
/ 27 мая 2010
vector<double> thevector;
//...
double *thearray = &thevector[0];

Это гарантированно работает по стандарту, однако есть некоторые предостережения: в частности, используйте только thearray, пока thevector находится в области действия.

13 голосов
/ 27 мая 2010

Векторы эффективно представляют собой массивы под кожей. Если у вас есть функция:

void f( double a[]);

Вы можете назвать это так:

vector <double> v;
v.push_back( 1.23 )
f( &v[0] );

Вам никогда не нужно преобразовывать вектор в фактический экземпляр массива.

2 голосов
/ 09 сентября 2018

Что касается std::vector<int> vec, vec для получения int*, вы можете использовать два метода:

  1. int * arr = & vec [0];

  2. int * arr = vec.data ();

Если вы хотите преобразовать любой тип T вектор в T* array, просто замените int на T.

Я покажу вам, почему вышеупомянутые две работы, для хорошего понимания?

std::vector по сути является динамическим массивом.

Основной элемент данных, как показано ниже:

template <class T, class Alloc = allocator<T>>
class vector{
    public:
        typedef T          value_type;
        typedef T*         iterator;
        typedef T*         pointer;
        //.......
    private:
        pointer start_;
        pointer finish_;
        pointer end_of_storage_;

    public:
        vector():start_(0), finish_(0), end_of_storage_(0){}
    //......
}

range (start_, end_of_storage_) - это вся память массива, выделенная вектором;

range(start_, finish_) - это вся память массива, используемая вектором;

range(finish_, end_of_storage_) - это память резервного массива.

Например, что касается вектора vec. указатель {9, 9, 1, 2, 3, 4} может выглядеть следующим образом.

enter image description here

Итак &vec[0] = start_ (address.) (Start_ эквивалентно int * заголовку массива)

В c++11 функция-член data() просто возвращает start_

pointer data()
{ 
     return start_; //(equivalent to `value_type*`, array head)
}
1 голос
/ 10 октября 2017
std::vector<double> vec;
double* arr = vec.data();
1 голос
/ 04 июля 2017

Мы можем сделать это, используя метод data (). C ++ 11 предоставляет этот метод.

Фрагмент кода

#include<bits/stdc++.h>
using namespace std;


int main()
{
  ios::sync_with_stdio(false);

  vector<int>v = {7, 8, 9, 10, 11};
  int *arr = v.data();

  for(int i=0; i<v.size(); i++)
  {
    cout<<arr[i]<<" ";
  }

  return 0;
}
1 голос
/ 09 января 2017

Если у вас есть функция, то вам, вероятно, нужно это: foo(&array[0], array.size());. Если вам удалось попасть в ситуацию, когда вам нужен массив, вам нужно провести рефакторинг, векторы - это в основном расширенные массивы, вы всегда должны их использовать.

0 голосов
/ 30 октября 2017

Вы можете сделать что-то подобное

vector <int> id;
vector <double> v;

if(id.size() > 0)
{
    for(int i = 0; i < id.size(); i++)
    {
        for(int j = 0; j < id.size(); j++)
        {
            double x = v[i][j];
            cout << x << endl;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...