STL总结

组件

STL提供六大组件彼此此可以组合套用:

1、容器
容器就是各种数据结构,从实现角度看,STL容器是一种class template。分为序列容器和关联容器两种,
关联容器(set, map)是通过键(key)存储和读取元素的,而序列容器(vector, list)则通过元素在容器中的位置顺序存储和访问元素。关联容器除了C++17提供的extract外,正常情况下不能修改key。
2、算法
各种常见算法,如sort,search,copy,erase等,从实现角度看,STL算法是一种function template。
在这里插入图片描述

3、迭代器
扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。

4、仿函数
行为类函数,可作为算法的某种策略,从实现角度看,仿函数是一种重载了operator()的class或class template。一般函数指针可视为狭义的仿函数。

5、容器配接器
一种用来修饰容器或者仿函数或迭代器接口的东西。比如queue和stack,看着像容器,其实就是deque包了一层皮。

6、空间配置器
负责空间配置与管理。从实现角度看,配置器是一个实现了动态空间配置、空间管理、空间释放额class template。

常用的容器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
stl-容器

  1. vector:底层数据结构为数组 ,支持快速随机访问。
  2. list:底层数据结构为双向链表,支持快速增删。
  3. deque:双端队列,底层数据结构为一个中央控制器和多个缓冲区,支持首尾(中间不能)快速增删,也支持随机访问。
  4. stack:底层一般用2或者3实现,封闭头部即可,不用vector的原因容量大小有限制,扩容耗时
  5. queue:底层一般用23实现,封闭头部即可,不用vector的原因是容量大小有限制,扩容耗时
  6. priority_queue:底层数据结构一般为vector,堆heap为处理规则来管理底层容器实现
  7. set:底层数据结构为红黑树,有序,不重复。
  8. multiset:底层数据结构为红黑树,有序,可重复。
  9. map:底层数据结构为红黑树,有序,不重复。
  10. multimap:底层数据结构为红黑树,有序,可重复。
  11. hash_set:底层数据结构为hash表,无序,不重复。
  12. hash_multiset:底层数据结构为hash表,无序,可重复 。
  13. hash_map :底层数据结构为hash表,无序,不重复。
  14. hash_multimap:底层数据结构为hash表,无序,可重复。

vector

  1. vector就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时,会自动申请另一片更大的空间(一般是增加当前容量的50%或100%),然后把原来的数据拷贝过去,接着释放原来的那片空间;
  2. 当释放或者删除里面的数据时,其存储空间不释放,仅仅是清空了里面的数据。

vector插入删除和list的区别

  1. vector插入和删除数据,需要对现有数据进行复制移动,如果vector存储的对象很大或者构造函数很复杂,则开销较大
  2. list插入和删除数据,需要对现有数据进行遍历,但在首部插入数据,效率很高。

deque与vector的区别

  1. vector是单向开口的连续线性空间,deque是双向开口的连续线性空间。(双向开口是指可以在头尾两端分别做元素的插入和删除操作)
  2. deque没有提供空间保留功能,而vector则要提供空间保留功能。
  3. deque也提供随机访问迭代器,但是其迭代器比vector迭代器复杂很多。

vector中erase方法与algorithn中的remove方法区别

  1. vector中erase方法真正删除了元素,迭代器不能访问了
  2. remove只是简单地将元素移到了容器的最后面,迭代器还是可以访问到。因为algorithm通过迭代器进行操作,不知道容器的内部结构,所以无法进行真正的删除。

vector、list、map、deque用erase后迭代器的变化

  1. vector和deque是序列式容器,其内存分别是连续空间和分段连续空间,删除迭代器it后,其后面的迭代器都失效了,此时it及其后面的迭代器会自动加1,使it指向被删除元素的下一个元素。
  2. list删除迭代器it时,其后面的迭代器都不会失效,将前面和后面连接起来即可。
  3. map也是只能使当前删除的迭代器失效,其后面的迭代器依然有效,因为插入操作只是结点指针换来换去,结点内存没有改变。

list

以结点为单位存放数据,结点的地址在内存中不一定连续,每次插入或删除一个元素,就配置或释放一个元素空间

不提供迭代器的容器

  • queue,除了头部外,没有其他方法存取deque的其他元素。
  • stack,除了最顶端外,没有任何其他方法可以存取stack的其他元素。
  • heap,所有元素都必须遵循特别的排序规则,不提供遍历功能。

erase

  1. 对于连续内存容器(如vector,deque),删除当前的iterator会使后面所有元素的iterator都失效。因为vector,deque使用了连续分配的内存,删除一个元素导致后面所有的元素会向前移动一个位置。所以不能使用erase(iter++)的方式,但erase方法可以返回下一个有效的iterator。
for (iter = cont.begin(); iter != cont.end();)
{
   (*it)->doSomething();
   if (shouldDelete(*iter))
      iter = cont.erase(iter);  //erase删除元素,返回下一个迭代器
   else
      ++iter;
}
  1. 对于非连续内存容器(如map, set,list),删除当前的iterator,仅仅会使当前的iterator失效,只要在erase时,递增当前iterator即可。这是因为内存不连续,插入、删除一个结点不会对其他结点造成影响。erase迭代器只是被删元素的迭代器失效,返回值为void,所以要采用erase(iter++)的方式删除元素。

for (iter = cont.begin(); it != cont.end();)
{
   (*iter)->doSomething();
   if (shouldDelete(*iter))
      cont.erase(iter++);
   else
      ++iter;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值