繁体   English   中英

STL算法如何独立于Iterator类型工作?

[英]How does STL algorithm work independent of Iterator type?

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必须有预增量++ - 运算符。 它必须有一个复制构造函数,它必须有!=运算符,并且必须有* -dereference-operator。

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

STL算法是模板函数,这意味着可以使用任何类型调用它们。

当使用特定类型调用函数时,编译器将尝试为此特定类型编译函数的实例并报告任何编译错误(缺少方法,键入检查错误等)

对于STL算法,只要使用的类型行为类似于迭代器(支持++,解除引用),它就可以工作。 这就是为什么这些算法也适用于本机指针的原因,因为它们支持与迭代器相同类型的操作(这就是它们首先设计的方式)。

编译器会为您使用的每个迭代器类型自动生成任何STL算法。

它被称为C ++模板或静态多态。

每个STL算法都是一个模板函数,它将迭代器类型作为模板参数。

并非所有STL容器/迭代器算法都具有此独立性。 那些做的是调用通用算法,但这些通常只称为STL算法。

只使用迭代器,您可以:

  • 检查序列,这样你就可以做find,count,for_each,...
  • 更改迭代器引用的值,以便您可以执行转换,复制,旋转,交换,替换等操作...
  • 重新排序迭代器的值,因此您可以执行sort,merger和nth_element之类的操作。

一些非通用算法可以分为两个阶段,STL通用部分和容器依赖部分。 因此,为了在向量中销毁大于7的所有值,我们可以执行remove_if(仅对元素进行排序的通用部分),然后执行擦除(销毁该值的非通用部分)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM