C++11标准中常用到的各种算法汇总.
在C++11标准中定义了很多算法,这些算法可以让我们很方便的操作各种容器和数组,这里要注意一下,这些算法操作的并非容器,而是迭代器,然后通过迭代器来操作容器中的数据,算法本身并不会关注容器中保存的数据的类型。
以下是我对常识的算法的总结,这些算法大部分都在algorithm.h中,还有一些在numeric.h中。
这里我们的容器都用这几个:
vector<string> vec;
vector<int> vec1;
vec<string> vec2;
1.find();
find()算法的作用是在指定的一段序列中查找某个数,包含三个参数,前两个参数是表示元素范围的迭代器,第三个参数是要查找的值。
例:fing(vec.begin(), vec.end(), val); //在vec中查找值val,该val可以是数字、字符串。
2.count();
count()算法的作用是查看给定序列中给定值出现的次数,同样包含三个参数,前两个参数是表示元素范围的迭代器,第三个参数是要查找的值。
例:count(vec1.begin(), vec1.end(), 2);//在vec1中查看2出现的次数。
3.accumulate();//该函数在numeric.h文件中
accumulate()函数的作用是计算指定范围中各个数相加的和。包含三个参数,前两个参数是求和的序列范围,第三个参数是和的初始值。
例:accumulate(vec1.begin(), vec1.end(), 0);//计算vec1中各个数相加的总和,和的初始值为0;
4.equal();
equal()算法的作用是确定两个序列是否保存相同的值,此算法接受三个迭代器,前两个迭代器表示第一个序列中元素的范围,第三个迭代器表示第二个序列的手元素。如果相等,则返回true, 否则返回false;
equal(vec.begin(), vec.end(), vec2.begin());//比较vec和vec2中的元素是否相同。
5.fill();
fill()算法的作用是对一个范围内的所有元素赋值,包含三个参数,前两个参数接受一对迭代器表示一个范围,第三个迭代器接受一个值。
例:fill(vec.begin(), vec.end(), "");//将vec中的所有元素都置为空。
6.fill_n();
fill_n算法的作用是将给定值赋给迭代器指向的元素开始的指定个元素。第一个参数接受一个迭代器,第二个元素接受一个计数值,第三个迭代器接受一个值。
例:fill_n(vec.begin(), vec.size(), "");//将vec中的所有元素置为空。
注:这里介绍一下back_inserter,它是一种插入迭代器,是一种向容器中添加元素的迭代器,它定义在iterator.h中,每调用一次back_inserter,函数则会调用一 次push_back。
例:auto i = back_inseter(vec1);//通过它赋值会将元素添加到vec中
*i = 42;//vec1中现有有一个元素,值为42
这里back_inserter常用来创建一个迭代器作为算法的目的位置来使用。
例:fill_n(back_inserter(vec1), 10, 0);//向vec1的末尾添加10个元素,元素值为0;
7.copy();
copy()算法将输入范围中的元素拷贝到目的序列中。包括三个参数,前两个表示一个输入范围,第三个表示序列的起始位置。
例:int a1[] = {0,1,2,3,4,5,6,7,8,9};
int a2[sizeof(a1)/sizeof(*a1)];
//ret指向拷贝到a2的为元素之后的位置
auto ret = copy(begin(a1), end(a1), a2);//把a1的内容拷贝到a2.
8.replace();
replace()算法的作用是将给定序列中所有等会给定值的元素都改为另一个值,此算法接收四个参数,前两个是迭代器,表示输入序列范围,第三个是表示要搜索的 值,第四个是要换的新值。
例:replace(vec.begin(), vec.end(), "", "test");//将vec中的空字符串改为test。
如果我们需要保证原序列的值不变,则可以使用replace_copy()算法,使原序列不变,将改变后的序列值拷贝给新容器。
例:replace_copy(vec.begin(), vec.end(),back_inserter(vec2), "", "test");//将修改后的新序列保存到vec2中,原序列值不变。
9.sort();
sort()算法的作用是重新排列输入的序列中的元素,它是按照字典序列来重新排布序列。
例:vector<string> vec = {"the", "quick", "red", "for", "jump","over", "the", "slow", "red", "turtle"};
sort(vec.begin(), vec.end());
执行完后的结果:for jump over quick red slow the the turtle
10.unique();
unique()算法的作用是重新排列输入的序列号,并使前面的每个单词都只出现一次,返回指向不重复区域之后一个位置的迭代器。
如9的vec,auto end_unique = unique(vec.begin(), vec.end());
执行完后的结果:for jump over quick red slow the turtle the
这是如果我们需要得到一个不重复的序列,则只需要使用erase()即可,即
vec.erase(end_unique, vec.end());
执行完后的结果:for jump over quick red slow the turtle
注:为了讲后面的算法,这里先普及一下谓词,这里所谓的谓词并不是语言语法上的谓词,而是向算法传递的函数名。
例:bool isShort(const string &s1, const string &s2)
{ return s1.size() < s2.size(); }
前面的sort()算法也是可以接收谓词的,如sort(vec.begin(), vec.end(), isShort);
该语句的意思是重新排列序列,但是是按照字符串的长度从小到大的顺序排列。
11.partiton();
partition()算法的作用是对输入的容器的内容进行划分,该算法返回一个迭代器,返回指向最后一个是谓词为true的元素之后的位置。接受三个
参数,前两个是元素的范围迭代器,后一个是划分标准。
例:bool bigger(const string &a)
{ return a.size() > 5; }
partition(vec.begin(), vec.end(), bigger);//将vec划分开,前部分是长度大于5的字符串,后部分是长度小于等于5的字符串。
注:这样再讲一下可调用对象lambda,格式[capture list](parameter list)->reture type{function boby}
其中capture list(捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空),reture type、parameter list、function boby和其他的函数一 样,分别表示返回类型、参数列表、函数体。像11中的例子可以写成:
partition(vec.begin(), vec.end(), [](const string &a) {return a.size()>5;});//可以和上面达到一样的效果
12.find_if();
find_if()算法的作用是在输入序列中查找第一个满足条件的元素,返回第一个指向满足条件的元素的迭代器。
例:auto wc = find_if(vec.begin(), vec.end(), [sz](const string &a){return a.size>=sz;});//其中sz为在使用find_if的函数内部定义的局部变量。
上诉算法得到的是第一个指向长度不小于sz的元素的迭代器,如果没有则返回vec.end();
13.for_each();
for_each()算法的主要作用是打印输出序列。接收三个参数,前两个为打印元素的范围,后一个为一个可调用对象。
例:for_each(wc, vec.end(), [](const string &s){cout << s << " ";});
cout << endl;
上述程序的作用就是打印输出序列中从wc到vec.end()中的元素。
C++11标准中常用到的各种算法汇总.的更多相关文章
- iOS中 常用的mac终端指令汇总 技术分享
通常情况下,只有高端用户才会经常用到终端应用.这并不意味着命令行非常难学,有的时候命令行可以轻松.快速的解决问题.相信所有Mac用户都尝试过命令行,今天为大家带来9个非常实用的命令行操作.一些命令行需 ...
- Linux内核中常用的数据结构和算法(转)
知乎链接:https://zhuanlan.zhihu.com/p/58087261 Linux内核代码中广泛使用了数据结构和算法,其中最常用的两个是链表和红黑树. 链表 Linux内核代码大量使用了 ...
- 面试中常用的六种排序算法及其Java实现
常见排序算法的时间复杂度以及稳定性: 1 public class Sort { public static void main(String[] args){ int[] nums=new int[ ...
- Java 中常见的各种排序算法汇总
首先,Java中自已是有排序的 说明:(1)Arrays类中的sort()使用的是“经过调优的快速排序法”;(2)比如int[],double[],char[]等基数据类型的数组,Arrays类之只是 ...
- C++中常用的std标准容器
从c++11标准以来,c++中std定义的几种容器的效率非常高,优化的非常好,完全没有必要自己去定义类似的数据结构.了解使用它们,可以满足90%的日常编程需要.该篇文章基于c++11标准,从用户角度来 ...
- 合成的默认构造函数定义为delete的一种情况(针对C++11标准)
1. 默认初始化 如果定义变量时没有指定初值,则变量会被默认初始化,此时变量被赋予了"默认值". 对于类类型的变量来说,初始化都是依靠构造函数来完成的.因此,即使定义某个类的变量( ...
- 介绍C++11标准的变长参数模板
目前大部分主流编译器的最新版本均支持了C++11标准(官方名为ISO/IEC14882:2011)大部分的语法特性,其中比较难理解的新语法特性可能要属变长参数模板(variadic template) ...
- C++11标准之右值引用(rvalue reference)
1.右值引用引入的背景 临时对象的产生和拷贝所带来的效率折损,一直是C++所为人诟病的问题.但是C++标准允许编译器对于临时对象的产生具有完全的自由度,从而发展出了Copy Elision.RVO(包 ...
- J2EE项目开发中常用到的公共方法
在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单.服务器|网络设备重启工单.服务器光纤网线更换工单.网络设备撤线布线工单.服务器|网络设备替换工单.服务器|网络设备RMA工单.通用原 ...
随机推荐
- 操作json数据
删除: delete json[key] 把json字符串转成jsonObject : eval(+'('+json+')'+) 把jsonObject 转换成json字符串 :json.toJSON ...
- CALayer简介
一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个文本输入框.一个图标等等,这些都是UIView. * 其实UIView之所以 ...
- 【转载】解决nginx负载均衡的session共享问题
https://blog.csdn.net/u012081441/article/details/71787164 之前有写过ubuntu环境下搭建nginx环境,今天来谈一下nginx sessio ...
- 第一章 python介绍、变量、数据类型、流程控制语句等
一.python介绍 1.python的诞生 python是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum(龟叔)于1989年发明,第一个公开发行版发行于1991年. ...
- Linux 安装 MongoDB
一.下载 Linux:CentOS 7.3 64位 MongoDB:3.6.4 安装目录:/usr/local cd /usr/local wget https://fastdl.mongodb.or ...
- 0510JS运算符
|-运算符|--基础运算符 + - * / %|----加号:数字的求和.字符串的拼接|----减号:数字的减法.对数字取反|----乘法.除法.取余 var a = 10; var b = 10; ...
- SpringMVC解决跨域的两种方案
1. 什么是跨域 2. 跨域的应用情景 3. 通过注解的方式允许跨域 4. 通过配置文件的方式允许跨域 1. 什么是跨域 跨域,即跨站HTTP请求(Cross-site HTTP request),指 ...
- Page_Load不要忘了if (!IsPostBack)
Page_Load不要忘了if (!IsPostBack) 问题:在DropDownList的SelectedIndexChanged事件中绑定数据,运行时,DropDownList控件的Select ...
- SSH学习之路(一).Net开发与Java Web开发
摘要:一直再使用.net mvc5开发,期间学习过java web相关的知识,现如今想要进阶一下便开始学习ssh框架. 1..net web开发 对于微软的东西,开发者考虑的东西不需要太多,你新建一个 ...
- 节流throttle和防抖debounce
underscore.js提供了很多很有用的函数,今天想说说其中的两个.这两个函数都用于限制函数的执行. debounce 在解释这个函数前,我们先从一个例子看下这个函数的使用场景.假设我们网站有个搜 ...