どのようにa std::vector<double>
をa に変換しdouble array[]
ますか?
どのようにa std::vector<double>
をa に変換しdouble array[]
ますか?
回答:
これを行うにはかなり簡単なトリックがあります。仕様では、ベクトルが要素を連続的に格納することが保証されているためです。
std::vector<double> v;
double* a = &v[0];
double*
。同じデータを指すが必要です。この答えはまさにその場合に
std::vector<double> v; double* a = v.data();
何のために?明確にする必要があります:配列の最初の要素または配列へのポインターが必要ですか?
前者を期待するAPI関数を呼び出す場合は、を実行できますdo_something(&v[0], v.size())
。ここv
で、はのベクトルですdouble
。ベクトルの要素は連続しています。
それ以外の場合は、各要素をコピーするだけです。
double arr[100];
std::copy(v.begin(), v.end(), arr);
thar arr
が十分に大きいだけでなく、arr
いっぱいになるか、初期化されていない値があることを確認してください。
size()
の機能をstd:vector
使用する必要がありますnew
またはmalloc
それを行うに。すでに指摘されているように、これはdouble arr[v.size()]
無効です。newの代わりにvectorを使用するのは良い考えですが、問題の核心は、どのようにしてvectorを配列に変換できるかです。
vector<double> thevector;
//...
double *thearray = &thevector[0];
これは標準で動作することが保証されていますが、いくつかの警告があります。特に、が範囲内にあるthearray
ときにのみ使用するように注意してthevector
ください。
empty()
。そうでない場合、これは恐ろしいUBを呼び出します。
ベクトルは事実上、皮膚の下の配列です。関数がある場合:
void f( double a[]);
次のように呼び出すことができます:
vector <double> v;
v.push_back( 1.23 )
f( &v[0] );
ベクトルを実際の配列インスタンスに変換する必要はありません。
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 *配列の先頭と同じです)
ではメンバ関数だけSTART_を返しますc++11
data()
pointer data()
{
return start_; //(equivalent to `value_type*`, array head)
}
関数がある場合は、おそらくこれが必要ですfoo(&array[0], array.size());
。配列が必要な状況になった場合は、リファクタリングする必要があります。ベクトルは基本的に拡張配列なので、常に使用する必要があります。
このようなことができます
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;
}
}
}