C++_イテレータ ( iterator ) とは

std::copy で出てきたので。一応前に調べていた…。
一応 C++ 配列を調べたので少し理解できるようになったかも。ただのコピペ。

抽象化されたポインタのことで、コンテナの要素を指し
移動や要素を参照・変更することが出来る。
配列やコンテナのような範囲を横断する手段

  • 種別が 3 種類あり、コンテナクラスにより決まる。
    ランダム・アクセス可vector::iterator , array::iterator
    両方向移動可list::iterator
    前方向のみ移動可forward_list::iterator
  • 要素を修正できるイテレータ ( iterator )
    参照のみが可能イテレータ ( const_iterator ) がある。
  • begin(), end() で ( 非 const ) イテレータを取得、
    cbegin(), cend() で const イテレータを取得出来る。
  • 末尾から先頭に向かって逐次処理を行う場合はrbegin(), rend() を
    使うことも出来る。
  • ++ 演算子によりイテレータ進めることが出来る。
  • ランダム・アクセス可能、両方向移動可能であれば、
    -- 演算子によりイテレータ前に戻すことが出来る。
  • ランダム・アクセス可能であれば、+=n, -=nイテレータ移動出来る。
  • 通常のポインタもランダムアクセス可能なイテレータとして扱うことが出来る。
  • * 演算子により、イテレータが指す先を参照・変更することが出来る。

 

 

逆引き

略字。
イテレータイ宣イテレータを宣言。ラ・ア可:ランダム・アクセス可能。

用途 コード
std::vector へのイ宣 std::vector<int>::iterator itr;
std::vector への const なイ宣 std::vector<int>::const_iterator itr;
std::vector v の先頭を指すイ宣 std::vector<int>::iterator itr = v.begin();
auto itr = v.begin();  // 推奨
int 型の要素を持つ std::vector v の
末尾 ( 最後の要素の ) を指すイ
v.end();  //  型は vector<int>::iterator 
std::vector v の先頭を指す
const なイ宣
std::vector<int>::const_iterator itr = v.cbegin();
auto itr = v.cbegin();  // 推奨
int 型の要素を持つ std::vector v の
末尾 ( 最後の要素の ) を指す const なイ
 v.cend();  // 型は vector<int>::const_iterator
イ itr をひとつ進める ++itr;
イ itr をひとつ前に戻す --itr;
ランダム・アクセス可能な
イ itr を n 進める
itr += n;
ラ・ア可なイ itr を n 前に戻す itr -= n;
first と last 間の要素数を求める std::distance(first, last);
イ itr の指す先の要素参照する *itr
イ itr の指す先の要素に val を代入する *itr = val;
イを使って vector<int> v の
要素を最初から最後まで参照する
for(auto itr = v.begin(); itr != v.end(); ++itr) {
  *itr;
}
イを使って vector<int> v の
要素を最後から最初まで参照する
for(auto itr = v.rbegin(); itr != v.rend(); ++itr) {
  *itr;
}
範囲 [ first, last ) を全て処理する方法 while( first != last ) {
  //何らかの処理;
  ++first;
}
ラ・ア可なイ first, last を使って、
範囲 [first, last) の要素をソート
std::sort(first, last);
イ first, last を使って、
範囲 [first, last) の要素の合計を計算
std::accumulate(first, last, 0);
同上
要素順序反転
std::reverse(first, last);
同上
要素値が val 個数を数える
std::count(first, last, val);

 

 

 

こちらから。
http://vivi.dyndns.org/tech/cpp/iterator.html
https://cpprefjp.github.io/reference/iterator.html

以上。