STL知识点

STL是标准模板库
STL六代组件:
分别是:容器,算法,迭代器,仿函数,适配器,空间配置器
1,容器:各种数据结构,如vector,list,deque,map等,用来存放数据
2,算法:各种常用的算法,如sort,find,copy,for_each等
3,迭代器:扮演了容器与算法之间的胶合剂
4,仿函数:行为类似函数,可作为算法的某种策略
5,适配器:一种用来修饰容器或者仿函数或迭代器接口的东西
6,空间配置器:负责空间的配置和管理

STL容器就是将运用最广泛的一些数据结构实现出来
常用的数据结构有:数组,链表,树,栈,队列,集合,映射表等
容器分为序列实容器和关联式容器两种:
序列式容器:强调值的排序,序列式容器中的每个元素均有固定的位置
关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系

算法分为质变算法和非质变算法
质变算法:指运算过程中会更改区间内的元素的内容,例如拷贝,替换,删除
非质变算法:指运算过程中不会更改区间内的元素内容,例如查找,计数,遍历,寻找极值等等

迭代器提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴漏该容器的内部表示方法。
每个容器都有自己的专属迭代器
迭代器使用非常类似于指针
在这里插入图片描述
v.begin();起始迭代器,指向容器中第一个元素
v.begin();起始迭代器,指向容器中第一个元素

string基本概念
本质:string是C++风格的字符串,string本质上是一个类
string和char *的区别:
1.char *是一个指针 2.string是一个类,内部封装了char *,是一个char 型的容器
特点:
1,string内部封装了很多成员方法 例如查找find,拷贝copy,删除delete,替换replace,插入insert
2,string管理char
所分配的内存,不用担心复制越界和取值越界,由类内部进行负责

vector容器
功能:vector数据结构和数组非常相似,也成为单端数组
vector和普通数组的区别:
数组是静态空间,vector可以动态扩展
动态扩展:
并不是在原空间之后续接新空间,而是找更大的空间将原数据拷贝到新空间,释放原空间
在这里插入图片描述
vector容器的迭代器是支持随机访问的迭代器

deque容器
功能:双端数组,可以对头端进行插入和删除
deque与vector的区别
1.vector对于头部的插入删除效率低,数据量越大效率越低
2.deque相对vector而言对头部的插入和删除速度比vector快
3.vector访问元素的速度会比deque快,这和二者的内部实现有关
在这里插入图片描述
deque内部工作原理:
在这里插入图片描述

stack容器:
构造函数:
1.stack;–默认构造形式
2.stack(const stack &stk);–拷贝构造函数
赋值操作:
stack& operator=(const stack &stk);–重载等号运算符
数据存取:
push(elem);–向栈顶添加元素
pop();–从栈顶移除第一个元素
top();–返回栈顶元素
大小操作:
1.empty();–判断栈是否为空
2.size();–返回栈的大小

queue容器:
queue;–默认构造形式
queue(const queue &que);–拷贝构造函数
赋值操作:
queue& operator=(const queue &que);–重载等号运算符
数据存取:
push(elem);–往队尾添加元素
pop():–从对头移除第一个元素
back();返回最后一个元素;
front();–返回第一个元素
大小操作:
empty();–判断是否为空
size();–返回队列的大小

list容器:将数据进行链式存储,STL中的链表是一个双向循环链表
由于链表的存储方式并不是连续的内存空间,因此链表中的迭代器只支持前移和后移,属于双向迭代器
list插入和删除操作都不会造成原有list迭代器的失效,这在vector是不成立的

set容器:
所有元素都会在插入时自动被排序
本质:set/multiset属于关联式容器,底层结构是用二叉树实现的
set和multiset的区别:
1.set不允许容器中有重复的元素
2.multiset允许容器中有重复的元素
set插入只有insert方式

map容器:
map中所有元素都是pair
pair中的第一个元素为key(键值),起到索引作用,第二个元素为value(实值)
所有元素都会根据元素的键值自动排序
本质:
map/multimap属于关联式容器,底层结构用二叉树实现
优点:
可以根据key值快速找到value值
map和multimap区别:
map不允许容器中有重复Key值元素
multimap允许容器中有重复key值元素
map插入时按照key默认排序,与插入顺序无关

函数对象(仿函数)
概念:重载函数调用操作符的类,其对象常称为函数对象
函数对象使用重载的()时,行为类似函数调用,也叫仿函数
本质:
函数对象(仿函数)是一个类,不是一个函数
函数对象使用:
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值
函数对象超出普通函数的概念,函数对象可以有自己的状态
函数对象可以作为参数传递

谓词:
返回bool类型的仿函数称为谓词
如果operator()接受一个参数,那么叫做一元谓词
如果operator()接受两个参数,那么叫做两元谓词

内建函数:
概念:STL内建了一些函数对象
分类:
算术仿函数,关系仿函数,逻辑仿函数
用法:这些仿函数所产生的对象,用法和一般函数完全相同
使用内建函数对象,需要引入头文件#include<functional

常用算数生成算法:
使用时包含头文件#include<numeric
accumulate–计算容器元素总和
accumulate(v.begin(),v.end(),0)–第三个参数为起始累加值
fill–向容器中添加元素

常用集合算法:
set_intersection–求两个容器交集,返回值是交集中最后一个元素的位置
set_union–求两个容器并集,俩个集合必须是有序容器,返回值是并集最后一个元素的位置
set_difference–求两个容器差集,返回差集的结束位置

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值