ホームに戻る
出典 :
関連 :
目次 :
ベクトル(動的配列・可変長配列)とは
必要に応じてサイズを増やすことができる配列のこと。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}};
要素の参照・更新
- at() ・添字演算子([]) : 指定した位置の要素 への参照 を取得 (VC++では [] が使用できない?要調査)
std::vector<int> sampleVec{3, 1, 4, 1, 5, 9, 2, 6, 5, 3};
for (int i = 0; i < 10; ++i)
{
std::cout << sampleVec.at(i); //< sampleVec の i 番目の要素を表示
sampleVec.at(i) = i; //< at() は要素への参照を返すため、代入も可能
}
- front() : 先頭要素 への参照 を取得
- back() : 末尾要素 への参照 を取得
- data() : 先頭要素 へのポインタ を取得
ベクトルは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() : データを末尾に追加 (テンポラリコピーを生成)
- emplace_back() : データを末尾に追加 (テンポラリコピーを生成しない)
- insert() : 指定した位置にデータを挿入 ( 引数は添字ではなくイテレータである点に注意 )
ベクトルで保持するオブジェクトがクラスの場合、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} となる
要素の削除
- pop_back() : 末尾の要素を削除
- elase() : 指定した要素を削除 ( 引数は添字ではなくイテレータである点に注意 )
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)を削除
ベクトルの状態を取得
- empty() : ベクトルが空なら true 、そうでなければ false を返す
- size() : 要素数を返す