【问题标题】:Can a raw pointer be passed to a template function expecting an iterator?可以将原始指针传递给需要迭代器的模板函数吗?
【发布时间】:2013-03-21 02:41:47
【问题描述】:

可以将原始指针传递给需要迭代器的模板函数吗?我是否认为迭代器只是一个覆盖与指针相关的运算符(例如 *、++ 等)的类,或者迭代器是否公开了指针没有的任何附加接口?换句话说,指针“看起来像”迭代器吗?

例子:

我想使用boost::algorithm::knuth_morris_pratt_search (documentation here)。

我的语料库(要搜索的字符串)和模式(要查找的字符串)只是内存中的字节 - 我有一个包含起始地址和字节长度的指针。为了论证起见,假设它是一个 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);

【问题讨论】:

  • 看起来不错,你试一试了吗?
  • @user814628 还没有。我本可以尝试一下,但这并不能证明它在一般意义上有效,只能证明它适用于我的测试。例如,我以后可能会尝试在失败的情况下做同样的事情。

标签: c++ pointers iterator


【解决方案1】:

我认为迭代器只是一个覆盖与指针相关的运算符(例如*、++等)的类是否正确,

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

我手头没有关于随机访问迭代器的完整参考标准,但请参阅例如here;此外,here 是一个很好的图表,其中包含各种“类型”的迭代器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    相关资源
    最近更新 更多