2018年02月21日
《その302》 反復子の種類
反復子の種類
反復子は、5種類あります。
(1)入力反復子(Input Iterator)
演算子 ++ による反復子操作
* による参照
(2)出力反復子(Output Iterator)
演算子 ++ による反復子操作
* による代入
(3)前進反復子(Forward Iterator)
(1),(2)の機能
(4)双方向反復子(Bidirectional Iterator)
(3)の機能
演算子 -- による反復子操作
(5)ランダムアクセス反復子(Random Access Iterator)
(4)の機能
演算子 +, -, +=, -= による、反復子へのdifference_type型整数の加減算
演算子 - による、反復子どうしの減算
演算子 < による、反復子どうしの比較
演算子 [] による、任意位置の要素へのアクセス
ポインタ
ポインタはランダムアクセス反復子としての要件を満たしているので、
ポインタを、ランダムアクセス反復子と同様に扱うことが可能です。
コンテナによる反復子の種類
・vector<>, deque<>, string<> の反復子は、ランダムアクセス反復子
・list<>, set<>, multiset<>, map<>, multimap<> の反復子は、
双方向反復子です。
◆ 次の関数 func1 〜 func3 は、どれも仮引数に反復子を受け取りますが、全てのコンテナが全ての関数を利用できるとは限りません。
template
void func1(Iterator first, Iterator last) {
for (Iterator i = first; i != last; i++)
std::cout << *i << " ";
}
template
void func2(Iterator first, Iterator last) {
for (Iterator i = first; i != last; i++)
*i = 100;
}
template
void func3(Iterator first, Iterator last) {
cout << last - first;
}
func1 では、
演算子 ++ による反復子操作
* による参照
が行われます。したがって、(1),(3)〜(5)のタイプの反復子を受け取ることができます。
よって、ほとんど全てのコンテナが、この関数を利用できます。
func2 では、
演算子 ++ による反復子操作
* による代入
が行われます。したがって、(2)〜(5)のタイプの反復子を受け取ることができます。
よって、ほとんど全てのコンテナが、この関数を利用できます。
func3 では、
演算子 - による、反復子どうしの減算
が行われます。したがって、(5)のタイプの反復子のみを受け取ることができます。
よって、双方向反復子を持つ list<>, set<>, multiset<>, map<>, multimap<>
などが、この関数を利用することはできません。
この記事へのコメント
コメントを書く
この記事へのトラックバックURL
https://fanblogs.jp/tb/7345517
※ブログオーナーが承認したトラックバックのみ表示されます。
この記事へのトラックバック