Nasıl dönüştürebilirim std::vector<double>a double array[]?
Nasıl dönüştürebilirim std::vector<double>a double array[]?
Yanıtlar:
Spesifikasyon şimdi vektörlerin öğelerini bitişik olarak saklamasını garanti ettiğinden , bunu yapmak için oldukça basit bir hile var :
std::vector<double> v;
double* a = &v[0];
double*aynı verilere işaret eden bir şeye ihtiyacın var . Bu cevap tam da bu davada işe yarıyor
std::vector<double> v; double* a = v.data();
Ne için? Açıklığa kavuşturmanız gerekiyor: Bir dizinin ilk öğesinin veya dizinin bir işaretçisine mi ihtiyacınız var?
Birincisini bekleyen bir API işlevi çağırıyorsanız, bunu yapabilirsiniz do_something(&v[0], v.size()), nerede s vvektörü double. Bir vektörün elemanları bitişiktir.
Aksi takdirde, her bir öğeyi kopyalamanız yeterlidir:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Sadece thar'ın arryeterince büyük olmadığından emin olun , ancak arrdoldurulur veya başlatılmamış değerleriniz vardır.
size()işlevi kullanarak boyutlandırmayı planladığınızı söylüyor. Zaten belirtildiği gibi (sizin tarafınızdan) geçerli değil. Vektörü yeni yerine kullanmak iyi bir fikirdir, ancak sorunun tüm amacı bir vektörü bir diziye nasıl dönüştürebileceğinizdir. std:vectornewmallocdouble arr[v.size()]
vector<double> thevector;
//...
double *thearray = &thevector[0];
Özel dikkat gösterecektir sadece kullanımına: Bu standarda göre çalışmaları garantilidir, ancak bazı uyarılar vardır thearrayiken thevectorkapsamı içindedir.
empty(), aksi takdirde bu korkunç UB'yi çağırır.
Vektörler etkili bir şekilde derinin altındaki dizilerdir. Bir fonksiyonunuz varsa:
void f( double a[]);
şöyle diyebilirsiniz:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Bir vektörü gerçek bir dizi örneğine dönüştürmeniz gerekmez.
f( &v[0] );son hattın için demek
Gelince std::vector<int> vecalmak için vec, int*, iki yöntemi kullanabilirsiniz:
int * arr = & vec [0];
int * arr = vec.data ();
Herhangi bir Tvektör türünü dönüştürmek istiyorsanız T* array, yukarıdakileri intdeğiştirin T.
Size iyi bir anlayış için yukarıdaki iki çalışmanın neden işe yaradığını göstereceğim?
std::vector aslında dinamik bir dizidir.
Ana veri üyesi aşağıdaki gibi:
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_)Vektör tahsis tüm dizi bellektir;
range(start_, finish_)Vektör kullanılan tüm dizi bellektir;
range(finish_, end_of_storage_)Yedek dizi bellektir.
Örneğin, bir vektör vec. {9, 9, 1, 2, 3, 4} olan işaretçi aşağıdaki gibidir.
Yani &vec[0]= başlangıç_ (adres.) (Başlangıç_ int * dizi başlığına eşdeğerdir)
In üye fonksiyonu sadece start_ dönmekc++11data()
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Bunu data () yöntemini kullanarak yapabiliriz. C ++ 11 bu yöntemi sağlar.
#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;
}
Eğer bir işlevi varsa, o zaman muhtemelen bu gerekir: foo(&array[0], array.size());. Eğer bir diziye ihtiyaç duyduğunuz bir duruma girmeyi başardıysanız, yeniden düzenleme yapmanız gerekir, vektörler temelde genişletilmiş dizilerdir, bunları her zaman kullanmalısınız.
Bunun gibi bazı şeyler yapabilirsiniz
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;
}
}
}