名前空間
変種
操作

std::vector

From cppreference.com
< cpp‎ | container
 
 
 
 
ヘッダー <vector> で定義
template<

    class T,
    class Allocator = std::allocator<T>

> class vector;
(1)
namespace pmr {

    template< class T >
    using vector = std::vector<T, std::pmr::polymorphic_allocator<T>>;

}
(2) (C++17以降)
1) std::vectorは、動的サイズの配列をカプセル化するシーケンスコンテナである。
2) std::pmr::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)の要件を満たす。

std::vectorのすべてのメンバ関数はconstexprである:定数式の評価中にstd::vectorオブジェクトを作成して使用することが可能である。

しかし、std::vectorオブジェクトは一般的にconstexprにはなれない。なぜなら、動的に確保されたストレージは、同じ定数式の評価中に解放されなければならないからである。

(C++20以降)
  1. libstdc++では、shrink_to_fit()はC++98モードでは利用できない

目次

[編集] テンプレートパラメータ

T - 要素の型。
Tコピー代入可能 (CopyAssignable)およびコピー構築可能 (CopyConstructible)の要件を満たさなければならない。 (C++11まで)
要素に課される要件は、コンテナに対して実行される実際の操作に依存する。一般的に、要素型は完全な型であり、削除可能(Erasable) の要件を満たすことが要求されるが、多くのメンバ関数はより厳しい要件を課す。 (C++11以降)
(C++17まで)

要素に課せられる要件は、コンテナに対して実行される実際の操作に依存する。一般的に、要素型は Erasable (削除可能) の要件を満たすことが要求されるが、多くのメンバ関数はより厳しい要件を課す。アロケータがアロケータ完全性要件を満たしていれば、このコンテナ(ただしそのメンバではない)は不完全な要素型でインスタンス化できる。

機能テストマクロ 規格 機能
__cpp_lib_incomplete_container_elements 201505L (C++17) 不完全な型の最小限のサポート
(C++17以降)

[編集]

アロケータ - メモリの確保/解放、およびそのメモリ内の要素の構築/破棄に使用されるアロケータ。この型は アロケータ(Allocator) の要件を満たさなければならない。Allocator::value_typeT と同じでない場合、その振る舞いは未定義である(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

Allocator::pointer

(C++11まで)

std::allocator_traits<Allocator>::pointer

(C++11以降)
[編集]
const_pointer

Allocator::const_pointer

(C++11まで)

std::allocator_traits<Allocator>::const_pointer

(C++11以降)
[編集]
iterator

value_type への LegacyRandomAccessIterator および LegacyContiguousIterator

(C++20まで)

value_type への LegacyRandomAccessIterator, contiguous_iterator, および ConstexprIterator

(C++20以降)
[編集]
const_iterator

const value_type への LegacyRandomAccessIterator および LegacyContiguousIterator

(C++20まで)

const value_type への LegacyRandomAccessIterator, contiguous_iterator, および ConstexprIterator

(C++20以降)
[編集]
reverse_iterator std::reverse_iterator<iterator>[編集]
const_reverse_iterator std::reverse_iterator<const_iterator>[編集]

[編集] メンバ関数

vectorを構築する
(公開メンバ関数) [編集]
vectorを破棄する
(公開メンバ関数) [編集]
コンテナに値を代入する
(公開メンバ関数) [編集]
コンテナに値を代入する
(公開メンバ関数) [編集]
コンテナに値の範囲を代入する
(公開メンバ関数) [編集]
関連付けられたアロケータを返す
(公開メンバ関数) [編集]
要素アクセス
境界チェック付きで指定された要素にアクセスする
(public メンバ関数) [編集]
指定された要素にアクセスする
(public メンバ関数) [編集]
最初の要素にアクセスする
(public メンバ関数) [編集]
最後の要素にアクセスする
(public メンバ関数) [編集]
基底となる連続ストレージに直接アクセスする
(public メンバ関数) [編集]
イテレータ
先頭へのイテレータを返す
(public メンバ関数) [編集]
(C++11)
末尾へのイテレータを返す
(public メンバ関数) [編集]
先頭への逆イテレータを返す
(public メンバ関数) [編集]
(C++11)
末尾への逆イテレータを返す
(public メンバ関数) [編集]
容量
コンテナが空かどうかをチェックする
(public メンバ関数) [編集]
要素数を返す
(public メンバ関数) [編集]
可能な最大要素数を返す
(public メンバ関数) [編集]
ストレージを予約する
(public member function) [編集]
現在確保されているストレージに保持できる要素数を返す
(public member function) [編集]
未使用のメモリを解放してメモリ使用量を削減する
(公開メンバ関数) [編集]
変更
内容をクリアする
(公開メンバ関数) [編集]
要素を挿入する
(公開メンバ関数) [編集]
要素の範囲を挿入する
(公開メンバ関数) [編集]
(C++11)
要素を直接構築する
(公開メンバ関数) [編集]
要素を削除する
(公開メンバ関数) [編集]
末尾に要素を追加する
(公開メンバ関数) [編集]
末尾に要素を直接構築する
(公開メンバ関数) [編集]
末尾に要素の範囲を追加する
(公開メンバ関数) [編集]
最後の要素を削除する
(公開メンバ関数) [編集]
格納されている要素の数を変更する
(公開メンバ関数) [編集]
内容を交換する
(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++11)
固定サイズのインプレースな連続配列
(クラステンプレート) [編集]
両端キュー
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)