@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实现,

2.容器和算法

3.STL剖析

4.内存管理

5.C++11