4

イテレータを期待するテンプレート関数に生のポインタを渡すことはできますか? イテレータは、ポインター関連の演算子 (*、++ など) をオーバーライドする単なるクラスであると考えるのは正しいでしょうか?それとも、イテレーターはポインターにはない追加のインターフェイスを公開しますか? 別の言い方をすれば、ポインターはイテレーターに「似ている」のでしょうか?

例:

使用したいboost::algorithm::knuth_morris_pratt_search(ドキュメントはこちら)。

私のコーパス (検索対象の文字列) とパターン (検索対象の文字列) はメモリ内の単なるバイトです。開始アドレスとバイト単位の長さを含むポインターがあります。議論のために、これが C スタイルの文字列であるとしましょう。

ドキュメントによると、このknuth_morris_pratt_search関数では、コーパスとパターンの両方の開始イテレータと終了イテレータを渡す必要があります。

使いたい機能:

template <typename patIter, typename corpusIter>
corpusIter knuth_morris_pratt_search (
        corpusIter corpus_first, corpusIter corpus_last,
        patIter pat_first, patIter pat_last );

これはできますか?

// Assume these are initialized:
char* c;
int cLength;
char* p;
int pLength;

char* result = knuth_morris_pratt_search<char*, char*>
   (c, c + cLength, p, p + pLength);
4

1 に答える 1

5

イテレータは、ポインタ関連の演算子 (*、++ など) をオーバーライドする単なるクラスであると考えるのは正しいですか?

あなたは正しいです; 配列に格納されたデータへのポインターは、ランダム アクセス反復子、つまり最も「完全な」反復子型の要件に一致するため、実質的にすべての標準ライブラリ アルゴリズムで使用できます。

ランダムアクセス反復子に関する完全なリファレンスの標準は手元にありませんが、たとえばここを参照してください。また、イテレータのさまざまな「タイプ」を示す素敵な図を次に示します

于 2013-03-21T02:44:06.217 に答える