k)(k個先のイテレータ。コンテナ.erase(イテレータ)要素を削除したり、追加することによってイテレータが無効になることがある無効なイテレータを使用しないように注意が必要イテレータ配列やmapなどのコンテナの各要素に対して順番に処理を行うときにイテレータを用いることができます。実際にSTLにおいて「一連の要素に対して何かを行う」ような関数はイテレータを引数に取る形で実装されています。配列をソートするときに用いるsortはイテレータを引数に取ります。sortに渡していた配列.begin()や配列.end()がイテレータを表します。配列に対するイテレータは次の図のように「各要素を指すもの」として考えることができます。上の図で、イテレータ1は3つ目の要素である5を指すイテレータで、イテレータ2は7つ目の要素である4を指すイテレータです。イテレータに対する操作としては、「次の位置のイテレータを得る」ことや「イテレータが指す要素にアクセスする」などの操作ができます。次のサンプルプログラムは、配列の2番目の要素にアクセスする例です。itr2が指す要素(a[6])へのアクセス}実行結果54次のサンプルプログラムは、for文を用いて配列の要素に順番にアクセスする例です。実際に上のサンプルプログラムのように書くことはあまりないかもしれません。イテレータには配列以外のデータ構造に対しても同じように扱えるというメリットがあります。イテレータをサポートする任意のデータ構造に対して、同じソート関数sortを用いることができるようになっています。イテレータの型イテレータの型はコンテナ毎に定義されていて、複雑なものになっています。手書きするのは大変なので通常はautoを用います。厳密な型が必要な場合はcppreference.comなどを参照してください。先頭の要素のイテレータコンテナ.begin()コンテナの先頭の要素を指すイテレータを返します。コンテナが空の場合は「末尾の要素の次」を指すイテレータを返します。(最後の要素の次)を指すイテレータを返します。末尾の要素を指すイテレータではないことに注意してください。扱いにくいように見えますが、for文での終了判定する際などに便利な場合があります。endが返すイテレータの指す位置にアクセスしてはならないことに注意してください。このような、それが指す位置に要素が存在しないようなイテレータに対してアクセスを行うことは未定義な動作を引き起こします。イテレータ22つのイテレータが同じ位置を指すときにtrueになります。イテレータ22つのイテレータが違う位置を指すときにtrueになります。イテレータ2)「イテレータ1を何回進めるとイテレータ2に一致するか」を返します。mapやsetのイテレータの場合、イテレータ1がイテレータ2よりも後ろの要素を指す場合、動作は未定義です。イテレータの移動これらの操作ではイテレータの変数自体が変更されます。1つ進めるイテレータ++;k個分進めるイテレータをk回進めるときには以下のように書くこともできます。k);1つ後ろに進めるイテレータ--;k個分後ろに進めるadvanceに負の値を渡すことで、指定回数分後ろに進めることができます。k回分後ろに進める前後のイテレータを得るイテレータをコピーした後で、++やadvanceを用いれば同じことができます。(map/setでは使えない)nextやprevは返り値として前後のイテレータを返します。引数に渡したイテレータ自体は書き換わりません。イテレータが指す要素へのアクセス*イテレータコンテナ.end()が返すイテレータや、空のコンテナ.begin()が返すイテレータに対してアクセスを行うことは未定義な動作を引き起こします。各要素に対する処理}要素の削除イテレータが指す要素を削除することもできます。要素の削除によってそのイテレータが無効化されます。詳しくは注意点で説明します。for文で各要素に対する処理を行っているときに、削除を行う場合には次のようにします。eraseは削除後の次の要素のイテレータを返します。末尾の要素を指すイテレータが欲しい場合は次のようにすればよいです。prev(コンテナ.end())空のコンテナに対してこの操作を行ってはいけないことに注意してください。イテレータの操作の計算量イテレータの操作にかかる計算量はコンテナによって異なります。配列のイテレータを操作するときの計算量は以下の通りです。削除する要素以降の要素数をNとして、O(N)map/setmap/setのイテレータを操作するときの計算量は以下の通りです。償却計算量でO(1)「償却計算量でO(1)」とは、同じ処理をN回行ったときに1回あたりの計算量がO(1)になるという意味です。無効なイテレータコンテナに対して要素の削除や追加を行うと、操作前のイテレータが無効化されることがあります。無効なイテレータを使用することは未定義の動作を引き起こします。イテレータを取っておいて、後から使いまわすような場合には注意する必要があります。以下にイテレータが無効化される場合の例を挙げます。詳しくはcppreference.comなどを参照してください。vector要素を削除すると、その要素を含むそれより後ろの要素に対するイテレータが無効化されます。必要に応じてerase関数の戻り値を利用することができます。push_backなどによって、コンテナの容量が変更される場合には、全ての要素に対するイテレータが無効化されます。要素へのアクセスによってイテレータが無効化されることはありません。map/set要素を削除すると、その要素に対するイテレータが無効化されます。必要に応じてerase関数の戻り値を利用することができます。読み取りや、要素の追加ではイテレータが無効化されることはありません。map/setのイテレータは読み取り専用mapやsetのイテレータの指す要素を変更することはできません。細かい話STLの関数の紹介STLの関数で、イテレータに関連するものをいくつか紹介します。sort既に紹介していますが、データを整列するための関数です。イテレータ2);イテレータ1とイテレータ2の間にある要素を整列します。配列.end());のように用いれば先頭以外を整列することができます。findイテレータの範囲内から指定した値に一致する最初の要素を探し、その要素を指すイテレータを返します。見つからなかった場合は、範囲の最後を返します。見つからなかった場合はイテレータ2を返す計算量はイテレータの距離をNとしてO(N)です。map/setの場合map/setの場合は次のようにして、メンバ関数版のfindを用いる方が高速です。配列の中に3があるかを探す例です。3find_ifイテレータの範囲内から、条件を満たす最初の要素を探し、その要素を指すイテレータを返します。見つからなかった場合は、範囲の最後を返します。見つからなかった場合はイテレータ2を返す条件の関数には「要素を引数として受け取りbool値を返す」関数を指定します。find_ifは、この関数がtrueを返す最初のイテレータを返します。条件にはラムダ式を用いることもできます。計算量はイテレータの距離をNとしてO(N)です。配列の中から偶数の要素を探す例です。}}実行結果4lower_boundイテレータの範囲内から指定した値以上の最小の要素を探し、その要素を指すイテレータを返します。見つからなかった場合は、範囲の最後を返します。lower_boundを用いる場合、指定する範囲がソート済みである必要があります。map/setの場合map/setの場合は次のようにして、メンバ関数版のlower_boundを用いる方が高速です。}}実行結果58upper_boundイテレータの範囲内から指定した値より大きな最小の要素を探し、その要素を指すイテレータを返します。見つからなかった場合は、範囲の最後を返します。使い方や計算量はlower_boundと同じです。こちらも、map/setの場合はメンバ関数版を用います。