前言:STL是c++的利器;
目录
一.STL:基本概念
1.1STL:基本概念
algorithm (算法) container(容器:相当于数据结构模型) 和i te rator(迭代器)
a)容器:
序列式容器:各一个元素都有固定的位置;取决于 插入时机和地点;
vector: 单向数组
deque: 双队列;
list: 双向链表;
stack:栈
queue:队列;
priority_queue :优先队列;
关联式容器:元素取决于排序准则,和插入顺序无关;
set (集合)/multiset(多重集合) :
map(映射)/multimap(多重映射):
b)算法:
<alorithm>,<numeric>,<functional>;
1.2c++标准库的组成 :
有10大头文件组成:
1.支持语言相关功能;2支持输入输出流的头文件; 3 诊断相关;4定义工具函数;5字符串;
6 容器;7迭代器; 8算法; 9数值操作 ; 10本地化 ;
模板回顾:函数模板,类模板;
二.STL应用:
1STL的string:
string的概念:
1.string是一个类:string封装了char* ,管理这个字符串,是一个char* 型的容器;
2.string不需要考虑内存的释放和越界:
3.string 提供了一系列的字符串操作函数:find,copy,erase,repalce,inset
4.char * 是一个只向字符的指针:
运算符重载:
1实现一个数组类;
2实现一个字符串类;
3实现智能指针的编写;
sting的初始化
遍历
字符指针和string的转化
连接
查找和替换
区间删除(截断)
插入
string的翻转和大小写的转化
2序列式容器:
2.1Vector容器:
1vector:容器简介: 将元素置于一个动态数组加以管理的容器;//二维数组1vector<vector<int>> mat(row);vector<vector<int >> mat(row,vecror<int> (col))
vector可以随机存储元素(直接存取;用【】操作符,at方法,迭代器存储)
//尾部插入or删除很方便!
2vector 对象的默认构造,初始化:
vector <T> vect;
vector <>
3vecror复制
4获得元素:尾部添加or弹出元素,获取头部元素,尾部元素;
5遍历:1通过数组方式;2通过迭代器操作
6vector删除:
7vector数据的插入:
2.2stack容器
2.3queue容器
2.4List容器
2.5priority_queue
3关联式容器
3.1set和mult set
1集合 有序 唯一红黑树变体
2set元素添加 遍历 删除
3能比较大小set的集合 1基本数据类型 2 自定义数据类型的比较 仿函数 函数对象
4set的查找和Pair
3.2map和multmap
1.map元素的添加 遍历和删除的基本操作:
概念:map是一种关联式容器,一个map是一个键值对序列,即(key,value)对; 它提供了key快捷检索能力;
规则:map中key值是唯一的;集合中的元素 按一定的顺序排列;元素插入过程是按规则插入的,不能指定位置插入;
结构:map具体实现红黑树变体的平衡二叉树的数据结构;在插入操作和删除操作比vector快!;
key =1 Y=one
key=2 y=two
multimap和map区别:map支持唯一键值对,每个键值对是唯一的;而multimap相同的键可以出现的多次;
map /multimap采用模板类实现,对象的默认构造形式:
map<T1,T2>mapTT;
multimap<T1,T2> multimap TT;//t1,t2自定义数据类型;
2插入的思种方法:
3map的查找: 1find查找 2equal——range 查找
4multimap的案例
4STL实现机制
4.1STL容器对共性机制:
1容器的值copy语意:不能出现深拷贝和浅拷贝问题;
c++模板是容器的概念;
容器 执行插入元素的操作,内部实施拷贝动作,使用STL容器必须能被拷贝;
除了queue和stack以外,每个容器都提供可以返回迭代器的函数,运用返回的迭代器就可以访问元素;
4.2容器的应用场景:
vector:单端数组:可以随机存取;元素搜寻速度慢;安插移除在尾端进行;(效率比deque高)
deque:双端数组 :可以随机存取;元素搜寻速度慢;安插移除在头尾端进行;(有点头部插入和移除)
使用场景:比如排队购票系统; 对于排队者存储,可以蚕蛹deque,支持头端的快速移除,尾端的快速添加;
如果采用vector,则头端移除时,移动大量数据;
priority_queue :优先队列
list:双向链表;不能随机存取;元素搜寻速度非常慢;安插移除在任何位置进行;
使用场景: 公交车乘客的存储,随时有乘客下车; 支持频繁的 不确定位置元素的移除插入;
set:二叉树; 不能随机存取;元素搜寻速度快;
使用场景:对于手机游戏的个人得分记录存储;存储要求从高分到低分的顺序排列;
map:二叉树:对key而言可以随机存取;对key而言元素搜寻快!
使用场景: 比如按ID号存储10万个用户,想要通过ID查找对应的用户;
5算法
5.1概念和分类:
<algorithm> <> <>
1非可变序列算法 :不能直接修改其操作的容器内容的算法
计数算法 count count_if
搜索算法 search , find,find_if find_first_of
比较算法:equal, mismatchh,
2可变序列算法:可以修改他们所操作的容器内容的算法
删除算法 :remove ,remove_if,remove_copy
修改算法: for_each ,transform
排序算法:sort,stable_sort,paritial_sort
补充:
排序算法 :包括对序列排序和合并算法,搜索算法以及有序列上的集合操作
数值算法: 对容器内容进行数值计算;
5.2算法设计理念:
函数对象和谓词;
函数对象:重载函数对象的类;(普通函数和函数对象的一同 函数对象做函数参数 函数对象做返回值)
一元函数对象 函数参数是1个;
二元函数对象 函数参数是2个;
一元谓词 函数参数是1个,函数返回值是bool类型的 ,可以作为一个判断式,谓词可以使用一个仿函数,也可以是回调函数
二元谓词 函数参数是2个,函数返回值是bool类型的
要判断stl算法 返回的值是迭代器还是谓词(函数对象) 是stl算法入门重点
自定义函数对象,预定义函数对象;
5.3具体算法介绍
1查找算法:13个
2堆算法:3个
3关系算法:8个
4集合算法:4个
5列组合算法:2个
6排序和通用算法:14个
7删除和替换算法:15个
8生产和变异算法:6个
9算数算法:4个
但常用算法算法:
1查找算法: count() ,count_if() , equal_range(), find(),find()
2排序算法: sort() merge(),
3常用拷贝算法和替换算法:replace(),replace_if(),copy(),swap()
4常用的遍历算法:for_each,treansform()
5常用的算术和生成算法:accumulate()
6常用的集合算法:set_union()