ホームに戻る
出典 :
C++ 動的配列クラス
関連 :
コンテナ イテレータ
目次 :

ベクトル(動的配列・可変長配列)とは

必要に応じてサイズを増やすことができる配列のこと。STLに定義されるコンテナクラスの一つ。
他のコンテナと比較して構造が単純であり、高速でメモリ効率が良い。

必要なヘッダ

#include <vector>

宣言・初期化

std::vector<int> v1; //< 空のベクトルを宣言 std::vector<int> v2(123); //< 要素数 123 のベクトルを宣言 std::vector<int> v3(10, 5); //< 要素数 10 の全要素を 5 で初期化 std::vector<int> v4 = {6, 8, 5}; //< データ列を指定して初期化 std::vector<int> v4{6, 8, 5}; //< 上記の = は省略できる int org_data[] = {7, 4, 3, 1}; std::vector<int> v5(org_data, std::end(org_data)); //< 既存の配列を基に初期化 std::vector<int> v6 = {2, 9, 6, 4}; std::vector<int> v7(v6); //< 既存のベクトルを用いて初期化(コピー)

多次元配列(入れ子)

ベクトルの要素をベクトルとすることで、多次元配列を構成できる。
std::vector<std::vector<int>> vv{{1, 2, 3}, {4, 5, 6, 7}};

要素の参照・更新

ベクトルはC互換の固定長配列と同様、データが連続したアドレスに配置される。このため data() に対するポインタ演算によって全要素を走査できる。

イテレータ

イテレータを参照。

代入

同じ型のベクトル同士であれば、= 演算子による代入が可能。
vector<int> a{1, 2, 3, 4}; vector<int> b{9, 8}; b = a; //< a の内容を b に代入(以前のbの内容は破棄される) vector<int> c, d; d = c = b; //< 連続代入も可能

要素の追加

ベクトルで保持するオブジェクトがクラスの場合、push_back() コール時にオブジェクト(テンポラリコピー)が生成され、さらに push_back() 内でコピーコンストラクタに渡されて生成されたオブジェクトがベクトルに追加され、テンポラリコピーが破棄される。
テンポラリコピーは本来不要であり、コピーコンストラクタおよびデストラクタの処理が重いクラスの場合は、無駄にパフォーマンスを低下させる恐れがある。
C++11 で追加された emplace_back() は、テンポラリコピーを生成しないため、コピーコンストラクタ、デストラクタが呼ばれることは無い。
insert() は第1引数にイテレータを取るbegin() + 添字 で添字位置要素へのイテレータを取得できる。
std::vector<int> v; //< 空の動的配列を生成 v.push_back(123); //< 末尾に 123 を追加
class Hoge { public: Hoge(std::string&, int); //< コンストラクタ ..... }; ..... std::vector<Hoge> v; v.emplace_back("abc", 123); //< emplace_back(Hoge("abc", 123)) と同意
std::vector<int> v(10, 3); //< 要素数 10 、値はすべて 3 v.insert(v.begin() + 4, 7); //< [4] の位置( begin() + 4 )に 7 を挿入 // 結果は {3, 3, 3, 3, 7, 3, 3, 3, 3, 3, 3} となる

要素の削除

elase() は insert() 同様、第1引数にイテレータを取る。
std::vector<int> v{3, 1, 4, 1, 5}; v.pop_back(); //< 末尾データ(この場合は 5)を削除
std::vector<int> v{3, 1, 9, 4}; v.erase(v.begin() + 2); //< [2]の位置(9)を削除

ベクトルの状態を取得