C++进阶知识整理

我是研究僧i 提交于 2019-11-29 06:20:39

本基本知识整理及代码源于牛客网C++面试宝典导读,

  网址https://www.nowcoder.com/tutorial/93/7047559bae6c461582560f58175faa45

  STL基本组成

  容器、迭代器、分配器、算法、仿函数、配接器。

    分配器给容器分配内存空间,算法通过迭代器获取容器中内容,仿函数协助算法完成各种操作,配接器用来套接适配仿函数。

  vector和list

  vector:

  连续存储容器,动态数组,在堆上分配空间。

  底层实现:数组。

  两倍容量增长:

  插入新元素时,如果超过容量,则会重新分配原有个数的两倍空间,将原空间元素赋值到新空间再增加新元素,最后析构并释放原空间,之前的迭代器失效

  适用:随机访问,不常在非尾节点插入删除。

  List:

  动态链表,在堆上分配空间。插入和删除都会分配或释放空间。

  底层实现:双向链表。

  适用:不能随机访问,只能快速访问头尾节点。

 

  resize和reserve区别

  resize:改变容器内含有元素的数量(size()),可以缩小。

  reserve:改变当前容器的最大容量(capicity()),不能缩小。

  map和set

  map和set都是关联容器,底层实现都是红黑树。map和set的接口红黑树都提供了。

  区别:

  1. map是key-value(关键字-值):关键字起索引作用,值是和索引关联的数据。set是关键字的集合。

  2. set迭代器为const,不能修改元素的值(关键字不能修改);map可以修改value,不能修改key。map和set是根据关键字排序来保证其有序。修改key则应删除键,调节平衡,再插入键,调节平衡,会破坏结构导致迭代器iterator失效。

  3.map支持下标操作,set不支持下标操作。map使用key做下标去查找,如果key不存在,则插入该关键字和值到map中。只希望确定某一关键值是否存在则应该使用find。

 

  迭代器

  迭代器是类模板,重载了指针的操作符部分操作符,是一个可遍历STL容器内全部或部分元素的对象,本质是封装了原生指针,提供了比指针更高级的行为,相当于一种智能指针,可以根据不能类型的容器来实现不同的++,--等操作。

  迭代器返回的是对象引用而不是值,cout智能输出迭代器使用*解引用后的值。

  迭代器访问方式就是将不同集合类的访问逻辑抽象出来,使得不用暴露内部结构而达到循环遍历集合的效果。

  STL的allocator

  STL分配器用于封装STL容器在内存管理上的底层细节。

  alloc::allocate()负责分配内存,alloc::deallocate()释放空间。对象构造由construct()负责,析构由destroy()负责。

  采用两级配置器,分配空间大小超过128b时使用第一级空间配置器,小于128b时第二级。第一级空间配置器使用malloc、realloc、free进行内存分配和释放;第二级采用内存池计数,通过空闲链表来管理内存。

 

  STL迭代器删除元素失效

  1.vector、deque,使用erase后,后面每个元素迭代器都会失效,后面每个元素向前移动一个位置,erase返回下一个有效迭代器。

  2.map、set,使用erase后,当前迭代器失效,不会影响下一个元素迭代器,在调用erase前记录下一个迭代器即可。

  3.list不会失效,调用erase会返回下一个有效迭代器。

 

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!