可以将原始指针传递给需要迭代器的模板函数吗?

Can a raw pointer be passed to a template function expecting an iterator?

本文关键字:迭代器 函数 原始 指针      更新时间:2023-10-16

原始指针可以传递给期望迭代器的模板函数吗?我认为迭代器只是一个覆盖指针相关操作符(例如*,++等)的类,还是迭代器暴露了指针没有的任何额外接口?换句话说,指针"看起来像"迭代器吗?

的例子:

我想使用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);

我是否认为迭代器只是一个覆盖指针相关操作符(例如*,++等)的类,

你是正确的;指向存储在数组中的数据的指针符合随机访问迭代器的要求,即最"完整"的迭代器类型,因此基本上可以在任何标准库算法中使用它们。

我手头没有关于随机访问迭代器的完整参考标准,但可以参见这里;此外,这里有一个很好的图表,其中包含了迭代器的各种"类型"。