vector クラス

C++ 標準ライブラリの vector クラスは、シーケンス コンテナーのクラス テンプレートです。 vector は、指定された型の要素を線形の配置に格納し、任意の要素に対する高速なランダム アクセスを可能にします。 vector は、ランダム アクセスのパフォーマンスを重視するシーケンスに適したコンテナーです。

構文

template <class Type, class Allocator = allocator<Type>>
class vector

パラメーター

Type
ベクターに格納される要素のデータ型。

Allocator
メモリのベクターの割り当てと解放に関する詳細をカプセル化する、格納されたアロケーター オブジェクトを表す型。 この引数は省略可能であり、既定値は allocator<Type> です。

解説

ベクターでは、シーケンスの末尾での挿入および削除に要する時間が一定です。 ベクターの途中での要素の挿入または削除には、線形時間を要します。 deque クラス コンテナーは、シーケンスの先頭と末尾での挿入および削除が高速になります。 list クラス コンテナーは、シーケンス内の任意の位置での挿入および削除が高速になります。

ベクターの再割り当てが発生するのは、メンバー関数がベクター オブジェクトに含まれるシーケンスを現在の記憶域容量を超えて増やす必要がある場合です。 その他の挿入や消去により、シーケンス内のさまざまな記憶域のアドレスが変わることがあります。 そのような場合は常に、シーケンスのうち変更された部分を指す反復子または参照が無効になります。 再割り当てが発生しない場合は、挿入/削除が行われた地点より前の反復子および参照のみ有効のままになります。

vector<bool> クラスは、bool 型の要素のためにクラス テンプレート vector を完全に特殊化したものです。 これは、特殊化で使用される基礎となる型のアロケーターを持ちます。

vector<bool> 参照クラスは、入れ子になったクラスで、このクラスのオブジェクトは vector<bool> オブジェクト内の要素 (単一ビット) への参照を提供できます。

メンバー

コンストラクター

名前 説明
vector 特定のサイズのベクター、特定の値の要素を持つベクター、特定の allocator を持つベクター、または他のベクターのコピーとして、ベクターを構築します。

Typedefs

名前 説明
[allocator_type](#allocator_type) vector オブジェクトの allocator クラスを表す型。
const_iterator ベクター内の const 要素を読み取ることができるランダム アクセス反復子を提供する型。
const_pointer ベクター内の const 要素へのポインターを提供する型。
const_reference ベクターに格納されている const 要素への参照を提供する型。 これは読み取りと const 操作の実行に使用されます。
const_reverse_iterator ベクター内の任意の const 要素を読み取ることができるランダム アクセス反復子を提供する型。
difference_type ベクターに含まれる 2 つの要素のアドレスの差を提供する型。
iterator ベクター内の任意の要素を読み取り、または変更できるランダム アクセス反復子を提供する型。
pointer ベクター内の要素へのポインターを提供する型。
reference ベクターに格納されている要素への参照を提供する型。
reverse_iterator 反転ベクター内の要素を読み取り、または変更できるランダム アクセス反復子を提供する型。
size_type ベクター内の要素の数をカウントする型。
value_type ベクター内に格納されているデータ型を表す型。

関数

名前 説明
assign ベクターを消去し、空のベクターに指定された要素をコピーします。
at ベクター内の指定位置にある要素への参照を返します。
back ベクターの最後の要素への参照を返します。
begin ベクター内の最初の要素を示すランダム アクセス反復子を返します。
capacity 追加の記憶域を割り当てずにベクターに収容できる要素の数を返します。
cbegin ベクター内の最初の要素を示すランダム アクセスの定数反復子を返します。
cend ベクターの末尾の次の位置を指し示すランダム アクセス定数反復子を返します。
crbegin 反転ベクター内の最初の要素への定数反復子を返します。
crend 反転ベクター内の末尾の要素への定数反復子を返します。
clear ベクターの要素を消去します。
data ベクター内の最初の要素へのポインターを返します。
emplace その場で構築した要素をベクター内の指定位置に挿入します。
emplace_back その場で構築した要素をベクターの末尾に追加します。
empty ベクター コンテナーが空かどうかをテストします。
end ベクターの末尾を指し示すランダム アクセス反復子を返します。
erase 指定した位置からベクター内の要素または要素範囲を削除します。
front ベクター内の最初の要素への参照を返します。
get_allocator ベクターが使用する allocator クラスにオブジェクトを返します。
insert ベクター内の指定位置に 1 つまたは複数の要素を挿入します。
max_size ベクターの最大長を返します。
pop_back ベクトルの末尾の要素を削除します。
push_back ベクターの末尾に要素を追加します。
rbegin 逆順のベクターの最初の要素への反復子を返します。
rend 反転ベクター内の末尾に反復子を返します。
reserve ベクター オブジェクトに最小の長さの記憶域を予約します。
resize ベクターの新しいサイズを指定します。
shrink_to_fit 余分なキャパシティを破棄します。
size ベクター内の要素の数を返します。
swap 2 つのベクターの要素を交換します。

演算子

名前 説明
operator[] 指定した位置における vector 要素への参照を返します。
operator= ベクターの要素を、別のベクターのコピーで置き換えます。

allocator_type

ベクター オブジェクトのアロケーター クラスを表す型。

typedef Allocator allocator_type;

解説

allocator_type は、テンプレート パラメーター Allocator のシノニムです。

allocator_type の使用例については、get_allocator の例をご覧ください。

assign

ベクターを消去し、空のベクターに指定された要素をコピーします。

void assign(size_type count, const Type& value);
void assign(initializer_list<Type> init_list);

template <class InputIterator>
void assign(InputIterator first, InputIterator last);

パラメーター

first
コピーする要素範囲内の最初の要素の位置。

last
コピーする要素範囲を超える最初の要素の位置。

count
ベクターに挿入される要素のコピーの数。

value
ベクターに挿入される要素の値。

init_list
挿入する要素を含む initializer_list。

解説

最初に、assign はベクター内の既存の要素を消去します。 次に、assign は元のベクター内の指定された範囲の要素をベクターに挿入するか、指定された値の新しい要素のコピーをベクターに挿入します。

/ vector_assign.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector<int> v1, v2, v3;

    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);

    cout << "v1 = ";
    for (auto& v : v1){
        cout << v << " ";
    }
    cout << endl;

    v2.assign(v1.begin(), v1.end());
    cout << "v2 = ";
    for (auto& v : v2){
        cout << v << " ";
    }
    cout << endl;

    v3.assign(7, 4);
    cout << "v3 = ";
    for (auto& v : v3){
        cout << v << " ";
    }
    cout << endl;

    v3.assign({ 5, 6, 7 });
    for (auto& v : v3){
        cout << v << " ";
    }
    cout << endl;
}

