Bagaimana saya mengonversi a std::vector<double>
ke a double array[]
?
Bagaimana saya mengonversi a std::vector<double>
ke a double array[]
?
Jawaban:
Ada trik yang cukup sederhana untuk melakukannya, karena spec sekarang menjamin vektor menyimpan elemen-elemennya secara bersamaan:
std::vector<double> v;
double* a = &v[0];
double*
yang menunjuk ke data yang sama. Jawaban ini tepat untuk kasus itu
std::vector<double> v; double* a = v.data();
Untuk apa? Anda perlu mengklarifikasi: Apakah Anda memerlukan pointer ke elemen pertama array, atau array?
Jika Anda memanggil fungsi API yang mengharapkan yang pertama, Anda dapat melakukannya do_something(&v[0], v.size())
, di mana v
vektor double
s. Elemen-elemen vektor berdekatan.
Jika tidak, Anda hanya perlu menyalin setiap elemen:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Pastikan tidak hanya arr
itu cukup besar, tetapi itu arr
akan terisi, atau Anda memiliki nilai yang tidak diinisialisasi.
size()
fungsi std:vector
Anda harus menggunakan new
atau malloc
untuk melakukannya. Seperti yang sudah ditunjukkan (oleh Anda) itu double arr[v.size()]
tidak valid. Menggunakan vektor di tempat yang baru adalah ide yang bagus, tetapi seluruh poin dari pertanyaan adalah bagaimana Anda dapat mengubah vektor menjadi sebuah array.
vector<double> thevector;
//...
double *thearray = &thevector[0];
Ini dijamin untuk bekerja sesuai standar, namun ada beberapa peringatan: khususnya berhati-hati untuk hanya menggunakan thearray
saat thevector
berada dalam ruang lingkup.
empty()
, jika tidak ini akan memanggil UB yang ditakuti.
Vektor secara efektif adalah array di bawah kulit. Jika Anda memiliki fungsi:
void f( double a[]);
Anda bisa menyebutnya seperti ini:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Anda seharusnya tidak perlu mengubah vektor menjadi instance array aktual.
f( &v[0] );
untuk kalimat terakhir Anda
Seperti untuk std::vector<int> vec
, vec untuk mendapatkan int*
, Anda dapat menggunakan dua metode:
int * arr = & vec [0];
int * arr = vec.data ();
Jika Anda ingin mengkonversi semua jenis T
vektor untuk T* array
, hanya mengganti di atas int
untuk T
.
Saya akan menunjukkan kepada Anda mengapa dua di atas bekerja, untuk pengertian yang baik?
std::vector
adalah array dinamis pada dasarnya.
Anggota data utama seperti di bawah ini:
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){}
//......
}
The range (start_, end_of_storage_)
adalah semua memori array yang vektor mengalokasikan;
Ini range(start_, finish_)
semua memori array yang digunakan vektor;
Ini range(finish_, end_of_storage_)
adalah memori array cadangan.
Misalnya, untuk vec vektor. yang memiliki {9, 9, 1, 2, 3, 4} adalah pointer mungkin seperti di bawah ini.
Jadi &vec[0]
= start_ (alamat.) (Start_ sama dengan int * array head)
Di c++11
dalam data()
fungsi anggota hanya kembali start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Kita dapat melakukan ini menggunakan metode data (). C ++ 11 menyediakan metode ini.
#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;
}
Jika Anda memiliki fungsi, maka Anda mungkin perlu ini: foo(&array[0], array.size());
. Jika Anda berhasil masuk ke situasi di mana Anda memerlukan array maka Anda perlu refactor, vektor pada dasarnya adalah array diperpanjang, Anda harus selalu menggunakannya.
Anda dapat melakukan beberapa hal seperti ini
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;
}
}
}