std::vector
| ヘッダー <vector> で定義 |
||
| template< class T, |
(1) | |
| namespace pmr { template< class T > |
(2) | (C++17以降) |
std::vectorは、動的サイズの配列をカプセル化するシーケンスコンテナである。要素は連続して格納される。つまり、要素にはイテレータを通じてだけでなく、要素への通常のポインタにオフセットを加えることでもアクセスできる。これは、vectorの要素へのポインタが、配列の要素へのポインタを期待する任意の関数に渡せることを意味する。
vectorのストレージは自動的に管理され、必要に応じて拡張される。vectorは通常、静的配列よりも多くの領域を占有する。これは、将来の増加に対応するために余分なメモリが確保されるためである。これにより、vectorは要素が挿入されるたびに再確保する必要はなく、追加のメモリが使い果たされたときにのみ再確保すればよい。確保されたメモリの総量はcapacity()関数で問い合わせることができる。余分なメモリはshrink_to_fit()[1]の呼び出しによってシステムに返却できる。
再確保は通常、パフォーマンスの観点からコストの高い操作である。reserve()関数を使用すれば、要素の数が事前にわかっている場合に再確保をなくすことができる。
vectorでの一般的な操作の計算量(効率)は以下の通りである。
- ランダムアクセス - 定数 𝓞(1)。
- 末尾への要素の挿入または削除 - 償却定数 𝓞(1)。
- 要素の挿入または削除 - vectorの末尾までの距離に対して線形 𝓞(n)。
std::vector (bool以外のTの場合) は、コンテナ (Container)、アロケータ認識コンテナ (AllocatorAwareContainer)(C++11以降)、シーケンスコンテナ (SequenceContainer)、連続コンテナ (ContiguousContainer)(C++17以降)、そしてリバーシブルコンテナ (ReversibleContainer)の要件を満たす。
|
|
(C++20以降) |
目次 |
[編集] テンプレートパラメータ
| T | - | 要素の型。
| ||||||||||||||
| アロケータ | - | メモリの確保/解放、およびそのメモリ内の要素の構築/破棄に使用されるアロケータ。この型は アロケータ(Allocator) の要件を満たさなければならない。Allocator::value_type が T と同じでない場合、その振る舞いは未定義である(C++20まで)プログラムは不適格となる(C++20から)。 |
[編集] 特殊化
標準ライブラリは、型boolに対するstd::vectorの特殊化を提供する。これは空間効率のために最適化されている場合がある。
| 空間効率の良い動的ビットセット (class template specialization) |
[編集] イテレータの無効化
| 操作 | 無効になる条件 |
|---|---|
| すべての読み取り専用操作 | なし。 |
| swap, std::swap | end() |
| clear, operator=, assign | すべて。 |
| reserve, shrink_to_fit | vectorのcapacityが変更された場合はすべて。そうでなければ、なし。 |
| erase | 削除された要素とそれ以降のすべての要素(end()を含む)。 |
| push_back, emplace_back | vectorのcapacityが変更された場合はすべて。そうでなければ、end()のみ。 |
| insert, emplace | vectorのcapacityが変更された場合はすべて。 そうでなければ、挿入地点かそれ以降のイテレータのみ(end()を含む)。 |
| resize | vectorのcapacityが変更された場合はすべて。そうでなければ、end()と削除された要素のみ。 |
| pop_back | 削除された要素とend()。 |
[編集] メンバ型
| メンバ型 | 定義 | ||||
value_type
|
T | ||||
allocator_type
|
Allocator | ||||
size_type
|
符号なし整数型 (通常は std::size_t) | ||||
difference_type
|
符号付き整数型 (通常は std::ptrdiff_t) | ||||
reference
|
value_type& | ||||
const_reference
|
const value_type& | ||||
pointer
|
| ||||
const_pointer
|
| ||||
iterator
|
| ||||
const_iterator
|
| ||||
reverse_iterator
|
std::reverse_iterator<iterator> | ||||
const_reverse_iterator
|
std::reverse_iterator<const_iterator> |
[編集] メンバ関数
vectorを構築する(公開メンバ関数) | |
vectorを破棄する(公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| コンテナに値を代入する (公開メンバ関数) | |
| (C++23) |
コンテナに値の範囲を代入する (公開メンバ関数) |
| 関連付けられたアロケータを返す (公開メンバ関数) | |
要素アクセス | |
| 境界チェック付きで指定された要素にアクセスする (public メンバ関数) | |
| 指定された要素にアクセスする (public メンバ関数) | |
| 最初の要素にアクセスする (public メンバ関数) | |
| 最後の要素にアクセスする (public メンバ関数) | |
| 基底となる連続ストレージに直接アクセスする (public メンバ関数) | |
イテレータ | |
| (C++11) |
先頭へのイテレータを返す (public メンバ関数) |
| (C++11) |
末尾へのイテレータを返す (public メンバ関数) |
| (C++11) |
先頭への逆イテレータを返す (public メンバ関数) |
| (C++11) |
末尾への逆イテレータを返す (public メンバ関数) |
容量 | |
| コンテナが空かどうかをチェックする (public メンバ関数) | |
| 要素数を返す (public メンバ関数) | |
| 可能な最大要素数を返す (public メンバ関数) | |
| ストレージを予約する (public member function) | |
| 現在確保されているストレージに保持できる要素数を返す (public member function) | |
| (DR*) |
未使用のメモリを解放してメモリ使用量を削減する (公開メンバ関数) |
変更 | |
| 内容をクリアする (公開メンバ関数) | |
| 要素を挿入する (公開メンバ関数) | |
| (C++23) |
要素の範囲を挿入する (公開メンバ関数) |
| (C++11) |
要素を直接構築する (公開メンバ関数) |
| 要素を削除する (公開メンバ関数) | |
| 末尾に要素を追加する (公開メンバ関数) | |
| (C++11) |
末尾に要素を直接構築する (公開メンバ関数) |
| (C++23) |
末尾に要素の範囲を追加する (公開メンバ関数) |
| 最後の要素を削除する (公開メンバ関数) | |
| 格納されている要素の数を変更する (公開メンバ関数) | |
| 内容を交換する (public メンバ関数) | |
[編集] 非メンバ関数
| (C++20で削除)(C++20で削除)(C++20で削除)(C++20で削除)(C++20で削除)(C++20) |
2つのvectorの値を辞書式順序で比較する(関数テンプレート) |
| std::swap アルゴリズムを特殊化する (関数テンプレート) | |
| 特定の基準を満たすすべての要素を削除する (関数テンプレート) |
推論補助 |
(C++17以降) |
[編集] ノート
| 機能テストマクロ | 値 | 規格 | 機能 |
|---|---|---|---|
__cpp_lib_containers_ranges |
202202L |
(C++23) | コンテナのRangeコンストラクタとRange挿入 |
[編集] 例
#include <iostream> #include <vector> int main() { // Create a vector containing integers std::vector<int> v = {8, 4, 5, 9}; // Add two more integers to vector v.push_back(6); v.push_back(9); // Overwrite element at position 2 v[2] = -1; // Print out the vector for (int n : v) std::cout << n << ' '; std::cout << '\n'; }
出力
8 4 -1 9 6 9
[編集] 欠陥報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 69 | C++98 | vectorの要素のためのストレージの連続性は要求されていなかった |
必要 |
| LWG 230 | C++98 | T は コピー構築可能(CopyConstructible) である必要はなかった(型 T の要素が構築できない可能性がある) |
T は以下も要求されるCopyConstructible であること |
| LWG 464 | C++98 | 空のvectorの基底ストレージへのアクセスは未定義動作を引き起こした |
data関数が提供された |
[編集] 関連項目
| (C++26) |
リサイズ可能、固定容量、インプレースの連続配列 (クラステンプレート) |
| (C++11) |
固定サイズのインプレースな連続配列 (クラステンプレート) |
| 両端キュー (クラステンプレート) |