at

ベクター内の指定位置にある要素への参照を返します。

reference at(size_type position);

const_reference at(size_type position) const;

パラメーター

position
ベクター内で参照する要素を示す添字または位置の番号。

戻り値

引数に記述された要素への参照。 position がベクターのサイズより大きい場合、at は例外をスローします。

解説

at の戻り値が const_reference に割り当てられている場合、vector オブジェクトを変更することはできません。 at の戻り値が reference に割り当てられている場合、vector オブジェクトを変更できます。

// vector_at.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   const int &i = v1.at( 0 );
   int &j = v1.at( 1 );
   cout << "The first element is " << i << endl;
   cout << "The second element is " << j << endl;
}
The first element is 10
The second element is 20

back

ベクターの最後の要素への参照を返します。

reference back();

const_reference back() const;

戻り値

ベクターの最後の要素。 ベクターが空の場合、戻り値は未定義になります。

解説

back の戻り値が const_reference に割り当てられている場合、vector オブジェクトを変更することはできません。 back の戻り値が reference に割り当てられている場合、vector オブジェクトを変更できます。

_ITERATOR_DEBUG_LEVEL を 1 または 2 に定義して使用してコンパイルすると、空の vector 内の要素にアクセスしようとした場合に実行時エラーが発生します。 詳細については、「Checked Iterators」を参照してください。

// vector_back.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main() {
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 11 );

   int& i = v1.back( );
   const int& ii = v1.front( );

   cout << "The last integer of v1 is " << i << endl;
   i--;
   cout << "The next-to-last integer of v1 is "<< ii << endl;
}

begin

ベクター内の最初の要素を示すランダム アクセス反復子を返します。

const_iterator begin() const;

iterator begin();

戻り値

vector 内の最初の要素、または空の vector の次の位置を指すランダム アクセス反復子。 返される値は、常に vector::end と比較して有効なことを確認してください。

解説

begin の戻り値が vector::const_iterator に割り当てられる場合、vector オブジェクトを変更できません。 begin の戻り値が vector::iterator に割り当てられる場合、vector オブジェクトを変更できます。

// vector_begin.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector<int> c1;
    vector<int>::iterator c1_Iter;
    vector<int>::const_iterator c1_cIter;

    c1.push_back(1);
    c1.push_back(2);

    cout << "The vector c1 contains elements:";
    c1_Iter = c1.begin();
    for (; c1_Iter != c1.end(); c1_Iter++)
    {
        cout << " " << *c1_Iter;
    }
    cout << endl;

    cout << "The vector c1 now contains elements:";
    c1_Iter = c1.begin();
    *c1_Iter = 20;
    for (; c1_Iter != c1.end(); c1_Iter++)
    {
        cout << " " << *c1_Iter;
    }
    cout << endl;

    // The following line would be an error because iterator is const
    // *c1_cIter = 200;
}
The vector c1 contains elements: 1 2
The vector c1 now contains elements: 20 2

capacity

追加の記憶域を割り当てずにベクターに収容できる要素の数を返します。

size_type capacity() const;

戻り値

ベクターに割り当てられている記憶域の現在の長さ。

解説

増加分を収容できる十分なメモリが割り当てられている場合は、メンバー関数 resize のほうが効率的に動作します。 割り当てられるメモリの量を指定するには、メンバー関数 reserve を使用します。

// vector_capacity.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 1 );
   cout << "The length of storage allocated is "
        << v1.capacity( ) << "." << endl;

   v1.push_back( 2 );
   cout << "The length of storage allocated is now "
        << v1.capacity( ) << "." << endl;
}
The length of storage allocated is 1.
The length of storage allocated is now 2.

cbegin

範囲内の最初の要素を示す const 反復子を返します。

const_iterator cbegin() const;

戻り値

範囲の最初の要素、または空の範囲の末尾の次の位置 (空の範囲の場合、const) を指し示す cbegin() == cend() ランダム アクセス反復子。

解説

cbegin の戻り値で範囲内の要素を変更することはできません。

