Java教程

泛型算法笔记

本文主要是介绍泛型算法笔记,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
  1. 泛型算法就是为了弥补 顺序容器中的成员函数不多的缺点。定义了一组算法,可以实现多个不同的功能,同时可以适用于多个容器。这些算法都定义在头文件 algorithm 中,numeric 文件中也定义了一组数值泛型算法。
  2. 泛型算法独立于容器。有的是依赖元素类型的操作的。比如,需要find函数需要有 == 运算符。其他算法可能要求元素类型支持 < 运算符。不过多数也支持通过函数的方式来传入比较规则。
  3. 泛型算法分类:
    • 只读算法:常见的有
      • find,用来返回第一个等于给定元素的迭代器。否则给定最后的迭代器。
      • find_if ,除了迭代器外,还需要给出一个 谓词,可以使用lambda来提供。返回第一个调用谓词返回true的迭代器。
      • for_each函数也传入一个谓词,来对所有迭代器内的元素来执行谓词。
      • accumulate,定义在numeric中。用来求和。第三个参数为和的初始值。可以利用这个算法来将一个vector中的所有string连接起来。
      • equal函数,用来比较两个容器中的元素是不是各个相等。接受三个参数,假定第二个序列的长度 >= 第一个序列的长度。
    • 写入算法
      • 由于传入的都是迭代器,迭代器没办法去执行容器操作。因此没办法扩大容器的容量。我们写入的数据不应该超出容器的当前容量。
      • fill 函数可以在两个迭代器之间的元素设置为某一个值
      • fill_n 函数可以在迭代器指定的位置以及之后的n个元素设置为指定值。容易超出界限,未定义!如果这个迭代器是back_inserter(vec) 的结果,那么back_inserter迭代器可以作为迭代器使用,但是将其赋值总是可以将值插入到末尾。
      • copy函数可以完成元素的拷贝。
      • replace可以实现将一个序列中的某一个元素进行替代。replace_copy 可以将替代后的结果装到另外一个容器中去。
    • 重排元素算法
      • sort函数可以排列成员,其使用 < 运算符。
      • stable_sort 为稳定的排序。如果比较的结果相同,则位置不变。
      • unique可以将那些不重复的元素放在前面,返回不重复序列的后一个元素的迭代器。使用之前,应该先排好序。
    1. 定制操作:
      • 比如sort,可以传入一个 谓词作为参数,可以调用谓词来进行比较判断。
      • 定制操作依赖的其实就是 可调用对象。可调用对象包括有 函数,函数指针,重载了函数调用运算符的类,以及lambda表示式(可以理解为匿名内联函数)
      • lambda表达式的捕获列表中可以是局部变量的拷贝(在声明的时候就拷贝进去,后面值再改变也不改变了。如果局部变量不允许拷贝,那么就失败,必须用引用),也可以是局部变量的引用(随着后续的变化而变,有时是必须的。比如ostream对象)。
      • lambda可以使用隐式捕获,也就是让编译器再函数体中找不到变量的时候,自动取寻找。再捕获列表中写 & 表示默认引用捕获, 写 = 表示默认值捕获。也可以写上 隐式捕获规则符号之后再写上需要用不同的规则捕获的变量列表。例如,使用 = 表示默认值捕获,如果还想使用引用捕获的话,那么再加上变量列表,再前面需要加上&
      • lambda可以具有捕获局部变量的功能,这是一般的函数做不到的。如果函数真的想实现这样的功能的话,可以利用bind函数,在functional头文件里。bind函数可以实现将一个函数名作为参数,和可以调用这个函数的参数作为参数。返回另外一个可调用对像,可以将这个新可调用对象的参数用于参数到bind参数中的占位符中去。可以实现减少调用参数的目的。
      • bind函数还可以进行函数参数的顺序调整。可以起到神奇的效果。
  4. 迭代器再探究
    • 插入迭代器:
      • 其插入操作是调用的 容器的插入操作。其可以认为是容器的一个假身。看着像是迭代器。it = t操作会将值 t 进行插入(插入到哪里要看it是什么位置的插入迭代器)。 而 it++, it–, *it 操作都有定义,但是没有任何意义,仍然返回it
      • 包括三种, back_inserter(it = t 会调用push_back), front_inserter(push_front), inserter(insert(it, p)).
    • iostream 迭代器
      • 包括istream_iterator 和 ostream_iterator两种
      • 可以利用这种迭代器来完成读取流输入或者完成流输出的作用
      • 可以认为输入和输出的缓冲区可以看作某种类型的容器,因此可以使用迭代器
    • 反向迭代器
      • 其++ 和 – 的效果是相反的,其begin和end也是相反的。begin指向最后一个元素。end指向第一个元素之前的元素。
      • 将这个迭代器用于泛型算法,可以实现某种效果。比如find参数使用反向迭代器,可以起到反向查找的作用。
      • reverse_iterator 的base成员函数可以返回一个普通的迭代器。
  5. 泛型算法结构
    • 迭代器可以分为5类。分别为输入迭代器(只读,不写), 输出迭代器(只写,不读),前向迭代器(可读写,多遍扫描,只能递增), 双向迭代器(可读写,多遍扫描,可递增递减), 随机访问迭代器(支持全部迭代器操作)
    • 参数规范之类的不是很重要的东西
这篇关于泛型算法笔记的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!