标准库提供一组不依赖特定的容器类型的共性算法

  • 指定迭代器范围, eg. [begin, end)这种左闭包
  • 3种类型: 只读、写、sort

1. find 查询

template<class InIt, class T>
InIt find(InIt first, InIt last, const T& val);

查询迭代器指定范围[first, last)范围内是否有val值。如果有,则返回该值对应的迭代器;否则,返回last表示查找失败

eg. 结果为"42 a value -858993460"

int val = 42;
vector<int> vec = {2, 42};
auto result = find(vec.cbegin(), vec.cend(), val);
cout << " " << *result;string strVal = "a value";
list<string> lst = { "a value", "xxx", "yyy" };
auto result3 = find(lst.cbegin(), lst.cend(), strVal);
cout << " " << *result3;int ia[] = { 32, 3 };
auto result2 = find(begin(ia), end(ia), val);
cout << " " << *result2;

2. accumulate 对范围求和 (numeric.h)

template<class InIt, class T>
T accumulate(InIt first, InIt last, T val);
template<class InIt, class T, class Pred>
T accumulate(InIt first, InIt last, T val, Pred pr);

累加迭代器指定范围[first, last)范围内所有元素,再加上累加的初值val,返回累加的结果。第二个函数自定义操作:val = pr(val, *it)。
注:用于指定累加起始值的第三个参数是必要的,因为算法对将要累加的元素类型一无所知,没有别的办法创建合适的起始值或者关联的类型。

eg. 结果为"6 a valuexxxyyy 45"

vector<int> vec1 = { 1,2,3 };
int result = accumulate(vec1.begin(), vec1.end(), 0);
cout << " " << result;list<string> lst = { "a value", "xxx", "yyy" };
string result2 = accumulate(lst.cbegin(), lst.cend(), string(""));
cout << " " << result2;std::array<int, 10> ia = { 1,2,3,4,5,6,7,8,9,0 };
auto result3 = accumulate(ia.cbegin(), ia.cend(), 0);
cout << " " << result3;

3. find_first_of算法

template<class FwdIt1, class FwdIt2>
FwdIt1 find_first_of(FwdIt1 first1, FwdIt1 last1, FwdIt2 first2, FwdIt2 last2);
template<class FwdIt1, class FwdIt2, class Pred>
FwdIt1 find_first_of(FwdIt1 first1, FwdIt1 last1, FwdIt2 first2, FwdIt2 last2, Pred pr);

查询第一段范围内与第二段范围内任意元素匹配的元素的位置。如果找到,返回该元素对应的迭代器;否则,返回last1。第二个函数使用判断:pr(*it1, *it2)来代替第一个函数中的判断:*it1 == *it2。

eg. 输出为"not found"

     vector<int> vec = { 2, 42 };int ia[] = { 32, 3 };auto result = find_first_of(vec.cbegin(), vec.cend(), begin(ia), end(ia));if(result == vec.end())cout << "not found ";elsecout << " " << *result;

4. equal

equal:判断给定两个区间是否相等。假定第二个序列至少与第一个序列一样长 (algorithm.h)
eg.

bool bIsEqual = equal(v1.cbegin(), v1.cend(), v2.cbegin());
bool bIsEqual = equal(v1.cbegin(), v1.cend(), v2.cbegin(), vc2.cend());

并不要求两个容器的元素类型相同,只要能使用比较运算符==就可以了。比如
eg. 输出为"1"

     list<string> lst = { "a value", "xxx", "yyy" }; vector<const char*> vec = { "a value", "xxx", "yyy" };  auto result = equal(vec.cbegin(), vec.cend(), lst.cbegin(), lst.cend());cout << " " << result;

5. count

查找个数

eg.输出为2:

     vector<int> v2 = { 4,5,6,7,8,9,4 }; auto result = count(v2.cbegin(), v2.cend(), 4);cout << " " << result;

【引用】

  1. 代码 https://github.com/thefistlei/cplusprimer/blob/main/cprimer/cprimer/genericAlgorithm.h

