【问题标题】:Passing iterator as an argument将迭代器作为参数传递
【发布时间】:2019-03-05 01:26:49
【问题描述】:

我正在尝试编写一个可以接受任何迭代器作为参数的模板函数。

例如,我应该能够通过这个函数传递所有类型的数组、列表、向量。

我正在考虑编写如下函数:

enter template<typename T1, T2>
int proof(T1<T2>::iterator& it, T1<T2>::iterator& itt){

return distance(it, itt);
}

其中 T1 应该是容器类型,T2 应该是算术类型。

理想情况下,我希望使用此函数传递一个数组和向量。

任何帮助,将不胜感激。

【问题讨论】:

  • 直接使用std::distance。如果你想编写自己的算法,那就从 STL 代码中汲取灵感。
  • 一旦概念实现,这将是一个很好的解决方案

标签: c++ templates iterator


【解决方案1】:

这是一个好主意,但容易失败——例如,考虑一下vector 有一个默认的Allocator 模板参数,您很少指定自己,但它始终存在。因此,您最简单的用例已经比预期的要复杂,谁知道其他容器可能会带来什么惊喜?

而是直接采用迭代器类型。如果函数中的代码与迭代器一起工作,那就太好了。如果不是,那么它将无法编译(或者您的用户违反了记录在案的前提条件)。如果它适用于您个人不称为“迭代器”的东西,那么这有关系吗?有效!

template <typename Iterator>
auto proof(const Iterator& it1, const Iterator& it2)
{
   return std::distance(it1, it2);
}

当然,我不建议编写这样的函数,除非它做的事情比委托给std::distance 更重要;一方面,您的返回类型错误。

【讨论】:

    【解决方案2】:

    要编写一个可以接受任何迭代器的模板,只需接受任何类型:

    template<class It>
    int proof(const It&, const It&)
    

    另一方面,您的模板只是将参数传递给std::distance,因此它似乎并没有真正增加任何价值。直接使用std::distance 可能会更好。

    【讨论】:

      猜你喜欢
      • 2013-12-13
      • 2011-04-28
      • 1970-01-01
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2017-07-17
      • 2021-11-28
      相关资源
      最近更新 更多