begin() メンバー関数の代わりにこのメンバー関数を使用して、戻り値が const_iterator になることを保証できます。 通常は、次の例に示すように auto 型推論キーワードと一緒に使用します。 例では、Containerconstbegin() をサポートする任意の種類の変更可能な (非 cbegin()) コンテナーであると見なします。

auto i1 = Container.begin();
// i1 is Container<T>::iterator
auto i2 = Container.cbegin();

// i2 is Container<T>::const_iterator

cend

ベクターの最後の要素の次の要素を指す、const 末尾超え反復子を返します。

const_iterator cend() const;

戻り値

ベクターの const 末尾超え反復子。 ベクターの最後の要素の次の要素を指します。 この要素はプレースホルダーであるため、逆参照しないでください。 比較にのみ使用してください。 ベクターが空の場合は、vector::cend() == vector::cbegin() です。

解説

cend は、反復子が範囲の末尾を超えたかどうかをテストするために使用されます。

end() メンバー関数の代わりにこのメンバー関数を使用して、戻り値が const_iterator になることを保証できます。 通常は、次の例に示すように auto 型推論キーワードと一緒に使用します。 例では、Containerconstend() をサポートする任意の種類の変更可能な (非 cend()) コンテナーであると見なします。

auto i1 = Container.end();
// i1 is Container<T>::iterator
auto i2 = Container.cend();

// i2 is Container<T>::const_iterator

cend によって返された値は逆参照しないでください。 比較にのみ使用してください。

clear

ベクターの要素を消去します。

void clear();

// vector_clear.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );

   cout << "The size of v1 is " << v1.size( ) << endl;
   v1.clear( );
   cout << "The size of v1 after clearing is " << v1.size( ) << endl;
}
The size of v1 is 3
The size of v1 after clearing is 0

const_iterator

ベクター内の const 要素を読み取ることができるランダム アクセス反復子を提供する型。

typedef implementation-defined const_iterator;

解説

const_iterator 型で要素の値を変更することはできません。

const_iterator の使用例については、back の例をご覧ください。

const_pointer

ベクター内の const 要素へのポインターを提供する型。

typedef typename Allocator::const_pointer const_pointer;

解説

const_pointer 型で要素の値を変更することはできません。

ベクター要素にアクセスするために、より一般的に使用されるのは反復子です。

const_reference

ベクターに格納されている const 要素への参照を提供する型。 これは読み取りと const 操作の実行に使用されます。

typedef typename Allocator::const_reference const_reference;

解説

const_reference 型で要素の値を変更することはできません。

// vector_const_ref.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   const vector <int> v2 = v1;
   const int &i = v2.front( );
   const int &j = v2.back( );
   cout << "The first element is " << i << endl;
   cout << "The second element is " << j << endl;

   // The following line would cause an error as v2 is const
   // v2.push_back( 30 );
}
The first element is 10
The second element is 20

const_reverse_iterator

ベクター内の任意の const 要素を読み取ることができるランダム アクセス反復子を提供する型。

typedef std::reverse_iterator<const_iterator> const_reverse_iterator;

解説

const_reverse_iterator 型は要素の値を変更できず、逆の順序でベクターを反復処理するために使用します。

反復子を宣言して使用する方法の例については、rbegin をご覧ください。

crbegin

反転ベクター内の最初の要素への定数反復子を返します。

const_reverse_iterator crbegin() const;

戻り値

反転された vector の最初の要素を指すか、反転されていない vector の最後の要素だったものを指す、定数逆順ランダム アクセス反復子。

解説

戻り値が crbegin の場合、vector オブジェクトは変更できません。

// vector_crbegin.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator v1_Iter;
   vector <int>::const_reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   v1_Iter = v1.begin( );
   cout << "The first element of vector is "
        << *v1_Iter << "." << endl;

   v1_rIter = v1.crbegin( );
   cout << "The first element of the reversed vector is "
        << *v1_rIter << "." << endl;
}
The first element of vector is 1.
The first element of the reversed vector is 2.

crend

反転されたベクターの最後の要素の次の要素を指す、const 逆順の末尾超え反復子を返します。

const_reverse_iterator crend() const;

戻り値

反転されたベクターの const 逆順の末尾超え反復子。 反転されたベクターの最後の要素の次の要素を指します。これは、反転されていないベクターの最初の要素の前の要素と同じです。 この要素はプレースホルダーであるため、逆参照しないでください。 比較にのみ使用してください。

解説

crend は、vector::cendvector で使用されるのと同様に、反転された vector で使用されます。

戻り値が (適切にデクリメントされた) crend の場合、vector オブジェクトは変更できません。

crend を使用して、逆順反復子が vector の末尾に達したかどうかをテストできます。

crend によって返された値は逆参照しないでください。 比較にのみ使用してください。

// vector_crend.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::const_reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_rIter = v1.rbegin( ) ; v1_rIter != v1.rend( ) ; v1_rIter++ )
      cout << *v1_rIter << endl;
}
2
1

data

ベクター内の最初の要素へのポインターを返します。

const_pointer data() const;

pointer data();

戻り値

vector 内の最初の要素へのポインター、または空の vector の次の位置を指すポインター。

