C++の標準ライブラリvectorとiteratorを使ってみた

C++でプログラミングをする際に恐らく必ず使うことになるであろう、標準ライブラリのvectorとiteratorを試してみたのでそのメモです。

vectorは要素数を指定せずに定義でき、要素の追加や削除の操作により、動的に要素数が増減する動的配列です。(組み込み配列は int data[10] のように定義時に要素数を指定しなければならない)

iteratorは反復子とも呼ばれ、vectorなどのデータの参照先要素の位置(ポインタ)をインクリメントやデクリメントする際に使用します。

以下はvectorとiteratorを使用したシンプルな例文です。

#include <vector> //vectorライブラリをインクルード
#include <iostream> //iostreamをインクルード(coutを使用するため)
using namespace std; //どちらのライブラリもstd名前空間に含まれているため、stdを名前空間として設定

int main() {
        vector<int> data{1, 2, 3, 4, 5}; //1から5までの値を格納した5つの要素を持つvectorデータを作成
        vector<int>::iterator itr; //vector用の反復子
        for (itr = data.begin(); itr != data.end(); ++itr) { //vectorデータのbebin()メソッドを呼び出すと先頭の要素、end()メソッドを呼び出すと最後の要素のアドレスが返されます
                cout << *itr << endl; //各要素の値を出力(itrは対象要素のポインタなので*itrで値を取得できる)
        }
        return 0;
}

結果:

1
2
3
4
5

ちなみに参照先要素を正しくインクリメント、デクリメントするためには要素の型が分かっていなければなりません。int型であればintのサイズ分アドレスを加算または減算することになりますが、型が違えば要素のサイズも変わってくるので、それができないのです。なのでvector<int>であれば、vector<int>::iteratorのように、vector<int>の反復子として定義する必要があります。

反復子は、それが指しているオブジェクトとシーケンスの情報を得るために使われる。たとえば、反復子を間接参照すれば、得られたオブジェクトを操作できるし、シーケンスを記述する反復子があれば、シーケンスの要素数を取得できる。このような演算を表現するためには、"反復子が参照しているオブジェクトの型"や"2つの反復子の距離を表現する型"といった反復子に関連した型を参照できなければならない。
(プログラミング言語C++ 第3版 「第19章 反復子とアロケータ」より)

今回参考にした書籍

公開日:2023年01月29日
最終更新日:2023年04月25日

記事 > C++言語 > C++の標準ライブラリvectorとiteratorを使ってみた

他の記事も見る

このページのトップに戻る