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