// vector_data.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector<int> c1;
    vector<int>::pointer c1_ptr;
    vector<int>::const_pointer c1_cPtr;

    c1.push_back(1);
    c1.push_back(2);

    cout << "The vector c1 contains elements:";
    c1_cPtr = c1.data();
    for (size_t n = c1.size(); 0 < n; --n, c1_cPtr++)
    {
        cout << " " << *c1_cPtr;
    }
    cout << endl;

    cout << "The vector c1 now contains elements:";
    c1_ptr = c1.data();
    *c1_ptr = 20;
    for (size_t n = c1.size(); 0 < n; --n, c1_ptr++)
    {
        cout << " " << *c1_ptr;
    }
    cout << endl;
}
The vector c1 contains elements: 1 2
The vector c1 now contains elements: 20 2

difference_type

同じベクター内の要素を参照する 2 つの反復子の違いを提供する型。

typedef typename Allocator::difference_type difference_type;

解説

要素へのポインターにはそのアドレスが含まれるため、difference_type は 2 つのポインター間の要素の数と言うこともできます。

ベクター要素にアクセスするために、より一般的に使用されるのは反復子です。

// vector_diff_type.cpp
// compile with: /EHsc
#include <iostream>
#include <vector>
#include <algorithm>

int main( )
{
   using namespace std;

   vector <int> c1;
   vector <int>::iterator c1_Iter, c2_Iter;

   c1.push_back( 30 );
   c1.push_back( 20 );
   c1.push_back( 30 );
   c1.push_back( 10 );
   c1.push_back( 30 );
   c1.push_back( 20 );

   c1_Iter = c1.begin( );
   c2_Iter = c1.end( );

   vector <int>::difference_type   df_typ1, df_typ2, df_typ3;

   df_typ1 = count( c1_Iter, c2_Iter, 10 );
   df_typ2 = count( c1_Iter, c2_Iter, 20 );
   df_typ3 = count( c1_Iter, c2_Iter, 30 );
   cout << "The number '10' is in c1 collection " << df_typ1 << " times.\n";
   cout << "The number '20' is in c1 collection " << df_typ2 << " times.\n";
   cout << "The number '30' is in c1 collection " << df_typ3 << " times.\n";
}
The number '10' is in c1 collection 1 times.
The number '20' is in c1 collection 2 times.
The number '30' is in c1 collection 3 times.

emplace

その場で構築した要素をベクター内の指定位置に挿入します。

template <class... Types>
iterator emplace(
    const_iterator position,
    Types&&... args);

パラメーター

position
最初の要素を挿入する vector 内の位置。

args
コンストラクター引数。 この関数は、提供された引数に基づいてコンストラクターのどのオーバーロードを呼び出すかを推測します。

戻り値

この関数は、新しい要素が vector 内に挿入された位置を指す反復子を返します。

解説

挿入操作は負荷が高くなることがあります。vector のパフォーマンスに関する説明は vector クラスを参照してください。

// vector_emplace.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

// initialize a vector of vectors by moving v1
   vector < vector <int> > vv1;

   vv1.emplace( vv1.begin(), move( v1 ) );
   if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 )
      {
      cout << "vv1[0] =";
      for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )
         cout << " " << *Iter;
      cout << endl;
      }
}
v1 = 10 20 30
vv1[0] = 10 20 30

emplace_back

その場で構築した要素をベクターの末尾に追加します。

template <class... Types>
void emplace_back(Types&&... args);

パラメーター

args
コンストラクター引数。 この関数は、提供された引数に基づいてコンストラクターのどのオーバーロードを呼び出すかを推測します。

#include <vector>
struct obj
{
   obj(int, double) {}
};

int main()
{
   std::vector<obj> v;
   v.emplace_back(1, 3.14); // obj in created in place in the vector
}

empty

ベクターが空かどうかをテストします。

bool empty() const;

戻り値

ベクターが空の場合は true。 ベクターが空でない場合は false

// vector_empty.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );

   if ( v1.empty( ) )
      cout << "The vector is empty." << endl;
   else
      cout << "The vector is not empty." << endl;
}
The vector is not empty.

end

ベクターの最後の要素の次の要素を指す、 末尾超え反復子を返します。

iterator end();

const_iterator end() const;

戻り値

ベクターの 末尾超え反復子。 ベクターの最後の要素の次の要素を指します。 この要素はプレースホルダーであるため、逆参照しないでください。 比較にのみ使用してください。 ベクターが空の場合は、vector::end() == vector::begin() です。

解説

end の戻り値が const_iterator 型の変数に割り当てられている場合、vector オブジェクトを変更することはできません。 end の戻り値が iterator 型の変数に割り当てられている場合、vector オブジェクトを変更できます。

// vector_end.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>
int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator v1_Iter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_Iter = v1.begin( ) ; v1_Iter != v1.end( ) ; v1_Iter++ )
      cout << *v1_Iter << endl;
}
1
2

erase

指定した位置からベクター内の要素または要素範囲を削除します。

iterator erase(
    const_iterator position);

iterator erase(
    const_iterator first,
    const_iterator last);

パラメーター

position
ベクターから削除する要素の位置。

first
ベクターから削除する最初の要素の位置。

last
ベクターから削除する最後の要素の次の位置。

戻り値

削除した要素の後に残る最初の要素を指定する反復子。このような要素が存在しない場合は、ベクターの末尾へのポインター。

// vector_erase.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );
   v1.push_back( 40 );
   v1.push_back( 50 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.erase( v1.begin( ) + 1, v1.begin( ) + 3 );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;
}
v1 = 10 20 30 40 50
v1 = 20 30 40 50
v1 = 20 50

