STL学习笔记
STL (标准模板库)
使用 STL 能极大提升编码效率
空间配置器,他比手动申请释放内存高效许多。
容器
实质上是一组相同类型对象的集合,但它不仅仅是数组那么简单,它实现了比数组更复杂的数据结构,能够实现更复杂的功能。
=======================================================
红黑树 快速查找
https://www.sohu.com/a/201923614_466939
1.左子树上所有结点的值均小于或等于它的根结点的值。
2.右子树上所有结点的值均大于或等于它的根结点的值。
3.左、右子树也分别为二叉排序树。
4.节点是红色或黑色。
5.根节点是黑色。
6.每个叶子节点都是黑色的空节点(NIL节点)。
- 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
8.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
堆
程序的运行场所是内存,栈和堆是进程的虚拟内存中的两部分区域。
当程序被执行时,程序代码,你所创建的变量、常量等都会被压入栈空间里,栈是程序代码的执行区域。栈的内存地址是连续的且被一一记录,所以说当你创建了一个变量(比如int var = 1),我们就可以通过var这个变量来访问变量的内容。在这里,var就存放在栈中,它的地址已经默认被编译器计算好了,调用过程也不需要你涉及到有关地址的操作。更直观的感受是数组,数组里的元素在栈里面是连续排放的,相邻两个元素的地址相差1。
而堆是不同于栈的另一部分区域,系统会给每个程序分配一部分栈空间让他们能够运行起来,问题就是栈空间必然存在不够用的问题,而堆不属于程序,堆是独立的,是公用的。只要你malloc(sizeof(SIZE_YOU_WANT)),就可以得到相应一部分的堆空间。
有栈,为什么用堆?
栈里面的东西有生命周期,说俗点就是变量作用域,你在函数内部创建一个变量,函数调用结束这个变量就没了。而堆里面的东西独立于你的程序,malloc()之后,除非你free()掉,否则一直存在。
有什么要注意?
堆里面申请的东西,是随机分配的,不像栈里面的地址都已经计算好了。所以申请了堆空间之后一定要创建一个指针保存你说申请到的堆空间的地址。不然就找不到你申请的空间了。
既然涉及到指针,请注意用之前检查一下指针空不空的问题。
堆空间的东西申请好,在用完之后一定要free()掉,以防止堆溢出。
=======================================================
容器适配器
https://blog.csdn.net/thefutureisour/article/details/7751846
三种关联容器提供的接口:
栈支持的操作有:
1.empty()? 堆栈为空则返回真
2.pop()? 移除栈顶元素
3.push()? 在栈顶增加元素
4.size()? 返回栈中元素数目
5.top()? 返回栈顶元素
队列支持的操作有:
1.back()? 返回一个引用,指向最后一个元素
2.empty()? 如果队列空则返回真
3.front()? 返回第一个元素
4.pop()? 删除第一个元素
5.push()? 在末尾加入一个元素
6.size()? 返回队列中元素的个数
优先级队列支持的操作有:
1.empty()? 如果优先队列为空,则返回真
2.pop()? 删除第一个元素
3.push()? 加入一个元素
4.size()? 返回优先队列中拥有的元素的个数
5.top()? 返回优先队列中有最高优先级的元素
=======================================================
cout<<endl;什么意思
cout是c++语言的输出符号。endl是程序的结束符。
cout<<endl是使程序输出结束。
int a=2;
int c=3;
int b=(a>c)?2:3;
cout<<“b:”<<b<<endl;
这样的结果是b为3
cout<<“z:”<<z<<endl; //输出 z: 2
// cout 相当于 printf();是输出函数
cout<<“z:”<<z<<endl; <=> printf(“z:%d\n”,z);
z=a>b?a:a>b?a:b;的意思是 从左往右 ,a>b?a:a>b… 1>2?a:a>b …=>a>b…
=>a>b?a:b =>1>2?1:2 =>z=2
vector 向量 不定
初始长度是零
两个 > > 一定要分开写,否则会被编译器认为是输入流
vector
push_back() – 将元素插入到 vector 尾部
pop_back() – 移除最后一个元素
insert() – 将元素插入指定位置
erase() – 从 vector 中删除指定元素或者指定范围的元素
swap() – 交换两个元素的值
clear() – 清空 vector
size() – vector 中元素个数
#include <stdio.h>
#include
#include <string.h>
#include
#include
#include
showq(q); 输出
!g.empty()判空
size() – 返回队列的大小
=======================================================
sort() 是 STL 中的排序函数
sort(x,x)参数:sort函数一般只对数组元素排序,而且必须知道地址。如对a[0]到a[n-1]共n个元素进行排序,用sort(ar,ar+n)。其中n可以为1,即对一个元素也可以使用sort函数
复杂度是 O(N·log(N)) 而冒泡排序复杂度是?O(N·N) ,N 是排序元素的个数
=======================================================
lower_bound函数 参数
传入参数说明:
_First 要查找区间的起始位置
_Last 要查找区间的结束位置
_Val 给定用来查找的值
_Comp 自定义的表示小于关系的函数对象,根据某个元素是否满足小于关系而返回true或者false
=======================================================
c++编码问题
cstdio
在C++下,若要使用C中已有库中的函数如stdio,文件包含方式为前面加一个c,同时去掉.h后缀,如#include ,同时必须加上using namaspace;对于其他类似的函数同样;
对于C++特有的库,直接用去掉.h后缀的文件包含,并加上using namaspace;