パート 1 を読む必要はないと思いますが、念のためリンクを含めておきます 。
...イテレータのカテゴリがほぼそこにある(と思う)..さまざまなタイプのイテレータから利用可能な機能を示す簡単なオールインワンのテーブルを見つけるために周りを見回した..見つけられなかったので、私は'v stroustrup のテーブルを拡張して、次のようなものを含めようとしました: 範囲を複数回通過する機能など...何か見逃したり誤解したりした場合はお知らせください。..または、より良いテーブルがあれば
*1++はインクリメント間で (逆) 参照する必要があります
*n++は (逆) 参照せずに複数回インクリメントできます
*n_save範囲は複数回渡して保存/コピーすることができます
------------------------------------------------------------------------------
- Iterator Operations and Categories
------------------------------------------------------------------------------
Category: output input forward bidirectional random-access
Abbreviation: Out In For Bi Ran
------------------------------------------------------------------------------
Read(*1++): =*p
Read(*n++): =*p =*p =*p
Read(*n_save): =*p =*p =*p
Write(*1++): *p=
Write(*n++): *p= *p= *p=
Write(*n_save): *p= *p= *p=
Access: -> -> -> ->[]
Iteration: ++ ++ ++ ++-- ++ -- + - += -=
Comparison: == != == != == != == != < > >= <=
------------------------------------------------------------------------------
Write(*n_save) ... iter のコピー/保存が読み取りか書き込みかわからなかったので、両方に追加しましたか? ..範囲を複数回読み取り渡すことができるかどうかを推測しています..範囲を複数回書き込み渡すこともできますか?
std::search が前方反復子を必要とする理由を理解しましたが、なぜ 4 が必要なのかわかりません.. 2 For & 2 In十分でしょうか?
while ( begin != end ) {
if( begin2 == end2 ) { return found ; }
}
.. endとend2が複数回参照されているためですか( while ループするたびに)..?
template <class For, class In>
For search( For begin, In end, For begin2, In end2 )
{
For found ;
For pattern_begin = begin2 ; //refd
int flag = 0 ;
// search content for pattern
while ( begin != end ) { //refd
if ( *begin != *begin2 ) { //de-refd
begin2 = pattern_begin ; //store/copy
flag = 0 ;
begin++ ; //inc
} else {
if ( flag == 0 ) {
found = begin ;
flag = 1 ;
}
begin++ ;
begin2++ ;
}
if( begin2 == end2 ) { return found ; } //refd
}
return begin ;
}