front

ベクター内の最初の要素への参照を返します。

reference front();

const_reference front() const;

戻り値

ベクター オブジェクト内の最初の要素への参照。 ベクターが空の場合、戻り値は未定義になります。

解説

front の戻り値が const_reference に割り当てられている場合、vector オブジェクトを変更することはできません。 front の戻り値が reference に割り当てられている場合、vector オブジェクトを変更できます。

_ITERATOR_DEBUG_LEVEL を 1 または 2 に定義して使用してコンパイルすると、空の vector 内の要素にアクセスしようとした場合に実行時エラーが発生します。 詳細については、「Checked Iterators」を参照してください。

// vector_front.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 11 );

   int& i = v1.front( );
   const int& ii = v1.front( );

   cout << "The first integer of v1 is "<< i << endl;
   // by incrementing i, we move the front reference to the second element
   i++;
   cout << "Now, the first integer of v1 is "<< i << endl;
}

get_allocator

ベクターの構築に使用されるアロケーター オブジェクトのコピーを返します。

Allocator get_allocator() const;

戻り値

ベクターで使用されるアロケーター。

解説

vector クラスのアロケーターは、クラスがどのようにストレージを管理するかを指定します。 C++ 標準ライブラリ コンテナー クラスで提供される既定のアロケーターは、ほとんどのプログラミング要件に対応しています。 独自のアロケーター クラスを作成して使用することは、C++ における高度な機能の 1 つです。

// vector_get_allocator.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   // The following lines declare objects that use the default allocator.
   vector<int> v1;
   vector<int, allocator<int> > v2 = vector<int, allocator<int> >(allocator<int>( )) ;

   // v3 will use the same allocator class as v1
   vector <int> v3( v1.get_allocator( ) );

   vector<int>::allocator_type xvec = v3.get_allocator( );
   // You can now call functions on the allocator class used by vec
}

insert

ベクター内の指定位置に、要素、複数の要素、または要素の範囲を挿入します。

iterator insert(
    const_iterator position,
    const Type& value);

iterator insert(
    const_iterator position,
    Type&& value);

void insert(
    const_iterator position,
    size_type count,
    const Type& value);

template <class InputIterator>
void insert(
    const_iterator position,
    InputIterator first,
    InputIterator last);

パラメーター

position
最初の要素を挿入するベクター内の位置。

value
ベクターに挿入される要素の値。

count
ベクターに挿入する要素の数。

first
コピーする要素範囲内の最初の要素の位置。

last
コピーする要素範囲を超える最初の要素の位置。

戻り値

最初の 2 つの insert 関数は、新しい要素がベクターに挿入された位置を指す反復子を返します。

解説

前提条件として、firstlast はベクター内の反復子である必要があります。それ以外の場合、動作は定義されません。 挿入操作は負荷が高くなることがあります。vector のパフォーマンスに関する説明は vector クラスを参照してください。

// vector_insert.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator Iter;

   v1.push_back( 10 );
   v1.push_back( 20 );
   v1.push_back( 30 );

   cout << "v1 =" ;
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   v1.insert( v1.begin( ) + 1, 40 );
   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;
   v1.insert( v1.begin( ) + 2, 4, 50 );

   cout << "v1 =";
   for ( Iter = v1.begin( ) ; Iter != v1.end( ) ; Iter++ )
      cout << " " << *Iter;
   cout << endl;

   const auto v2 = v1;
   v1.insert( v1.begin( )+1, v2.begin( )+2, v2.begin( )+4 );
   cout << "v1 =";
   for (Iter = v1.begin( ); Iter != v1.end( ); Iter++ )
      cout << " " << *Iter;
   cout << endl;

// initialize a vector of vectors by moving v1
   vector < vector <int> > vv1;

   vv1.insert( vv1.begin(), move( v1 ) );
   if ( vv1.size( ) != 0 && vv1[0].size( ) != 0 )
      {
      cout << "vv1[0] =";
      for (Iter = vv1[0].begin( ); Iter != vv1[0].end( ); Iter++ )
         cout << " " << *Iter;
      cout << endl;
      }
}
v1 = 10 20 30
v1 = 10 40 20 30
v1 = 10 40 50 50 50 50 20 30
v1 = 10 50 50 40 50 50 50 50 20 30
vv1[0] = 10 50 50 40 50 50 50 50 20 30

iterator

ベクター内の任意の要素を読み取り、または変更できるランダム アクセス反復子を提供する型。

typedef implementation-defined iterator;

解説

iterator は要素の値の変更に使用できます。

begin の例を参照してください。

max_size

ベクターの最大長を返します。

size_type max_size() const;

戻り値

ベクターの可能な最大長。

// vector_max_size.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::size_type i;

   i = v1.max_size( );
   cout << "The maximum possible length of the vector is " << i << "." << endl;
}

operator[]

指定した位置における vector 要素への参照を返します。

reference operator[](size_type position);

const_reference operator[](size_type position) const;

パラメーター

position
vector 要素の位置。

戻り値

指定された位置がコンテナーのサイズ以上の場合、結果は未定義になります。

解説

operator[] の戻り値が const_reference に割り当てられている場合、vector オブジェクトを変更することはできません。 operator[] の戻り値が参照に割り当てられている場合、vector オブジェクトを変更できます。

