## 2.1 反復子の概要

反復子の概念は、標準 C++ ライブラリで提供されるコンテナクラスとそれに関連するアルゴリズムを使用するための基盤となります。反復子は、コンテナに格納されているすべての要素を循環させるためのポインタのようなオブジェクトです。アルゴリズムの種類に応じて異なる方法でコンテナをたどる必要があるため、さまざまな形式の反復子があります。標準 C++ ライブラリの各コンテナクラスは、コンテナの実装に使用される格納手法として最適な機能を備えた反復子を生成することができます。これは、標準 C++ ライブラリのどのアルゴリズムが、どのコンテナクラスで使用できるかを主に識別する引数として必要な、反復子のカテゴリです。

従来のプログラミングのさまざまな方法で使用できるポインタと同様に、反復子をさまざまな目的に使用することができます。反復子は、ポインタが特定のメモリーアドレスの参照に使用できるのと同様に、特定の値を示すために使用することができます。連続するメモリー領域の記述に 2 つのポインタを使用できるのと同様に、1 組の反復子をコンテナ内の値の範囲やシーケンスを定義するために使用することができます。しかし、反復子を使用すると、記述される値は同じコンテナから派生し、コンテナで要素を維持する順序の 1 番目の値の後に 2 番目の値が来るため、物理的なシーケンスではなく論理的なシーケンスとなります。

従来のポインタは、何もポイントしない NULL ポインタとなる場合もあります。同様に、反復子も特定の値を示さない場合があります。NULL ポインタを間接参照すると論理エラーになるのと同様に、値を示さない反復子を間接参照するとエラーになります。

従来の C++ でのプログラミングでは、メモリー領域を記述する 2 つのポインタが使用される場合は、終了ポインタは領域の一部とはみなされません。たとえば、名前が `x` で長さ `10` の配列がある場合、`x+10` の要素が配列の一部ではなくても、`x` が `x+10` に拡張されると記述されることがあります。ポインタの値 `x+10` は、記述された範囲の終端が記述された後に、終了値となります。反復子も同様に範囲を記述するために使用されます。2 番目の値は、指定される範囲の一部とはみなされません。これは、範囲の最後の値の後に来るシーケンスの次の値を記述する終了値要素です。メモリーへのポインタと同様に、コンテナの実効値となる場合もあります。それ以外の場合は、その目的のために作成された特殊値となる可能性があります。いずれの場合でも、範囲の終端を指定するために使用される反復子を間接参照することは適切ではありません。

従来のポインタと同様に、反復子の変更に使用される基本演算は、インクリメント演算子 `++` です。インクリメント演算子がシーケンスの最後の値を示す反復子に適用されると、終了値に変更されます。式 `++i` のアプリケーションの有限シーケンスの後に、反復子 `i` が `j` と等しくなる場合、反復子 `j` が反復子 `i` から到達可能であると言います。

範囲を使用すると、最初の要素への反復子と特別な終了反復子を作成することによって、コンテナの内容全体を記述することができます。また、特定の値への 2 つの反復子を使用することによって、1 つのコンテナ内のサブシーケンスを記述することもできます。

> 注: 範囲の記述に 2 つの反復子が使用される場合、2 番目の反復子が 1 番目の反復子から到達可能であることが前提となりまが、これは検証されていません。この前提が満たされない場合は、エラーが発生する可能性があります。

この章の後の部分では、標準 C++ ライブラリで使用される反復子のさまざまな形式と、他のさまざまな反復子に関連する関数について説明します。

Copyright (c) 1998, Rogue Wave Software, Inc.
このマニュアルに関する誤りのご指摘やご質問は、電子メールにてお送りください。
OEM リリース, 1998 年 6 月