一、顺序容器

1.容器的选择

(1) 随机访问,选vector ,deque

(2) 在中间插入或者删除元素,选list

(3) 在头尾插入或删除元素 , 选deque

2.list的成员函数

(1)lst.sort()

(2)lst.unique()   // 会把list中相邻重复的元素删除,而unique算法只是使不重复的元素出现在序列的开始部分

3.迭代器的分类

4.迭代器能力排行 : 输入输出迭代器 < 前向迭代器 < 双向迭代器 < 随机访问迭代器

(输入输出迭代器只能用于单遍扫描算法)

因为流迭代器不能递减,所以流迭代器由于不能反向遍历,不能创建反向迭代器.

注意: 只有随机访问迭代器才能有+,-,> ,  <等操作,其他迭代器只能递增或者递减或者 !=,不能用大于>小于<比较

5.各容器的迭代器类型

双向迭代器: list

随机访问迭代器:array,deque,vector,string

6.算法要求的(能力最低的)迭代器类型:

(1)输入迭代器: find, accumulate, copy的前两个参数

(2)输出迭代器: copy的第三个参数

(3)前向迭代器: replace, unique

(4)双向迭代器: reverse

(5)随机迭代器: sort

7.逆向迭代器r总是在对应正向迭代器的前一个位置,

所以当r转换为正向迭代器时,r.base()总是在r的右边一个位置。

8.算法函数总结: (算法都不能改变容器大小,要想用算法在容器中插入元素,必须使用插入迭代器!)

()  swap( c1, c2 )                //容器c1和c2的类型和它们的元素类型都必须相同,若c1,c2分别为两个相同类类型的对象,则swap会交换着两个对象的所有非staitic成员

()  max_element( beg, end )
min_element( beg, end ) //找容器中的最值,返回指向该值的迭代器 max( val1, val2 ) //返回val1和val2中的较大者
min( val1, val2 ) //返回val1和val2中的较小者 () unique( beg, end ) //只能"消除"相邻重复的值,是不重复的值出现在容器前面,把重复的值放到了容器后面,
//返回值为指向最后一个不重复的元素之后的位置的迭代器。 () sort( beg, end )
sort( beg, end, comp ) //让元素按comp提供的排序方式排列,comp函数必须是二元的(即有两个参数) () copy( beg, end, dest ) //dest表示目的迭代器的位置,即拷贝的初始位置 () fill( beg, end, val )
fill_n( dest, n, val ) () reverse(beg, end) //将[beg,end)区间的元素反向排列 () replace( beg, end, old_val, new_val ) () accumulate( beg, end, init ) // init为和的初始值 注意:(I) accumulate算法定义在<numeric>头文件中,第三个参数为求和起点 (II) 对string的求和其第三个参数即初始值必须强制类型转换,不能直接用"" vector<string>v{ "ab", "cd", "ef" };
string s = accumulate(v.begin(), v.end(),(string)""); () count( beg, end, val) //返回值为val出现的次数 () find( beg, end, val) // val表示待查找的值。返回值为指向val的迭代器 注意:不能在string里面找字符串(比如find(s.begin(),s.end(),"abc")),只能找单个字符
但是string 中的成员函数s.find()可以找字符也可以找字符串,返回值为该查找字符或字符串首个字符的下标的数值. 例如: string s = "hello world";
int m = s.find('w');
int n = s.find("wor"); () rotate(beg, mid, end) //围绕mid指向的元素进行转动,mid成为首元素,随后是mid+1到end之前的元素,再接着是是beg到mid之前的元素。 vector<int>v {,,,,,};
rotate(v.begin(), v.begin()+, v.end());
for(auto ve: v)
cout << ve << ' '; //输出结果为 3 4 5 6 1 2

二丶关联容器相关操作

   //向set中添加元素
set<int> iset{,,};
iset.insert();
iset.insert({,,});
iset.insert(b, e); //添加迭代器区间[b,e)的元素 //从set中删除元素
iset.erase();
iset.erase(p); //删除迭代器p所指向的元素
iset.erase(b, e); //删除迭代器区间[b,e)的元素 //向map中添加元素
map<string,int> imap;
imap.insert({"张三",});
imap.insert({"张三",},{"李四",}); //错误!不能同时插入多个元素!
imap.insert(make_pair("张三",)); //从map中删除元素
imap.erase("张三"); //删除每个对应关键字的元素,返回删除元素的个数
imap.erase(p); //删除迭代器p所指向的元素
imap.erase(b, e) //删除迭代器区间[b,e)的元素 //访问关联容器中的元素
c.find(k) //返回指向第一个关键字为k的元素的迭代器
c.count(k) //返回关键字等于k的元素的个数 c.lower_bound(k) //返回一个迭代器,指向第一个关键字不小于k的元素
c.upper_bound(k) //返回一个迭代器,指向第一个关键字大于k的元素 c.equal_range(k) //返回一个迭代器pair,表示关键字等于k的元素的范围

