C++における「イテレータ(Iterators)」は、コンテナ内の要素にアクセスし、操作するための非常に強力なツールです。イテレータは、C++の標準ライブラリであるSTL(Standard Template Library)を使用する際に欠かせない部分であり、コンテナ(ベクター、リスト、マップなど)を扱う際に効率的で統一的な方法を提供します。本記事では、C++のイテレータに関して、基本的な概念から詳細な使い方、実際の使用例までを完全かつ包括的に解説します。
1. イテレータの基本概念
イテレータは、コンテナ内の要素を順に辿るための「ポインタ」のような役割を果たします。ポインタと似たような操作を行いますが、ポインタとは異なり、STLコンテナに特化したインターフェースを提供します。イテレータを使うことで、コンテナの型に依存せずに、同じコードで異なる種類のコンテナを操作できるようになります。

例えば、std::vector
や std::list
といった異なるコンテナ型を使う場合でも、イテレータを使えば同じ操作で要素を取得できます。
2. イテレータの種類
C++にはいくつかの異なる種類のイテレータが存在し、それぞれのイテレータは使用できる操作が異なります。以下は主なイテレータの種類です。
2.1. 入力イテレータ(Input Iterator)
入力イテレータは、コンテナ内の要素を一方向に読み取ることができます。最も基本的なイテレータで、読み取り専用です。例えば、std::istream_iterator
や std::vector::iterator
がこれに該当します。
2.2. 出力イテレータ(Output Iterator)
出力イテレータは、コンテナに対して値を書き込むためのイテレータです。読み取り専用ではなく、値を設定することができます。例えば、std::ostream_iterator
が該当します。
2.3. 前方イテレータ(Forward Iterator)
前方イテレータは、コンテナの要素を前方向に読み書きできるイテレータです。これにより、再度最初からイテレータを進めることができます。
2.4. 双方向イテレータ(Bidirectional Iterator)
双方向イテレータは、コンテナ内を前方向および後方向に移動することができます。std::list
などのコンテナで使用されることが一般的です。
2.5. ランダムアクセスイテレータ(Random Access Iterator)
ランダムアクセスイテレータは、コンテナ内の要素に対して直接的なインデックスアクセスを提供します。このタイプのイテレータは、最も強力で、配列や std::vector
でよく使用されます。要素の前後移動はもちろん、インデックスで直接アクセスすることが可能です。
3. イテレータの使用法
イテレータは、コンテナの要素を順に操作するために非常に便利です。例えば、std::vector
を使ってイテレータを使う例を見てみましょう。
cpp#include
#include
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// イテレータを使ってコンテナ内を順に辿る
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
std::cout << *it << " ";
}
return 0;
}
このコードでは、vec.begin()
がコンテナの最初の要素を指し、vec.end()
がコンテナの終端を指します。イテレータはポインタのように動作し、*it
で要素にアクセスします。
4. イテレータを使った操作の例
次に、イテレータを使ってコンテナ内の要素を操作するいくつかの例を示します。
4.1. 要素の変更
イテレータを使って、コンテナ内の要素を変更することができます。以下のコードは、std::vector
の各要素に 2 を掛ける例です。
cpp#include
#include
int main() {
std::vector<int> vec = {1, 2, 3, 4, 5};
// イテレータで各要素にアクセスし、値を変更
for (std::vector<int>::iterator it = vec.begin(); it != vec.end(); ++it) {
*it *= 2; // 要素を2倍にする
}
// 結果を出力
for (const auto& val : vec) {
std::cout << val << " ";
}
return 0;
}
このコードでは、イテレータを使って各要素を変更しています。*it *= 2;
によって、各要素が2倍になります。
4.2. 逆方向のイテレータ
双方向イテレータを使うと、コンテナを逆順で辿ることができます。std::list
では、逆方向のイテレータを使用することができます。
cpp#include
#include
int main() {
std::list<int> lst = {10, 20, 30, 40, 50};
// 逆方向にイテレータを進める
for (std::list<int>::reverse_iterator rit = lst.rbegin(); rit != lst.rend(); ++rit) {
std::cout << *rit << " ";
}
return 0;
}
ここでは、rbegin()
と rend()
を使用して、リストの逆順に要素を出力しています。
5. イテレータとアルゴリズム
C++標準ライブラリのアルゴリズムの多くは、イテレータを使用して動作します。例えば、std::sort
や std::find
などのアルゴリズムは、イテレータを引数として受け取り、コンテナ内で操作を行います。
cpp#include
#include
#include
int main() {
std::vector<int> vec = {5, 1, 4, 2, 3};
// イテレータを使ってソート
std::sort(vec.begin(), vec.end());
for (const auto& val : vec) {
std::cout << val << " ";
}
return 0;
}
このコードでは、std::sort
を使ってベクターをソートしています。イテレータを使って、コンテナ内の要素を簡単に操作できます。
6. まとめ
C++のイテレータは、STLコンテナを操作するための強力で柔軟なツールです。イテレータを使用することで、コードをより一般的かつ再利用可能にし、コンテナの種類に依存せずに要素を操作できます。イテレータは、入力、出力、前方、双方向、ランダムアクセスなど、さまざまなタイプがあり、これらを適切に使用することで、効率的なコードを記述することができます。