Как я могу преобразовать std::vector<double>
в double array[]
?
Как я могу преобразовать std::vector<double>
в double array[]
?
Ответы:
Для этого есть довольно простой трюк, поскольку спецификация теперь гарантирует, что векторы хранят свои элементы непрерывно:
std::vector<double> v;
double* a = &v[0];
double*
что указывает на те же данные. Этот ответ работает именно для этого случая
std::vector<double> v; double* a = v.data();
Зачем? Вам необходимо уточнить: нужен ли вам указатель на первый элемент массива или массив?
Если вы вызываете функцию API, которая ожидает первого, вы можете сделать do_something(&v[0], v.size())
, где v
есть вектор double
s. Элементы вектора являются смежными.
В противном случае вам просто нужно скопировать каждый элемент:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Убедитесь, что не только thar arr
достаточно велик, но и arr
заполнен, или у вас есть неинициализированные значения.
size()
функции, std:vector
которую вам нужно использовать new
или malloc
для этого. Как уже было отмечено (вами), double arr[v.size()]
это недействительно. Использование вектора вместо нового - хорошая идея, но весь вопрос в том, как преобразовать вектор в массив.
vector<double> thevector;
//...
double *thearray = &thevector[0];
Это гарантированно сработает по стандарту, однако есть некоторые предостережения: в частности, позаботьтесь о том, чтобы использовать только thearray
тогда, когда это thevector
находится в рамках.
empty()
, иначе это вызовет страшный UB.
Векторы эффективно представляют собой массивы под кожей. Если у вас есть функция:
void f( double a[]);
Вы можете назвать это так:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Вам никогда не нужно преобразовывать вектор в фактический экземпляр массива.
f( &v[0] );
для вашей последней строки
Что касается std::vector<int> vec
, чтобы получить int*
, вы можете использовать два метода:
int * arr = & vec [0];
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}, может выглядеть следующим образом.
So &vec[0]
= start_ (address.) (Start_ эквивалентно int * заголовку массива)
В c++11
в data()
функции члена просто вернуть start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Мы можем сделать это с помощью метода 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;
}
Если у вас есть функция, то вам , вероятно , нужно это: foo(&array[0], array.size());
. Если вам удалось попасть в ситуацию, когда вам нужен массив, вам нужно провести рефакторинг, векторы - это в основном расширенные массивы, вы всегда должны их использовать.
Вы можете сделать что-то подобное
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;
}
}
}