只读算法
2023年12月23日 2023年12月24日
不需要对元素执行写操作. 获取迭代器时, 使用常量版本: cbegin和cend
计算给定序列元素的和
accumulate
给出序列的所有元素, 使用迭代器范围: [b, e)
val为和的初值
使用元素类型的加法运算符
1accumulate(b, e, val);
头文件
1#include <numeric>
示例
求vec中所有元素之和
1int sum = accumulate(vec.cbegin(). vec.cend(), 0);
第三个参数
- 和元素类型一致, 或者元素类型能转换为第三个参数类型
- 与返回类型一致
- 决定了加法运算符的重载版本
1// 此时使用string的+重载版本,进行字符串连接 2 3string sum = accumulate(v.cbegin(), v.cend(), string("")); 4 5string sum2 = accumulate(v.cbegin(), v.cend(), ""); // 错误:const char *没有定义加法运算符
判断两个序列中的元素是否一致
equal
如果第一个序列的每一个元素都与第二个序列对应位置的元素相等, 返回true; 否则返回false
给出第一个序列的所有元素, 使用迭代器范围: [b, e)
给出指向第二个序列首元素的迭代器
equal假定第二个序列长度不小于第一个序列
所有接受单一迭代器来表示第二个序列的算法, 都假定第二个序列的长度不小于第一个序列. 由程序员保证
两个序列的元素类型不必一致, 只要重载了这两个类型的相等运算符 ==
即可. equal使用迭代器遍历元素, 因此可以实现两个不同类型容器元素的比较
1equal(b, e, start);
头文件
1#include <algorithm>
示例
roster1可以是vector<string>,roster2可以是list<const char*>
1equal(roster1.cbegin(), roster1.cend(), roster2.cbegin());