1. ホーム
  2. c++

[解決済み】C++でベクトルを初期化する方法【重複あり

2022-04-20 15:59:25

質問

<余談
この質問には、すでにここで回答があります :
クローズド 2年前 .

配列の場合と同じように、ベクトルも初期化したい。

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

でも、こうやってやると

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

オア

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

と表示され、エラーになります。

'{' トークンの前に一次式があることが期待されます。

AND

error: '=' トークンの前に ',' または ';' が必要です。

をそれぞれ作成しました。

解決方法は?

新しい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));