@TOC
1.基础
1.1数组和指针
数组:数组是用于储存多个相同类型数据的集合。
指针:指针相当于一个变量,但是它和不同变量不一样,它存放的是其它变量在内存中的地址。
区别:
- 赋值:同类型指针变量可以相互赋值,数组不行,只能一个一个元素的赋值或拷贝
- 存储方式:数组:数组在内存中是连续存放的,开辟一块连续的内存空间。数组是根据数组的下进行访问的,多维数组在内存中是按照一维数组存储的,只是在逻辑上是多维的。指针:指针很灵活,它可以指向任意类型的数据。指针的类型说明了它所指向地址空间的内存。
- 求sizeof:数组所占存储空间的内存:sizeof(数组名),数组的大小。在32位平台下,无论指针的类型是什么,sizeof(指针名)都是4,在64位平台下,无论指针的类型是什么,sizeof(指针名)都是8。
- 初始化方式不同。
- 传参方式:数组传参时,会退化为指针,C语言将数组的传参进行了退化。将整个数组拷贝一份传入函数时,将数组名看做常量指针,传数组首元素的地址。一级指针传参可以接受的参数类型:(1)可以是一个整形指针 (2)可以是整型变量地址 (3)可以是一维整型数组数组名;当函数参数部分是二级指针时,可以接受的参数类型:(1)二级指针变量(2)一级指针变量地址(3)一维指针数组的数组名。
纠正:有常引用,即对一个常量的引用。
备注: 所谓引用和指针执行++操作意义不一样是指:引用++是对引用的对象+1,而指针++是指指针指向下一个对象。 - 指针类型的声明:*
- 指向指针的引用:*
1.2 STL容器
(1)vector
vector是一种动态数组,在内存中具有连续的存储空间,支持快速随机访问。由于具有连续的存储空间,所以在插入和删除操作方面,效率比较慢。vector有多个构造函数,默认的构造函数是构造一个初始长度为0的内存空间,且分配的内存空间是以2的倍数动态增长的,即内存空间增长是按照20,21,22,23.....增长的,在push_back的过程中,若发现分配的内存空间不足,则重新分配一段连续的内存空间,其大小是现在连续空间的2倍,再将原先空间中的元素复制到新的空间中,性能消耗比较大,尤其是当元素是非内部数据时(非内部数据往往构造及拷贝构造函数相当复杂)。
(2)deque
deque和vector类似,支持快速随机访问。二者最大的区别在于,vector只能在末端插入数据,而deque支持双端插入数据。deque的内存空间分布是小片的连续,小片间用链表相连,实际上内部有一个map的指针。deque空间的重新分配要比vector快,重新分配空间后,原有的元素是不需要拷贝的。
API:deque<T>deqT; //默认构造形式 assign(begin,end); //将【begin,end】区间的数据拷贝赋值给自身 deque.size(); //返回容器中元素的个数 push_back(elem); //在容器尾部添加一个数据
(3)List
双向链表,快速任意位置插入,
(4)map
关联容器,内部使用红黑树(自平衡二叉树)实现,Map内部有序
(5)Set
关联容器,内部红黑树实现
(6)queue
queue是队列,内部是deque实现,deque在重新分配空间的时候不需要拷贝所有元素。
(7)Stack
Stack先进后出,内部deque实现,