STL容器及泛型算法的更多相关文章

  1. C++的那些事:容器和泛型算法

    一.顺序容器 1,标准库定义了3种类型的顺序容器:vector.list和deque.它们的差别主要在于访问元素的方式,以及添加或删除元素相关操作运算代价.标准库还提供了三种容器适配器:stack.q ...

  2. STL的一些泛型算法

    源地址:http://blog.csdn.net/byijie/article/details/8142859 从福州大学资料里摘下来的我现在能理解的泛型算法 algorithm min(a,b) 返 ...

  3. CH10 泛型算法

    概述 大多数算法都定义在algorithm头文件中. Note:算法永远不会执行容器操作 泛型算法本身不会执行容器的操作,而是通过迭代器来访问.修改等操作 10.1 题目要求读取数据存入vector, ...

  4. 【c++ Prime 学习笔记】第10章 泛型算法

    标准库未给容器添加大量功能,而是提供一组独立于容器的泛型算法 算法:它们实现了一些经典算法的公共接口 泛型:它们可用于不同类型的容器和不同类型的元素 利用这些算法可实现容器基本操作很难做到的事,例如查 ...

  5. 【STL】帮你复习STL泛型算法 一

    STL泛型算法 #include <iostream> #include <vector> #include <algorithm> #include <it ...

  6. STL容器及算法题:删除奇数的QQ号

    最近思考到这样一个题目:在STL的set和vector容器里存储了1亿个QQ号,编写函数删除奇数QQ号. 1. STL容器简介 首先了解一下 set 和 vector 以及其他类似的 STL 容器: ...

  7. C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法

    STL实践与分析 --容器特有的算法 与其它顺序容器所支持的操作相比,标准库为list容器定义了更精细的操作集合,使它不必仅仅依赖于泛型操作.当中非常大的一个原因就是list容器不是依照内存中的顺序进 ...

  8. C++ Primer 学习笔记_45_STL实践与分析(19)--泛型算法的结构

    STL实践与分析 --泛型算法的结构 引言: 正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础. 算法最主要的性质是须要使用的迭代器种类.全部算法都指定了它的每一个迭代器形參可使用 ...

  9. 快速排序及STL中的sort算法

    快速排序基本思想是,对待排序序列进行划分(Partition),一次划分,选择一个元素作为枢轴,然后将所有比枢轴小的元素放到枢轴的左边,将比枢轴大的元素放到枢轴的右边.然后对该枢轴划分的左右子序列分别 ...

随机推荐

  1. STM32L476应用开发之二:模拟量数据采集

    采集模拟量数据在一台一起中是必不可少的功能.在本次实验中我们要采集的模拟量值主要包括氧气传感器的输出以及压力变送器的输出. 1硬件设计 我们需要采集数据对精度有一定的要求,而STM32L476自带AD ...

  2. 用VS制作的windows服务安装包 安装完后如何让服务自动启动

    vs 服务做成安装包,如何安装以后启动服务,只要在类名为projectinstaller的类中重写commit事件即可         public override void Commit(IDic ...

  3. Confluence 6 用户宏示例 - NoPrint

    这个示例演示了如何创建一个用户宏,这个宏包括了在查看页面中显示的内容,但是不被打印. Macro name noprint Visibility Visible to all users in the ...

  4. mvc 模式和mtc 模式的区别

    首先说说Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,他们之间以一种插件式的.松耦合的方式连接在一起,模型负责业务对象与数据库的映射( ...

  5. C#关于线程的问题

    1.通过System.threading.Thread类可以创建新的线程,并在线程堆栈中运行静态和动态的实例,可以通过Thread类的构造方法传递一个无参数,并且不返回的委托, class Progr ...

  6. 实现本地svn目录同步时,服务器的相应目录保持自动同步

    提交一个TEST文件夹 但是服务器上并没有显示 而新检出的目录却有 这个时候需要手动去update才会显示,而不可能每次都去update,所以,就用到配置自动更新 1.创建svn目录:mkdir /v ...

  7. linux安装python3+selenium

    安装笔记 当前安装使用centos7 安装python3 1.下载 [admin@ ~] wget https://www.python.org/ftp/python/3.6.0/Python-3.6 ...

  8. WIN7 启动屏幕键盘

    点击“开始”或按快捷键“WIN”,输入“osk”后,按“回车键”确定,就可以启动屏幕键盘. 屏幕键盘 另一种方法是进入“控制面板”: 再进入“轻松访问中心”: 选择“启动屏幕键盘”,这样也可以启动屏幕 ...

  9. HTML5 CSS3 Transform 笔记 (scale不起作用)

    Transform的 scale属性不能作用于 inline元素上,例如span 并且动画 animation  也不能作用于inline元素上 可以给span加display:inline-bloc ...

  10. 十图详解tensorflow数据读取机制(附代码)转知乎

    十图详解tensorflow数据读取机制(附代码) - 何之源的文章 - 知乎 https://zhuanlan.zhihu.com/p/27238630