std::vector<double>
をdouble array[]
に変換するにはどうすればいいですか?
仕様は現在 保証 ベクトルがそれらの要素を連続して格納することを保証するので、そうするためにはかなり簡単なトリックがあります:
std::vector<double> v;
double* a = &v[0];
何のために?明確にする必要があります:あなたは、配列の最初の要素へのポインタ、または配列が必要ですか?
前者を必要とするAPI関数を呼び出している場合は、do_something(&v[0], v.size())
を実行できます。ここで、v
はdouble
sのベクトルです。ベクトルの要素は連続しています。
それ以外の場合は、各要素をコピーするだけです。
double arr[100];
std::copy(v.begin(), v.end(), arr);
arr
が十分な大きさであるだけでなく、arr
がいっぱいになるか、または初期化されていない値があることを確認してください。
C++ 11 では、 vector.data()
がうまくいきます。
vector<double> thevector;
//...
double *thearray = &thevector[0];
これは標準によって動作することが保証されていますが、いくつかの注意点があります。特にthearray
が有効範囲にある間はthevector
のみを使用するように注意してください。
ベクトルは事実上、皮膚の下の配列です。あなたが機能を持っているならば:
void f( double a[]);
あなたはこのようにそれを呼ぶことができます:
vector <double> v;
v.Push_back( 1.23 )
f( &v[0] );
ベクトルを実際の配列インスタンスに変換する必要はありません。
std::vector<int> vec
、vecからint*
を取得するには、2つの方法があります。
int * arr =&vec [0];
int * arr = vec.data();
型T
をT* array
に変換したい場合は、上記のint
をT
に置き換えてください。
私は、上の2つがなぜよく理解するために働くのかをあなたに示すつもりですか?
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_)
はベクタが使用するすべての配列メモリです。
range(finish_, end_of_storage_)
はバックアップアレイメモリです。
例えば、ベクトルvecに関して。 {9、9、1、2、3、4}を持つポインタは以下のようになります。
だから&vec[0]
= start_(address。)(start_はint * array headと等価です)
c++11
では、data()
メンバー関数は単にstart_を返します。
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
あなたが関数を持っているなら、あなたはおそらくこれが必要です:foo(&array[0], array.size());
。あなたが配列を必要とする状況に入ることに成功したなら、あなたはリファクタリングする必要があります、ベクトルは基本的に拡張された配列です、あなたはいつもそれらを使うべきです。
std::vector<double> vec;
double* arr = vec.data();
これは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;
}