以下常用算法,来自经典书籍<<STL源码解析>>。

一、数值算法,标准库的仿函数一般用在此处。

accumutate()累加、 inner_product()内积、 partial_sum()相加、 adjacent_difference()相差 ,这些算法只能用在数值上,所以头文件是<numeric>.

另外还有mismatch().

int main()
{//accumulate() inner_product() partial_sum() adjacent_difference()int ia[5] = { 1,2,3,4,5 };vector<int> iv(ia, ia+5);//数值算法 <numeric>//仿函数   <functional>//累加(默认仿函数plus)  支持可调用对象(仿函数:plus minus multiplies divides modulus negate)cout<< accumulate(iv.begin(), iv.end(), 10) << endl;                    //10+1+2+3+4+5  cout << accumulate(iv.begin(), iv.end(), 10, minus<int>());             //10-1-2-3-4-5//两个序列相乘的和(默认参数)cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10) << endl;   //10+1*1+2*2+3*3+4*4+5*5cout << inner_product(iv.begin(), iv.end(), iv.begin(), 10, minus<int>(), plus<int>()) << endl;   //10-1+1-2+2-3+3-4+4-5+5ostream_iterator<int> oiter(cout, " ");  //任意输入到此迭代器的都将输出到屏幕//等于前面数值相加//partial_sum(iv.begin(), iv.end(),iv.begin());             //1 3 6 10 15partial_sum(iv.begin(), iv.end(), oiter);                   //直接输出到屏幕partial_sum(iv.begin(), iv.end(), oiter,minus<int>());      //1 -1 -4 -8 -13cout << endl;//adjacent_difference() 与partial_sum() 互为逆运算//相邻元素的差 默认minus<>adjacent_difference(iv.begin(), iv.end(), oiter);              //1 1 1 1 1adjacent_difference(iv.begin(), iv.end(), oiter, plus<int>()); //1 2 3 7 9 相邻元素的和cout << endl;//mismatch equal int ia1[9] = { 1,2,3,4,5,6,7,8,9 };vector<int> iv1(ia1, ia1 + 5);vector<int> iv2(ia1, ia1 + 9);//比较两个序列第一个不匹配的点,返回pairauto p_pair = mismatch(iv1.begin(), iv1.end(), iv2.begin(), iv2.end());if (p_pair.first == iv1.end())cout << "iv2包含iv1" << endl;elsecout<<"iv1跟iv2 的第一个不同点在:"<< *(p_pair.first)<<endl;if (p_pair.second == iv2.end())cout << "iv1包含iv2" << endl;elsecout << "iv2跟iv1 的第一个不同点在iv2的元素:" << *(p_pair.second) << endl;}

二、fill、equal、advance、swap、lexicographical_compare、copy

int main()
{//equal返回bool  在[first,last)区间相等cout << equal(iv1.begin(), iv1.end(), iv2.begin()) << endl;  //1 iv2超长的部分不考虑,//第二个序列一定不能比第一个短,否则是未定义行为//所以要判断完全相等需要先判断队列长度cout << equal(iv1.begin(), iv1.end(), &ia1[3]) << endl;             //0cout << equal(iv1.begin(), iv1.end(), &ia1[3], less<int>()) << endl;//1 {1,2,3,4,5} 小于{3,4,5,6,7}//fillfill(iv1.begin(), iv1.end(), 9);fill_n(iv1.begin(), 3, 8);              //返回迭代器指向插入的下一个位置; 想想如果n超越了先有容器的大小会怎样fill_n(inserter(iv1,iv1.begin()), 8, 7);//是在头部插入8个7 ,这样就会自动扩容//for_eachfor_each(iv1.begin(), iv1.end(), [](int i) {cout << i << " "; });cout << endl;//advancevector<int>::iterator it1 = iv1.begin();vector<int>::iterator it2 = it1;advance(it2, 3);cout << *it2 << endl;//只对调元素 且只能通过迭代器 8 8 8 9 9 ->9 8 8 8 9  vector<int>::iterator it22 = iv2.begin();iter_swap(it1, it22);for_each(iv1.begin(), iv1.end(), [](int i) {cout << i << " "; });  //8 8 8 9 9 ->1 8 8 9 9cout << endl;for_each(iv2.begin(), iv2.end(), [](int i) {cout << i << " "; }); //1 2 3 4 5 6 7 8 9->9 2 3 4 5 6 7 8 9cout << endl;//值对调swap(*iv1.begin(), *iv2.begin());//对调序列 iv1 iv2对调,对调后原来的迭代器并不失效swap(iv1, iv2);for_each(iv1.begin(), iv1.end(), [](int i) {cout << i << " "; });  //1 8 8 9 9 -> 9 2 3 4 5 6 7 8 9cout << endl;for_each(iv2.begin(), iv2.end(), [](int i) {cout << i << " "; });  //9 2 3 4 5 6 7 8 9-> 1 8 8 9 9cout << endl;//字符串序列比较vector<string> start1{ "Jamie","JJHou","Jason" };vector<string> start2{ "Jamie","JJHou","Jeson" };cout << lexicographical_compare(start1.begin(), start1.end(), start2.begin(), start2.end()) << endl; //1  start1<start2cout << lexicographical_compare(start1.begin(), start1.end(), start2.begin(), start2.end(), greater<string>()) << endl; //0  start1 不大于 start2//只是获取两个数的最大\最小,而且只能作用于数值类型 ,用途不大;获取序列的最大、最小用途更广cout << max(*iv1.begin(), *iv2.begin()) << endl;cout << min(*iv1.begin(), *iv2.begin()) << endl;cout << "============================" << endl;//copy 为了效率 copy的实现相当复杂int ca[8] = { 0,1,2,3,4,5,6,7 };//注意这是目标起始位置,在输入数据中间,这种情况很可能会出问题,要慎用//这里之所以没出问题 (vector起始也不出问题),是因为copy内部的特殊处理,用memmove直接复制了输入的内存,//进行拷贝的,而如果用list 、deque等是一个元素一个元素的拷贝,就会出问题auto it =copy(ca + 2, ca + 6, ca + 3);  //0,1,2,2,3,4,5,7//这里换成deque就不是我们预期的结果//deque<int> de{ 0,1,2,3,4,5,6,7 };//auto it = copy(de.begin() + 2, de.begin() + 6, de.begin() + 3);  //0 1 2 2 2 2 2 7//所以copy()目标位置的开通不能在输入区间,但结尾可以在输入区间,copy_backward相反char cha[] = { 'a','b','c','d','e','f','g' };char cha2[8] = { 0 };copy_backward(cha, cha + 7, cha2+7); //a b c d e f gfor (auto i : cha2)printf("%c ", i);return 0;}

三、set中用到的并、交、差

set的运算和我们正常理解是一样的,multiset的运算稍微有点差异。

int ar1[] = { 1,3,5,7,9,11 };int ar2[] = { 1,1,2,3,5,8,13 };multiset<int> s1(ar1, ar1 + 6);multiset<int> s2(ar2, ar2 + 7);multiset<int>::iterator first1 = s1.begin();multiset<int>::iterator last1 = s1.end();multiset<int>::iterator first2 = s2.begin();multiset<int>::iterator last2 = s2.end();//并集cout << "Union of s1 and s2: ";set_union(first1, last1, first2, last2, ostream_iterator<int>(cout, " "));     //并集 出现在s1和s2 则以s1为准,cout << endl;                                                           因为元素不唯一,s1中出现n次,s2中出现m次,并后为max(n,m)//交集cout << "difference of s1 and s2: ";set_intersection(first1, last1, first2, last2, ostream_iterator<int>(cout, " "));cout << endl;//差集cout << "difference of s1 and s2: ";set_difference(first1, last1, first2, last2, ostream_iterator<int>(cout, " "));//差集不唯一的元素 min(n,m)cout << endl;//对称差集cout << "symmetric_difference of s1 and s2: ";  //对称差集,在s1中不在s2中,及在s2中不在s1中set_symmetric_difference(first1, last1, first2, last2, ostream_iterator<int>(cout, " ")); //abs(n-m)cout << endl;

c++ STL 算法一相关推荐

  1. Solr相似度算法一:Lucene TF-IDF 相关性算分公式

     Solr相似度算法一:Lucene TF-IDF 相关性算分公式 Lucene在进行关键词查询的时候,默认用TF-IDF算法来计算关键词和文档的相关性,用这个数据排序 TF:词频,IDF:逆向文 ...

  2. 深度学习AI美颜系列---AI美颜磨皮算法一

    深度学习AI美颜系列---AI美颜磨皮算法一 转自:https://blog.csdn.net/trent1985/article/details/80661230 首先说明一点,为什么本结内容是&q ...

  3. 图像算法一:【图像点运算】灰度直方图、伽马变换、灰度阈值变换、分段线性变换、直方图均衡化

    灰度直方图:imhist() %描述了图像灰度统计信息,主要应用于图像分割和图像灰度变换.>>Img=imread( ' xxx.jpg' ); %读图>>I=imhist(I ...

  4. 数据结构与算法一:时间频度和时间复杂度

    数据结构系列博客涉及内容: 一.初识数据结构和算法: 1.数据结构: 数据结构:是相互之间存在一种或多种关系的数据元素的集合 研究什么:数据的逻辑结构与物理结构以及它们之间的相互关系 数据结构包括:线 ...

  5. 大数据处理算法一:BitMap算法

     腾讯面试题:给20亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中并且所耗内存尽可能的少?  解析:bitmap算法就好办多了 所谓b ...

  6. Java算法一:汉诺塔

    Java算法一:汉诺塔(河内塔Towers of Hanoi) 问题说明: 汉诺塔:又称河內塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河內为 ...

  7. C++算法一:交换算法

    本博客主要素材是观看算法视频的个人笔记,内容有些粗率,当作算学习的记录,后续会不断完善,欢迎交流. 最基础的算法:交换(swap) 常见的的交换算法主要有以下几种: void swap(int x,i ...

  8. 机器学习降维算法一:PCA (Principal Component Analysis)

    引言: 机器学习领域中所谓的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中.降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达 ...

  9. 算法一(python)

    文章目录 二分查找 大O表示法 数组&链表 选择排序 递归 栈 递归调用栈 分而治之 快速排序 散列表 缓存 冲突 填装因子 良好的散列函数 广度优先搜索(breadth-first sear ...

最新文章

  1. Flutter中集成Font Awesome
  2. 《Linux内核设计与实现》读书笔记 第三章 进程管理
  3. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(Find/undo事件)
  4. 《HTML5+CSS3网页设计入门必读》——1.7 使用FTP传输文件
  5. Android实现仿美图秀秀给图片加框
  6. linux之通过htop操作进程使用总结
  7. LeetCode 1153. 字符串转化(哈希)
  8. VScode中编写运行C/html文件
  9. 在ASP.NET MVC中使用Knockout实践07,自定义验证信息的位置与内容
  10. PHP函数: set_time_limit
  11. ROS IntelRealSenseZR300 PCL+ORK+Linemod 柱状物体检测 机械臂抓取 系列第二篇
  12. 硬盘安装工具cgi_PE系统(U盘安装)
  13. r 语言计算欧氏距离_R语言-KNN算法
  14. 随机返回经典语句接口API
  15. java计算机毕业设计数字家谱管理系统设计与实现MyBatis+系统+LW文档+源码+调试部署
  16. Java核心技术 卷1 基础知识 学习笔记——第三章 java的基本程序设计结构
  17. H5-input弹起键盘遮盖输入框(Android)、键盘弹起后不恢复(IOS)
  18. “对不起,我们公司只招35岁以上的...”
  19. java之黑帽子逻辑题_一道逻辑推理题有2种帽子,黑的和
  20. China-Final2016K Justice Rains From Above

热门文章

  1. pip不是内部 pycharm_解决'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件的问题...
  2. flv.js php,flv.js的使用详解
  3. 价值投资如何判断市场是否高估
  4. python数据分析:会员数据化运营(中)——RMF分析
  5. bash: vi: command not found
  6. 关于抢红包的_面试官让我5分钟内写一个抢红包程序,我和他说了半小时原理!...
  7. (6) IFC构件与空间的关系 (Industry Foundation Class)
  8. CFML----一门在国外很多大公司得到应用的语言
  9. 多链路5G组网方案-支持国密算法的5G安全组网方案
  10. Android 中利用XPosed拦截系统消息