10 泛型算法
c++标准库容器本身的函数很少, 相反c++提供了一组算法, 这些算法可以(通过操作迭代器来)处理容器(比如查找元素, 排序, 等).
这些算法可以用于不同的容器和不同类型的元素, 所以它们是"通用的(generic)"或称"泛型的".
这些算法被称为"泛型算法".
10.1 概述
大多数算法定义在头文件algorithm中, 使用它们之前要#include
另外头文件numeric中还定义了一组数值泛型算法.
算法并不直接操作容器, 而是遍历(由两个迭代器指定的)元素范围. 比如:
#include <algorithm>
auto result = std::find(vec.cbegin(), vec.cend(), val);
由于算法操作迭代器, 而不操作容器, 所以算法不依赖于容器.
由于算法要操作容器中的元素, 所以算法依赖于元素类型允许的操作.
算法永远不会执行容器的操作, 它只会运行于迭代器之上.
带来一个编程假定: 算法不会改变底层容器的大小.
10.2 初识泛型算法
标准库提供了超过100种算法, 这些算法有一致的结构.
大部分算法都对一个范围内的元素进行操作, 这个范围称为"输入范围".
这类算法总是使用前两个参数来表示此范围.
10.2.1 只读算法
只读取输入范围内的元素, 而不改变元素. 比如find, count, accumulate(定义在头文件numeric中).
只读算法的前两个参数最好使用cbegin()和cend().
accumulate执行累加操作, 第三个参数是初始值, 它的类型决定了使用哪个加法运算符以及返回值的类型.
比如要对string类型的元素累加, 则第三个参数类型必须是string, 不能是字符串直接量.
equal算法用于确定两个序列是否保存相同的值, 特殊之处在于它操作两个序列.
equal(roster1.cbegin(), roster1.cend(), roster2.cbegin());
第三个参数是第二个序列的首元素.
注意: equal比较的元素不必完全一样, 比如roster1是 vector
注意: equal假定第二个序列至少与第一个序列一样长.
注意: 如果第二个序列比较短, 返回false
[待续]
标签:10,容器,元素,序列,算法,泛型,操作 来源: https://www.cnblogs.com/gaiqingfeng/p/16463242.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。