Namespaces
Variants

std:: vector

From cppreference.net
ヘッダーで定義 <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 polymorphic allocator を使用するエイリアステンプレートです。

std::vector<bool> の部分特殊化を除いて、要素は連続して格納されています。これは、イテレータを通じてだけでなく、通常の要素ポインタへのオフセットを使用して要素にアクセスできることを意味します。つまり、ベクターの要素へのポインタは、配列の要素へのポインタを期待する任意の関数に渡すことができます。

ベクターのストレージは自動的に管理され、必要に応じて拡張されます。ベクターは通常、静的配列よりも多くの領域を占有します。これは将来の拡張に対応するためにより多くのメモリが割り当てられるためです。この方式により、要素が挿入されるたびに再割り当てを行う必要がなく、追加メモリが枯渇した時点でのみ再割り当てが発生します。割り当て済みメモリの総量は capacity() 関数を使用して問い合わせることができます。余分なメモリは shrink_to_fit() [1] の呼び出しによってシステムに返還できます。

再割り当ては通常、パフォーマンスの観点でコストの高い操作です。 reserve() 関数は、要素数が事前に分かっている場合に再割り当てを排除するために使用できます。

ベクトルに対する一般的な操作の計算量(効率)は以下の通りです:

  • ランダムアクセス - 定数時間 𝓞(1)
  • 末尾への要素の挿入または削除 - 償却定数時間 𝓞(1)
  • 要素の挿入または削除 - ベクターの末尾からの距離に対して線形時間 𝓞(n)

std::vector T bool 以外の場合)は、 Container AllocatorAwareContainer (C++11以降) SequenceContainer ContiguousContainer (C++17以降) および ReversibleContainer の要件を満たします。

std::vectorのすべてのメンバー関数は 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 の要件を満たさなければならない。 動作は未定義 (C++20まで) プログラムは不適格 (C++20から) Allocator::value_type T と同じでない場合)。

特殊化

標準ライブラリは、 std::vector bool 型に対する特殊化を提供しており、これはメモリ効率のために最適化されている可能性があります。

省メモリな動的ビットセット
(クラステンプレートの特殊化)

イテレータの無効化

操作 無効化されるもの
すべての読み取り専用操作 無効化されない
swap , std::swap end()
clear , operator= , assign 常に無効化される
reserve , shrink_to_fit ベクターの容量が変更された場合、すべての要素が無効化される。変更されなかった場合は無効化されない
erase 削除された要素とそれ以降のすべての要素( end() を含む)
push_back , emplace_back ベクターの容量が変更された場合、すべての要素が無効化される。変更されなかった場合は end() のみ無効化される
insert , emplace ベクターの容量が変更された場合、すべての要素が無効化される
変更されなかった場合は、挿入ポイント以降の要素のみ( end() を含む)が無効化される
resize ベクターの容量が変更された場合、すべての要素が無効化される。変更されなかった場合は 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

LegacyRandomAccessIterator かつ LegacyContiguousIterator value_type を指すもの

(C++20以前)

LegacyRandomAccessIterator contiguous_iterator 、かつ ConstexprIterator value_type を指すもの

(C++20以降)
const_iterator

LegacyRandomAccessIterator かつ LegacyContiguousIterator const value_type を指すもの

(C++20以前)

LegacyRandomAccessIterator contiguous_iterator 、かつ ConstexprIterator const value_type を指すもの

(C++20以降)
reverse_iterator std:: reverse_iterator < iterator >
const_reverse_iterator std:: reverse_iterator < const_iterator >

メンバー関数

vector を構築する
(公開メンバ関数)
vector を破棄する
(公開メンバ関数)
コンテナに値を代入する
(公開メンバ関数)
コンテナに値を割り当てる
(公開メンバ関数)
コンテナに値の範囲を割り当てる
(公開メンバ関数)
関連付けられたアロケータを返す
(公開メンバ関数)
要素アクセス
境界チェック付きで指定された要素にアクセス
(公開メンバ関数)
指定された要素にアクセス
(公開メンバ関数)
最初の要素にアクセスする
(公開メンバ関数)
最後の要素にアクセスする
(公開メンバ関数)
基となる連続ストレージへの直接アクセス
(公開メンバー関数)
イテレータ
先頭を指すイテレータを返す
(公開メンバ関数)
(C++11)
終端へのイテレータを返す
(公開メンバ関数)
先頭への逆イテレータを返す
(公開メンバ関数)
(C++11)
末尾を指す逆イテレータを返す
(公開メンバ関数)
容量
コンテナが空かどうかをチェックする
(public member function)
要素数を返す
(公開メンバ関数)
要素の最大可能数を返す
(public member function)
ストレージを予約する
(公開メンバ関数)
現在割り当てられているストレージに保持可能な要素数を返す
(公開メンバ関数)
未使用のメモリを解放してメモリ使用量を削減する
(public member function)
修飾子
内容をクリアする
(公開メンバ関数)
要素を挿入する
(公開メンバ関数)
要素の範囲を挿入する
(公開メンバ関数)
(C++11)
要素をその場で構築する
(公開メンバ関数)
要素を削除する
(公開メンバ関数)
末尾に要素を追加する
(公開メンバ関数)
要素をその場で末尾に構築する
(公開メンバ関数)
末尾に要素の範囲を追加する
(公開メンバ関数)
最後の要素を削除する
(公開メンバ関数)
格納されている要素数を変更する
(公開メンバ関数)
内容を交換する
(公開メンバ関数)

非メンバー関数

(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) コンテナのためのレンジ構築と挿入
__cpp_lib_ranges_reserve_hint 202502L (C++26) ranges::approximately_sized_range , ranges::reserve_hint および std::vector への変更

#include <iostream>
#include <vector>
int main()
{
    // 整数を含むvectorを作成
    std::vector<int> v = {8, 4, 5, 9};
    // vectorにさらに2つの整数を追加
    v.push_back(6);
    v.push_back(9);
    // 位置2の要素を上書き
    v[2] = -1;
    // 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)
固定サイズのインプレース連続配列
(クラステンプレート)
両端キュー
(クラステンプレート)