本文主要是介绍第十章 泛型算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
- 标准库并未给每个容器都定义成员函数来实现查找特定元素、替换或删除一个特定值、重排元素顺序等操作,而是定义了一组泛型算法( generic algorithm ):称它们为“算法”,是因为它们实现了一些经典算法的公共接口,如排序和搜索;称它们是“泛型的”,是因为它们可以用于不同类型的元素和多种容器类型。
- 对于只读取而不改变元素的算法,通常最好使用 cbegin()和 cend()。但是如果你计划使用算法返回的迭代器来改变元素的值,就需要使用 begin()和 end()算法的结果作为参数。
- 那些只接受一个单一迭代器来表示第二个序列的算法,都假定第二个序列至少与第一个序列一样长。
- 标准库算法对迭代器而不是容器进行操作。因此,算法不能(直接)添加或删除元素。
- 算法不改变容器大小的原因:为了使得算法能够独立于容器,真正成为泛型算法。
- 如果函数体只是一个 return 语句,则返回类型从返回的表达式的类型推断而来;如果 lambda 的函数体包含任何单一 return 语句之外的内容,且未指定返回类型,则返回 void 。
- 一个 lambda 可以直接使用定义在当前函数之外的名字。捕获列表只用于局部非 static 变量, lambda 可以直接使用局部 static 变量。
- 与参数不同,被捕获的变量的值是在 lambda 创建时拷贝,而不是调用时拷贝。由于被捕获的变量的值是在 lambda 创建时拷贝,因此随后对其修改不会影响到 lambda 内对应的值。
- 当以引用方式捕获一个变量时,必须保证在 lambda 执行时变量是存在的。
- 我们也可以从一个函数返回 lambda 。如果函数返回一个 lambda ,则与函数不能返回一个局部变量的引用类似,此 lambda 也不能包含引用捕获。
- 一般来说,我们应该尽量减少 lambda 捕获的数据量,来避免潜在的捕获导致的问题。而且,如果可能的话,应该避免捕获指针或引用。
- 只有在容器支持 push_front 的情况下,我们才可以使用 front_inserter 。类似的,只有在容器支持 push_back 的情况下,我们才能使用 back_inserter 。
- *it , ++it , it++ 这些操作虽然存在,但不会对 it 做任何事情。每个操作都返回 it 。(其中 it 是插入迭代器)
- 对于反向迭代器,递增(以及递减)操作的含义会颠倒过来。
- 流迭代器不支持递减运算,因为不可能在一个流中反向移动。因此,不可能从一个 forward_list 或一个流迭代器创建反向迭代器。
- 对于向一个算法传递错误类别的迭代器的问题,很多编译器不会给出任何警告或提示。
- 对于 list 和 forward_list ,应该优先使用成员函数版本的算法而不是通用版本的算法,通用版本可以用于链表,但是代价太高。这些算法需要交换输入序列中的元素。但一个链表可以通过改变元素间的链接而不是真的“交换”元素。
- 根据支持的操作不同,迭代器可分为五类:输入、输出、前向、双向以及随机访问迭代器。
- 谓词( predicate ),返回可以转换为 bool 类型的值得函数。
- 插入迭代器、流迭代器、反向迭代器、移动迭代器。
这篇关于第十章 泛型算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!