web-dev-qa-db-ja.com

ベクトルを配列に変換する方法

std::vector<double>double array[]に変換するにはどうすればいいですか?

306
ganuke

仕様は現在 保証 ベクトルがそれらの要素を連続して格納することを保証するので、そうするためにはかなり簡単なトリックがあります:

std::vector<double> v;
double* a = &v[0];
485
Michael Mrozek

何のために?明確にする必要があります:あなたは、配列の最初の要素へのポインタ、または配列が必要ですか?

前者を必要とするAPI関数を呼び出している場合は、do_something(&v[0], v.size())を実行できます。ここで、vdoublesのベクトルです。ベクトルの要素は連続しています。

それ以外の場合は、各要素をコピーするだけです。

double arr[100];
std::copy(v.begin(), v.end(), arr);

arrが十分な大きさであるだけでなく、arrがいっぱいになるか、または初期化されていない値があることを確認してください。

134
GManNickG

C++ 11 では、 vector.data() がうまくいきます。

69
gzbwb
vector<double> thevector;
//...
double *thearray = &thevector[0];

これは標準によって動作することが保証されていますが、いくつかの注意点があります。特にthearrayが有効範囲にある間はthevectorのみを使用するように注意してください。

16
user168715

ベクトルは事実上、皮膚の下の配列です。あなたが機能を持っているならば:

void f( double a[]);

あなたはこのようにそれを呼ぶことができます:

vector <double> v;
v.Push_back( 1.23 )
f( &v[0] );

ベクトルを実際の配列インスタンスに変換する必要はありません。

13
anon

std::vector<int> vec、vecからint*を取得するには、2つの方法があります。

  1. int * arr =&vec [0];

  2. int * arr = vec.data();

TT* arrayに変換したい場合は、上記のintTに置き換えてください。

私は、上の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}を持つポインタは以下のようになります。

enter image description here

だから&vec[0] = start_(address。)(start_はint * array headと等価です)

c++11では、data()メンバー関数は単にstart_を返します。

pointer data()
{ 
     return start_; //(equivalent to `value_type*`, array head)
}
2
Jayhello

あなたが関数を持っているなら、あなたはおそらくこれが必要です:foo(&array[0], array.size());。あなたが配列を必要とする状況に入ることに成功したなら、あなたはリファクタリングする必要があります、ベクトルは基本的に拡張された配列です、あなたはいつもそれらを使うべきです。

1
user6244076
std::vector<double> vec;
double* arr = vec.data();
1
Toby

これは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;
}
1
rashedcs