Cum pot converti un std::vectoro
double matrice[]`?
Pentru ce? Aveți nevoie pentru a clarifica: ai nevoie de un pointer la primul element al unei matrice, sau un tablou?
Daca're de asteptare o funcție API că se așteaptă ca fostul, puteți face do_something(&v[0], v. size())
, unde v este un vector de dublu. Elementele unui vector sunt învecinate.
În caz contrar, trebuie doar să copiați fiecare element:
double arr[100];
std::copy(v.begin(), v.end(), arr);
Se asigura nu numai thar arr
este destul de mare, dar care arr
se umple, sau ai neinitializata valori.
Pentru C++11, vector.date()
va face truc.
vector<double> thevector;
//...
double *thearray = &thevector[0];
Acest lucru este garantat de a lucra de standard, cu toate acestea, există unele limitări: în special grijă să folosiți numai `thearray in timp ce vectorul este în domeniul de aplicare.
Vectori în mod eficient sunt tablouri sub piele. Dacă aveți o funcție:
void f( double a[]);
puteți să-l numesc astfel:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
Tu nu ar trebui să vreodată nevoie pentru a converti un vector într-un real matrice exemplu.
Ca să std::vector<int> vec
, vec să te int*
, puteți utiliza două metode:
int* arr = &vec[0];
int* arr = vec.date();
Dacă doriți pentru a converti orice tip " T " vectorT* matrice
, doar înlocuiți de mai sus int
la "T".
Eu vă va arăta de ce nu cele de mai sus două lucrări, pentru buna înțelegere?
`std::vector este o gamă dinamică în esență.
Principalele date membru ca mai jos:
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){}
//......
}
A range (start_, end_of_storage_)
este tot matrice de memorie vectorul aloca;
A range(start_, finish_)
este tot matrice de memorie vectorul folosit;
A range(finish_, end_of_storage_)
este backup matrice de memorie.
De exemplu, pentru un vector
Deci &vec[0]
= start (adresa.) (start este echivalent cu int* matrice cap)
În c++11 " la " date()` funcția de membru doar a reveni start_
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
Putem face acest lucru folosind date() metodă. C++11 oferă această metodă.
#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;
}
Dacă aveți o funcție, atunci probabil ai nevoie de asta:foo(&matrice[0], matrice.size());
. Dacă ați reușit să obțineți într-o situație în care ai nevoie de o matrice, atunci ai nevoie pentru a refactor, vectori sunt practic extins tablouri, tu ar trebui să întotdeauna să le utilizeze.
Puteți face ceva de ce astfel de prognoze
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;
}
}
}