_ITERATOR_DEBUG_LEVEL を 1 または 2 に定義して使用してコンパイルすると、ベクターの境界外の要素にアクセスしようとした場合に実行時エラーが発生します。 詳細については、「Checked Iterators」を参照してください。

// vector_op_ref.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;

   v1.push_back( 10 );
   v1.push_back( 20 );

   int& i = v1[1];
   cout << "The second integer of v1 is " << i << endl;
}

operator=

ベクターの要素を、別のベクターのコピーで置き換えます。

vector& operator=(const vector& right);

vector& operator=(vector&& right);

パラメーター

right
vector 内にコピーされる vector

解説

vector では、operator= 内の既存の要素を消去した後、right の内容を vector 内にコピーまたは移動します。

// vector_operator_as.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector<int> v1, v2, v3;
   vector<int>::iterator iter;

   v1.push_back(10);
   v1.push_back(20);
   v1.push_back(30);
   v1.push_back(40);
   v1.push_back(50);

   cout << "v1 = " ;
   for (iter = v1.begin(); iter != v1.end(); iter++)
      cout << *iter << " ";
   cout << endl;

   v2 = v1;
   cout << "v2 = ";
   for (iter = v2.begin(); iter != v2.end(); iter++)
      cout << *iter << " ";
   cout << endl;

// move v1 into v2
   v2.clear();
   v2 = move(v1);
   cout << "v2 = ";
   for (iter = v2.begin(); iter != v2.end(); iter++)
      cout << *iter << " ";
   cout << endl;
}

pointer

ベクター内の要素へのポインターを提供する型。

typedef typename Allocator::pointer pointer;

解説

pointer は要素の値の変更に使用できます。

// vector_pointer.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
    using namespace std;
    vector<int> v;
    v.push_back( 11 );
    v.push_back( 22 );

    vector<int>::pointer ptr = &v[0];
    cout << *ptr << endl;
    ptr++;
    cout << *ptr << endl;
    *ptr = 44;
    cout << *ptr << endl;
}
11
22
44

pop_back

ベクトルの末尾の要素を削除します。

void pop_back();

解説

コード例については、「vector::push_back()」をご覧ください。

push_back

ベクトルの末尾に要素を追加します。

void push_back(const T& value);

void push_back(T&& value);

パラメーター

value
ベクトルの末尾に追加する要素に割り当てる値。

// compile with: /EHsc /W4
#include <vector>
#include <iostream>

using namespace std;

template <typename T> void print_elem(const T& t) {
    cout << "(" << t << ") ";
}

template <typename T> void print_collection(const T& t) {
    cout << "  " << t.size() << " elements: ";

    for (const auto& p : t) {
        print_elem(p);
    }
    cout << endl;
}

int main()
{
    vector<int> v;
    for (int i = 0; i < 10; ++i) {
        v.push_back(10 + i);
    }

    cout << "vector data: " << endl;
    print_collection(v);

    // pop_back() until it's empty, printing the last element as we go
    while (v.begin() != v.end()) {
        cout << "v.back(): "; print_elem(v.back()); cout << endl;
        v.pop_back();
    }
}

rbegin

逆順のベクターの最初の要素への反復子を返します。

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

戻り値

反転されたベクターの最初の要素を指すか、反転されていないベクターの最後の要素だったものを指す、逆順ランダム アクセス反復子。

解説

rbegin の戻り値が const_reverse_iterator に割り当てられている場合、vector オブジェクトを変更することはできません。 rbegin の戻り値が reverse_iterator に割り当てられている場合、vector オブジェクトを変更できます。

// vector_rbegin.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::iterator v1_Iter;
   vector <int>::reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   v1_Iter = v1.begin( );
   cout << "The first element of vector is "
        << *v1_Iter << "." << endl;

   v1_rIter = v1.rbegin( );
   cout << "The first element of the reversed vector is "
        << *v1_rIter << "." << endl;
}
The first element of vector is 1.
The first element of the reversed vector is 2.

reference

ベクターに格納されている要素への参照を提供する型。

typedef typename Allocator::reference reference;

vector クラスで reference を使用する方法の例については、at をご覧ください。

rend

反転されたベクターの最後の要素の次の要素を指す、 逆順の末尾超え反復子を返します。

const_reverse_iterator rend() const;
reverse_iterator rend();

戻り値

反転されたベクターの逆順の末尾超え反復子。 反転されたベクターの最後の要素の次の要素を指します。これは、反転されていないベクターの最初の要素の前の要素と同じです。 この要素はプレースホルダーであるため、逆参照しないでください。 比較にのみ使用してください。

解説

rend は、ベクターで end を使用するのと同様に、逆順のベクターで使用します。

rend の戻り値が const_reverse_iterator に割り当てられている場合、vector オブジェクトを変更することはできません。 rend の戻り値が reverse_iterator に割り当てられている場合、vector オブジェクトを変更できます。

rend を使用して、逆順反復子がベクターの末尾に達したかどうかをテストできます。

rend によって返された値は逆参照しないでください。 比較にのみ使用してください。

// vector_rend.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::reverse_iterator v1_rIter;

   v1.push_back( 1 );
   v1.push_back( 2 );

   for ( v1_rIter = v1.rbegin( ) ; v1_rIter != v1.rend( ) ; v1_rIter++ )
      cout << *v1_rIter << endl;
}
2
1

reserve

ベクター オブジェクトの記憶域の最小長を予約します。必要であれば、領域を割り当てます。

void reserve(size_type count);

