C++ STL 01


容器:大小、增删改查、构造函数……

STL

STL概述

STL(standard template library,标准模板库),高内聚、低耦合,减少代码量,提高复用率。模版库(模版类、模版函数基础++)
STL=容器(container)+算法(algorithm)+迭代器(iterator)
STL=容器+算法+迭代器+仿函数(伪函数)+适配器+空间配置器

容器概述

STL容器就是将运用最广泛的一些数据结构实现出来。
常用的数据结构: 数组(array),链表(list),tree(树),栈(stack),队列(queue),集合(set),映射表(map),根据数据在容器中的排列特性,这些数据分为序列式容器关联式容器两种

1. 序列式容器

序列式容器强调值的排序,序列式容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。Vector容器、Deque容器、List容器等。

2. 关联式容器

关联式容器是非线性的树结构,更准确的说是二叉树结构。各元素之间没有严格的物理上的顺序关系,也就是说元素在容器中并没有保存元素置入容器时的逻辑顺序。关联式容器另一个显著特点是:在值中选择一个值作为关键字key,这个关键字对值起到索引的作用,方便查找。Set/multiSet容器 Map/multiMap容器

算法概述

TL收录的算法经过了数学上的效能分析与证明,是极具复用价值的,包括常用的排序,查找等等。特定的算法往往搭配特定的数据结构,算法与数据结构相辅相成。
STL算法分为:质变算法和非质变算法。

1. 质变算法

质变算法:是指运算过程中会更改区间内的元素的内容。例如拷贝,替换,删除等等

2. 非质变算法

非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等

迭代器概述

迭代器的设计思维-STL的关键所在,STL的中心思想在于将容器(container)和算法(algorithms)分开,彼此独立设计,最后再一贴胶着剂将他们撮合在一起。
迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。

迭代器分类

迭代器类型访问类型操作类型
输入迭代器提供对数据的只读访问只读,支持++、== 、!=
输出迭代器提供对数据的只写访问只写,支持++
前向迭代器提供读写操作,并能向前推进迭代器读写,支持++、==、!=
双向迭代器提供读写操作,并能向前和向后操作读写,支持++、- -,
随机访问迭代器提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器读写,支持++、- -、[n]、-n、<、<=、>、>=

常用容器

  1. 顺序容器主要有vector、list、deque。其中vector表示一段连续的内存,基于数组实现;list表示非连续的内存,基于链表实现;deque与vector类似,但是对首元素提供插入和删除的双向支持。
  2. 关联容器主要有map和set(红黑树实现)。map是key-value形式,set是单值。map和set只能存放唯一的key,multimap和multiset可以存放多个相同的key。
    容器类自动申请和释放内存,因此无需new和delete操作
  3. stack 栈、queue队

strng容器(本质类)

string类本不是STL的容器,但是它与STL容器有着很多相似的操作,因此,把string放在这里一起进行介绍。

  1. Char是一个指针,String是一个类string封装了char:管理这个字符串,是一个char*型的容器。
  2. String封装了很多实用的成员方法:查找find,拷贝copy,删除delete 替换replace,插入insert;
  3. 不用考虑内存释放和越界:string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。

vector

向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组且“大小和存储位置也是动态”。理解记忆:容器定义:vector< int > v;容器指针定义:vector< int > iterator it。
图片来源:网络传智or黑马     实现原理:在这里插入图片描述

deque

Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。
网络图片参考 实现原理:
传智盗图
黑马盗图

list

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list永远是常数时间。
实现原理:
在这里插入图片描述

vector list deque异同

