加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – STL算法如何独立于迭代器类型工作?

发布时间:2020-12-16 06:47:28 所属栏目:百科 来源:网络整理
导读:STL算法如何独立于Iterator类型工作? 解决方法 真的,他们只是工作.它们使用模板的一些非常基本的属性,有时称为静态多态.如果你熟悉这个术语,它实质上是一种形式的鸭子. (如果它看起来像一只鸭子,它像鸭子一样嘎嘎叫,它一定是鸭子) 诀窍很简单.这是一个非常
STL算法如何独立于Iterator类型工作?

解决方法

真的,他们只是工作.它们使用模板的一些非常基本的属性,有时称为静态多态.如果你熟悉这个术语,它实质上是一种形式的鸭子. (如果它看起来像一只鸭子,它像鸭子一样嘎嘎叫,它一定是鸭子)

诀窍很简单.这是一个非常简单的例子:

template <typename T>
void say_hello(const T& t) {
  t.hello();
}

say_hello函数不关心其参数是哪种类型.它不必从接口派生出来,也不必做任何其他类型的“承诺”.重要的是该类型在此上下文中起作用.我们所做的所有类型都是调用它的hello函数.这意味着此代码将针对具有hello成员函数的任何类型进行编译.

STL算法的工作方式类似.这是std :: for_each的简单实现:

template <typename iter_type,typename func_type>
void for_each(iter_type first,iter_type last,func_type f){
  for (iter_type cur = first; cur != last; ++cur) {
    f(*cur);
  }
}

只要模板类型符合它们的要求,此代码就会编译; iter_type必须具有pre-increment -operator.它必须有一个复制构造函数,它必须有!=运算符,并且必须有* -dereference-operator.

func_type必须实现函数调用运算符,通过取消引用类型为iter_type的对象获取与您获得的相同类型的参数.如果我用满足这些要求的类型调用for_each,代码将编译. iter_type可以是满足这些要求的任何类型.代码中没有任何内容表示“这应该适用于矢量迭代器和列表迭代器以及映射迭代器”.但只要向量,列表或映射迭代器实现我们使用的运算符,它就可以工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读