web-dev-qa-db-ja.com

C++でベクトルを初期化する方法

可能な重複:
C++:ハードコードされた要素を使ってSTLベクトルを初期化する最も簡単な方法

配列の場合のようにベクトルを初期化したいのです。

int vv[2] = {12, 43};

しかし、私がこうすると、

vector<int> v(2) = {34, 23};

OR

vector<int> v(2);
v = {0, 9};

それはエラーを与えます:

「{」トークンの前にある主表現

そして

エラー:「=」トークンの前に「、」または「;」が必要です

それぞれ。

187
Md Faisal

新しいC++標準(コンパイラで有効にするために特別なフラグを必要とするかもしれません)であなたは単にすることができます:

std::vector<int> v { 34,23 };
// or
// std::vector<int> v = { 34,23 };

あるいは:

std::vector<int> v(2);
v = { 34,23 };

この機能をサポートしていないコンパイラ(初期化子リスト)では、これを配列でエミュレートすることができます。

int vv[2] = { 12,43 };
std::vector<int> v(&vv[0], &vv[0]+2);

または、既存のベクトルへの代入の場合:

int vv[2] = { 12,43 };
v.assign(&vv[0], &vv[0]+2);

James Kanzeが示唆したように、配列の始まりと終わりを与える関数を持つほうがより堅牢です。

template <typename T, size_t N>
T* begin(T(&arr)[N]) { return &arr[0]; }
template <typename T, size_t N>
T* end(T(&arr)[N]) { return &arr[0]+N; }

そして、サイズを何度も繰り返すことなくこれを行うことができます。

int vv[] = { 12,43 };
std::vector<int> v(begin(vv), end(vv));
256

次のようにすることもできます。

template <typename T>
class make_vector {
public:
  typedef make_vector<T> my_type;
  my_type& operator<< (const T& val) {
    data_.Push_back(val);
    return *this;
  }
  operator std::vector<T>() const {
    return data_;
  }
private:
  std::vector<T> data_;
};

そしてこれを次のように使います。

std::vector<int> v = make_vector<int>() << 1 << 2 << 3;
28
Viktor Sehr