Як перетворити a std::vector<double>
в a double array[]
?
Як перетворити a std::vector<double>
в a 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
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_)
це вся пам'ять масиву, яку використовує вектор;
The range(finish_, end_of_storage_)
- це резервна пам'ять масиву.
Наприклад, щодо вектора vec. який має {9, 9, 1, 2, 3, 4}, вказівник може подобатися нижче.
Отже &vec[0]
= start_ (адреса.) (Start_ еквівалентно int * head масиву)
У 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;
}
}
}