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 v
vektö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 arr
yeterince büyük olmadığından emin olun , ancak arr
doldurulur 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:vector
new
malloc
double 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 thearray
iken thevector
kapsamı 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> vec
almak için vec, int*
, iki yöntemi kullanabilirsiniz:
int * arr = & vec [0];
int * arr = vec.data ();
Herhangi bir T
vektör türünü dönüştürmek istiyorsanız T* array
, yukarıdakileri int
değ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++11
data()
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;
}
}
}