パラメーター

count
ベクターに割り当てる記憶域の最小長。

// vector_reserve.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   //vector <int>::iterator Iter;

   v1.push_back( 1 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.reserve( 20 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
}
Current capacity of v1 = 1
Current capacity of v1 = 20

resize

ベクターの新しいサイズを指定します。

void resize(size_type new_size);
void resize(size_type new_size, Type value);

パラメーター

new_size
ベクターの新しいサイズ。

value
新しいサイズが元のサイズよりも大きい場合に、ベクターに追加される新しい要素の初期化値。 この値を省略した場合、新しいオブジェクトは既定のコンストラクターを使用します。

解説

コンテナーのサイズが要求されたサイズ (new_size) よりも小さい場合、resize では要求されたサイズになるまで、ベクターに要素が追加されます。 コンテナーのサイズが要求されたサイズよりも大きい場合、resize ではコンテナーのサイズが new_size になるまで、コンテナーの末尾に近い要素から順に削除されます。 コンテナーの現在のサイズが要求されたサイズと同じ場合は、何も実行されません。

size はベクターの現在のサイズを反映します。

// vectorsizing.cpp
// compile with: /EHsc /W4
// Illustrates vector::reserve, vector::max_size,
// vector::resize, vector::resize, and vector::capacity.
//
// Functions:
//
//    vector::max_size - Returns maximum number of elements vector could
//                       hold.
//
//    vector::capacity - Returns number of elements for which memory has
//                       been allocated.
//
//    vector::size - Returns number of elements in the vector.
//
//    vector::resize - Reallocates memory for vector, preserves its
//                     contents if new size is larger than existing size.
//
//    vector::reserve - Allocates elements for vector to ensure a minimum
//                      size, preserving its contents if the new size is
//                      larger than existing size.
//
//    vector::push_back - Appends (inserts) an element to the end of a
//                        vector, allocating memory for it if necessary.
//
//////////////////////////////////////////////////////////////////////

// The debugger cannot handle symbols more than 255 characters long.
// The C++ Standard Library often creates symbols longer than that.
// The warning can be disabled:
//#pragma warning(disable:4786)

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <typename C> void print(const string& s, const C& c) {
    cout << s;

    for (const auto& e : c) {
        cout << e << " ";
    }
    cout << endl;
}

void printvstats(const vector<int>& v) {
    cout << "   the vector's size is: " << v.size() << endl;
    cout << "   the vector's capacity is: " << v.capacity() << endl;
    cout << "   the vector's maximum size is: " << v.max_size() << endl;
}

int main()
{
    // declare a vector that begins with 0 elements.
    vector<int> v;

    // Show statistics about vector.
    cout << endl << "After declaring an empty vector:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    // Add one element to the end of the vector.
    v.push_back(-1);
    cout << endl << "After adding an element:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    for (int i = 1; i < 10; ++i) {
        v.push_back(i);
    }
    cout << endl << "After adding 10 elements:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(6);
    cout << endl << "After resizing to 6 elements without an initialization value:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(9, 999);
    cout << endl << "After resizing to 9 elements with an initialization value of 999:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    v.resize(12);
    cout << endl << "After resizing to 12 elements without an initialization value:" << endl;
    printvstats(v);
    print("   the vector's contents: ", v);

    // Ensure there's room for at least 1000 elements.
    v.reserve(1000);
    cout << endl << "After vector::reserve(1000):" << endl;
    printvstats(v);

    // Ensure there's room for at least 2000 elements.
    v.resize(2000);
    cout << endl << "After vector::resize(2000):" << endl;
    printvstats(v);
}

reverse_iterator

反転ベクター内の要素を読み取り、または変更できるランダム アクセス反復子を提供する型。

typedef std::reverse_iterator<iterator> reverse_iterator;

解説

reverse_iterator は、逆の順序でベクターを反復処理するために使用します。

rbegin の例を参照してください。

shrink_to_fit

余分なキャパシティを破棄します。

void shrink_to_fit();

// vector_shrink_to_fit.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   //vector <int>::iterator Iter;

   v1.push_back( 1 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.reserve( 20 );
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
   v1.shrink_to_fit();
   cout << "Current capacity of v1 = "
      << v1.capacity( ) << endl;
}
Current capacity of v1 = 1
Current capacity of v1 = 20
Current capacity of v1 = 1

size

ベクター内の要素の数を返します。

size_type size() const;

戻り値

ベクターの現在の長さ。

// vector_size.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1;
   vector <int>::size_type i;

   v1.push_back( 1 );
   i = v1.size( );
   cout << "Vector length is " << i << "." << endl;

   v1.push_back( 2 );
   i = v1.size( );
   cout << "Vector length is now " << i << "." << endl;
}
Vector length is 1.
Vector length is now 2.

size_type

ベクター内の要素の数をカウントする型。

typedef typename Allocator::size_type size_type;

capacity の例を参照してください。

swap

2 つのベクターの要素を交換します。

void swap(
    vector<Type, Allocator>& right);

friend void swap(
    vector<Type, Allocator>& left,
    vector<Type, Allocator>& right);

パラメーター

right
交換される要素を提供するベクター。 または、ベクター left 内の要素と交換される要素を持つベクター。

left
ベクター right 内の要素と交換される要素を持つベクター。