C++ Primer 5th笔记(10)chapter10 泛型算法 : read相关推荐

  1. C++ Primer 学习笔记 第十章 泛型算法

    C++ Primer 学习笔记 第十章 泛型算法 336 find函数 #include <iostream> #include <vector> #include <s ...

  2. C++ Primer 5th笔记(10)chapter10 泛型算法 :泛型算法结构

    名称 定义 输入迭代器 只读,不写:单遍扫描,只能递增 输出迭代器 只写,不读:单遍扫描,只能递增 前向迭代器 可读写,多遍扫描,只能递增 双向迭代器 可读写,多遍扫描,可递增递减 随机访问迭代器 可 ...

  3. C++ Primer 5th笔记(10)chapter10 泛型算法 :迭代器

    迭代器类别 名称 定义 插入迭代器 这些迭代器被绑定到一个容器上,可用来向容器插入元素 流迭代器 这些迭代器被绑定到输入或输出流上,可用来遍历所有关联的IO流 反向迭代器 这些迭代器向后而不是向前移动 ...

  4. C++primer第十章 泛型算法 10.4 再探迭代器 10.5 泛型算法结构

    除了为每个容器定义的迭代器之外,标准库在头文件iterator中还定义了额外几种迭代器.这些迭代器包括以下几种. 插入迭代器(insert iterator):这些迭代器被绑定到一个容器上,可用来向容 ...

  5. C++ primer 第10章 泛型算法

    文章目录 概述 find count 初识泛型算法 只读算法 只读算法accumulate 只读算法equal 写容器元素的算法 算法fill 算法fill_n back_inserter 算法cop ...

  6. C++ Primer 5th笔记(chap 14 重载运算和类型转换)函数调用运算符

    1. 定义 如果类定义了调用运算符(重载了函数调用运算符),则该类的对象被称作函数对象(function object),可以像使用函数一样使用该类的对象, eg. struct absInt{int ...

  7. C++ Primer 5th笔记(10)chapter10 泛型算法 :write

    1. fill: 对给定区间全部赋予某值(algorithm.h) 将指定范围内的每个元素都设定为给定的值.如果输入范围有效,则可以安全写入.这个算法只会对输入范围内已存在的元素进行写入操作. tem ...

  8. C++ Primer 5th笔记(10)chapter10 泛型算法 :谓词

    1. 定义 谓词(predicate)是一个可调用的表达式,返回结果是一个能用作条件的值. 用于一个对象或一个表达式,如果可以对其使用调用运算符,则称为可调用的: 可调用的对象有:函数.函数指针.重载 ...

  9. C++ Primer 5th笔记(10)chapter10 泛型算法 :bind

    1. 定义 一个函数适配器,接受一个函数调用,增加或更改参数传递给另外一个函数调用. 比如 auto newCallable=bind(callable, arg_list); newCallable ...

最新文章

  1. 李开复:谈谈那些你不知道的人工智能!
  2. 敏捷个人实践第18次活动:选择朋友
  3. PHP随机字符串生成器
  4. 省市区三级联动 数据精确到乡镇一级
  5. Scrum之 站立例会
  6. 科大星云诗社动态20210303
  7. 第四天:规划范围管理
  8. SGID,SUID,SBIT
  9. 性能优化(6):为什么一定要将css置顶?
  10. python-字典-定义-增删改取
  11. hadoop源码研究 编译错误记录
  12. 机器学习.周志华《15 规则学习 》
  13. 无线渗透(下)—企业级WPA破解
  14. 如何下载网吧电影服务器上的电影
  15. 我想知道怎么提升csgo枪法
  16. (二)ROS中控制机器人运动(示例运行)
  17. 计算机设备列表在哪打开,Win7设备管理器在哪里打开?
  18. C#textbox控件区分扫码枪输入和键盘输入
  19. element ui 弹窗遮罩层在弹出层的上面。点击关闭弹窗弹窗关闭了但是遮罩层没关
  20. 深度|SHEIN:长期主义的胜利

热门文章

  1. 第九届蓝桥杯java B组—第六题递增三元组(详细介绍)
  2. timestamp mysql php_PHP和Mysql的Timestamp互换
  3. mysql 实时聚合分析_mysql滑动聚合/年初至今聚合原理与用法实例分析
  4. mysql innodb 锁_MySQL/InnoDB锁机制
  5. coco关键点标注json_COCO 数据集中目标检测标注说明
  6. 数据中心运维管理社区祝大家新春快乐,虎年大吉!
  7. 三分钟掌握数据中心“容灾和备份的区别”
  8. 成功解决Exception “unhandled ModuleNotFoundError“No module named ‘sklearn.neighbors.classification‘
  9. 成功解决ValueError: cannot convert float NaN to integer
  10. Python语言学习之字母R开头函数使用集锦:random/range/replace/reshape用法之详细攻略