六一的部落格


关关难过关关过,前路漫漫亦灿灿。



不需要对元素执行写操作. 获取迭代器时, 使用常量版本: cbegin和cend


计算给定序列元素的和

accumulate

给出序列的所有元素, 使用迭代器范围: [b, e)

val为和的初值

使用元素类型的加法运算符

1accumulate(b, e, val);

头文件

1#include <numeric>

示例

求vec中所有元素之和

1int sum = accumulate(vec.cbegin(). vec.cend(), 0);

第三个参数

  1. 和元素类型一致, 或者元素类型能转换为第三个参数类型
  2. 与返回类型一致
  3. 决定了加法运算符的重载版本
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());

只读算法


不需要对元素执行写操作. 获取迭代器时, 使用常量版本: cbegin和cend


计算给定序列元素的和

accumulate

给出序列的所有元素, 使用迭代器范围: [b, e)

val为和的初值

使用元素类型的加法运算符

1accumulate(b, e, val);

头文件

1#include <numeric>

示例

求vec中所有元素之和

1int sum = accumulate(vec.cbegin(). vec.cend(), 0);

第三个参数

  1. 和元素类型一致, 或者元素类型能转换为第三个参数类型
  2. 与返回类型一致
  3. 决定了加法运算符的重载版本
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());