// vector_swap.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector <int> v1, v2;

   v1.push_back( 1 );
   v1.push_back( 2 );
   v1.push_back( 3 );

   v2.push_back( 10 );
   v2.push_back( 20 );

   cout << "The number of elements in v1 = " << v1.size( ) << endl;
   cout << "The number of elements in v2 = " << v2.size( ) << endl;
   cout << endl;

   v1.swap( v2 );

   cout << "The number of elements in v1 = " << v1.size( ) << endl;
   cout << "The number of elements in v2 = " << v2.size( ) << endl;
}
The number of elements in v1 = 3
The number of elements in v2 = 2

The number of elements in v1 = 2
The number of elements in v2 = 3

value_type

ベクター内に格納されているデータ型を表す型。

typedef typename Allocator::value_type value_type;

解説

value_type は、テンプレート パラメーター Type のシノニムです。

// vector_value_type.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main( )
{
   using namespace std;
   vector<int>::value_type AnInt;
   AnInt = 44;
   cout << AnInt << endl;
}
44

vector

ベクターを構築します。 オーバーロードでは、特定のサイズのベクター、または特定の値の要素を使用するベクターが構築されます。 または、他のベクターの全体または一部のコピーとなります。 オーバーロードによっては、使用するアロケーターを指定することもできます。

vector();
explicit vector(const Allocator& allocator);
explicit vector(size_type count);
vector(size_type count, const Type& value);
vector(size_type count, const Type& value, const Allocator& allocator);

vector(const vector& source);
vector(vector&& source);
vector(initializer_list<Type> init_list, const Allocator& allocator);

template <class InputIterator>
vector(InputIterator first, InputIterator last);
template <class InputIterator>
vector(InputIterator first, InputIterator last, const Allocator& allocator);

パラメーター

allocator
このオブジェクトに対して使用するアロケーター クラス。 get_allocator は、オブジェクトのアロケーター クラスを返します。

count
構築されたベクター内の要素の数。

value
構築されたベクターの要素の値。

source
構築されたベクターがコピーになる元のベクター。

first
コピーする要素範囲内の最初の要素の位置。

last
コピーする要素範囲を超える最初の要素の位置。

init_list
コピーする要素を含む initializer_list

解説

すべてのコンストラクターは、アロケーター オブジェクト (allocator) を格納し、ベクターを初期化します。

最初の 2 つのコンストラクターは、空の初期ベクターを指定します。 2 番目のコンストラクターは、使用するアロケーターの型 (allocator) を明示的に指定します。

3 番目のコンストラクターは、count クラスの、指定された数 (Type) の既定値の要素を繰り返すことを指定します。

4 番目と 5 番目のコンストラクターは、値 value の (count) 個の要素の繰り返しを指定します。

6 番目のコンストラクターは、ベクター source のコピーを指定します。

7 番目のコンストラクターは、ベクター source を移動します。

8 番目のコンストラクターは、initializer_list を使用して要素を指定します。

9 番目と 10 番目のコンストラクターは、ベクターの範囲 (firstlast) をコピーします。

// vector_ctor.cpp
// compile with: /EHsc
#include <vector>
#include <iostream>

int main()
{
    using namespace std;
    vector <int>::iterator v1_Iter, v2_Iter, v3_Iter, v4_Iter, v5_Iter, v6_Iter;

    // Create an empty vector v0
    vector <int> v0;

    // Create a vector v1 with 3 elements of default value 0
    vector <int> v1(3);

    // Create a vector v2 with 5 elements of value 2
    vector <int> v2(5, 2);

    // Create a vector v3 with 3 elements of value 1 and with the allocator
    // of vector v2
    vector <int> v3(3, 1, v2.get_allocator());

    // Create a copy, vector v4, of vector v2
    vector <int> v4(v2);

    // Create a new temporary vector for demonstrating copying ranges
    vector <int> v5(5);
    for (auto i : v5) {
        v5[i] = i;
    }

    // Create a vector v6 by copying the range v5[ first,  last)
    vector <int> v6(v5.begin() + 1, v5.begin() + 3);

    cout << "v1 =";
    for (auto& v : v1){
        cout << " " << v;
    }
    cout << endl;

    cout << "v2 =";
    for (auto& v : v2){
        cout << " " << v;
    }
    cout << endl;

    cout << "v3 =";
    for (auto& v : v3){
        cout << " " << v;
    }
    cout << endl;
    cout << "v4 =";
    for (auto& v : v4){
        cout << " " << v;
    }
    cout << endl;

    cout << "v5 =";
    for (auto& v : v5){
        cout << " " << v;
    }
    cout << endl;

    cout << "v6 =";
    for (auto& v : v6){
        cout << " " << v;
    }
    cout << endl;

    // Move vector v2 to vector v7
    vector <int> v7(move(v2));
    vector <int>::iterator v7_Iter;

    cout << "v7 =";
    for (auto& v : v7){
        cout << " " << v;
    }
    cout << endl;

    cout << "v8 =";
    vector<int> v8{ { 1, 2, 3, 4 } };
    for (auto& v : v8){
        cout << " " << v ;
    }
    cout << endl;
}
v1 = 0 0 0
v2 = 2 2 2 2 2
v3 = 1 1 1
v4 = 2 2 2 2 2
v5 = 0 0 0 0 0
v6 = 0 0
v7 = 2 2 2 2 2
v8 = 1 2 3 4

関連項目

C++ 標準ライブラリ内のスレッド セーフ
C++ 標準ライブラリ リファレンス