容器理解头文件特点
vectorVector(向量)是一个封装了动态大小数组的顺序容器(Sequence Container)。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组,能够增加和压缩数据。#include < vector >1. 顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2. 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3. 容器使用一个内存分配器对象来动态地处理它的存储需求。
dequedeque(双端队列)是由一段一段的定量连续空间构成,可以向两端发展,因此不论在尾部或头部安插元素都十分迅速。是一种具有队列和栈的性质的数据结构。 在中间部分安插元素则比较费时,因为必须移动其它元素。#include < list >1. 支持随机访问,即支持[]以及at(),但是性能没有vector好。
2. 可以在内部进行插入和删除操作,但性能不及list。
listlist(链表)是一种序列式容器。list容器完成的功能实际上和数据结构中的双向链表是极其相似的,list中的数据元素是通过链表指针串连成逻辑意义上的线性表,也就是list也具有链表的主要优点,即:在链表的任一位置进行元素的插入、删除操作都是快速的。list的实现大概是这样的:list的每个节点有三个域:前驱元素指针域、数据域和后继元素指针域。前驱元素指针域保存了前驱元素的首地址;数据域则是本节点的数据;后继元素指针域则保存了后继元素的首地址。#include < deque >1. list就是数据结构中的双向链表(根据sgi stl源代码),因此它的内存空间是不连续的,通过指针来进行数据的访问,这个特点使得它的随即存取变的非常没有效率,因此它没有提供[]操作符的重载。
2. 但由于链表的特点,它可以以很好的效率支持任意地方的删除和插入。
容器API构造函数插入删除改查
vector1. vector v; //采用模板实现类实现,默认构造函数
2. vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。
3. vector(n, elem);//构造函数将n个elem拷贝给本身。
4. vector(const vector &vec);//拷贝构造函数。
1. insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
2. push_back(ele); //尾部插入元素ele
3.
1. pop_back();//删除最后一个元素
2. erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
3. erase(const_iterator pos);//删除迭代器指向的元素
4. clear();//删除容器中所有元素
1. size();//返回容器中元素的个数
2. empty();//判断容器是否为空
3. resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
4. resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
5. capacity();//容器的容量
6. reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
7. at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
8. operator[];//返回索引idx所指的数据,越界时,运行直接报错
9. front();//返回容器中第一个数据元素
10. back();//返回容器中最后一个数据元素
11. assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
12. assign(n, elem);//将n个elem拷贝赋值给本身。
13. vector& operator=(const vector &vec);//重载等号操作符
14. swap(vec);// 将vec与本身的元素互换。
容器API构造函数插入删除改查
deque1. deque deqT;//默认构造形式
2. deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
3. deque(n, elem);//构造函数将n个elem拷贝给本身。
4. deque(const deque &deq);//拷贝构造函数。
1. push_back(elem);//在容器尾部添加一个数据
2. push_front(elem);//在容器头部插入一个数据
3. insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
4. insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
5. insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
1. pop_back();//删除容器最后一个数据
2. pop_front();//删除容器第一个数据
3.clear();//移除容器的所有数据
4. erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
5. erase(pos);//删除pos位置的数据,返回下一个数据的位置。
1deque.size();//返回容器中元素的个数
2. deque.empty();//判断容器是否为空
3. deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
4. deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
5.at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。
6. operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。
7. front();//返回第一个数据。
8. back();//返回最后一个数据
9. assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
10. assign(n, elem);//将n个elem拷贝赋值给本身。
11. deque& operator=(const deque &deq); //重载等号操作符
12. swap(deq);// 将deq与本身的元素互换
容器API构造函数插入删除改查
list1. list lstT;//list采用采用模板类实现,对象的默认构造形式:
2. list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。
3. list(n,elem);//构造函数将n个elem拷贝给本身。
4. list(const list &lst);//拷贝构造函数。
1. push_back(elem);//在容器尾部加入一个元素
2. push_front(elem);//在容器开头插入一个元素
3. insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
4. insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
5. insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
1. pop_back();//删除容器中最后一个元素
2. pop_front();//从容器开头移除第一个元素
3. clear();//移除容器的所有数据
4. erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
5. erase(pos);//删除pos位置的数据,返回下一个数据的位置。
6. remove(elem);//删除容器中所有与elem值匹配的元素。
1. size();//返回容器中元素的个数
2. empty();//判断容器是否为空
3. resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
4. resize(num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
5. assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
6. assign(n, elem);//将n个elem拷贝赋值给本身。
7. list& operator=(const list &lst);//重载等号操作符
8. swap(lst);//将lst与本身的元素互换。

stack

stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。
有元素推入栈的操作称为:push,将元素推出stack的操作称为pop;stack所有元素的进出都必须符合”先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。Stack不提供遍历功能,也不提供迭代器。
操作原理图:
图片来源网络

queue

Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。
Queue所有元素的进出都必须符合”先进先出”的条件,只有queue的顶端元素,才有机会被外界取用。Queue不提供遍历功能,也不提供迭代器。
原理图:
图片来自网络

stack queue 异同

容器API构造函数成员函数
stackstack stkT;//stack采用模板类实现, stack对象的默认构造形式:
stack(const stack &stk);//拷贝构造函数
stack& operator=(const stack &stk);//重载等号操作符
push(elem);//向栈顶添加元素
pop();//从栈顶移除第一个元素
top();//返回栈顶元素
empty();//判断堆栈是否为空
size();//返回堆栈的大小
queuequeue queT;//queue采用模板类实现,queue对象的默认构造形式:
queue(const queue &que);//拷贝构造函数
push(elem);//往队尾添加元素
pop();//从队头移除第一个元素
back();//返回最后一个元素
front();//返回第一个元素
queue& operator=(const queue &que);//重载等号操作符
empty();//判断队列是否为空
size();//返回队列的大小

C++ STL 02


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Echo一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值