STL是个宝
由于C++ STL的开放,代替了那些需要老老实实写结构体来实现堆栈二叉树等数据结构的C等语言,很多算法不需要自己来实现了
所有容器都有的两个时间复杂度为O(1)的方法:
a.size() 返回容器中元素的个数
a.empty() 返回容器是否为空
vector也叫变长数组,即数组长度可以动态变化。用到了倍增的思想
vector<int> a(10); 开一个长度为10 的vector数组
vector<int> a(10,3); 把每一个元素初始化为特定的3
vector<int> a[10]; 定义10个vector
vector<int> a; 普通定义法
clear() 清空方法
size() 返回元素个数方法
empty() 判断是否为空
front()/back() 返回vector 第一个数和最后一个数
push_back()/pop_back() 向数组尾插入/删除
begin()/end() vector的第0个数/vector的最后一个数的后面一个数
这个与sort()函数对应,sort函数传入末地址项需要+1才能正常用
[ ]读取数组中的某个数,和普通数组一样
tips:C++里有一个特点 ,当操作系统为某一个程序或者进程分配空间的时候,所需的时间基本上和空间大小无关,仅仅与申请次数无关
举个栗子就是:申请一个长度为1000的数组和1000个长度为1的数组 ,时间上有1000倍的区别。
所以进行优化时优化的思路是要尽量减少vector申请空间的次数,可以浪费空间
总结起来:
vector的倍增思想如下,首先申请32位,当32位不够的时候,新建一个长度大一倍的vector,然后把旧32位copy到新32位上,这样的话就新开了32位出来。
vector<int> a(4,3),b(3,4);
if(a<b) puts("yes");
输出结果显示a<b
这种比较是按字典序比较的
在数学中,字典或词典顺序(也称为词汇顺序,字典顺序,字母顺序或词典顺序)是基于字母顺序排列的单词按字母顺序排列的方法。 这种泛化主要在于定义有序完全有序集合(通常称为字母表)的元素的序列(通常称为计算机科学中的单词)的总顺序。
对于数字1、2、3…n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。
pair
访问元组中的第一/第二个元素的方法是first()和second()方法
pair<int,string> p;
p = make_pair(10,"abc");
p={20,"abc"}
假设一个东西有着两种不同的属性,并需要按照某一个数为标准进行排序。
即可把要排序的关键字放到first里面,即可完成排序
pair是支持比较运算的,以first为第一关键字,以second为第二关键字进行比较(也相当于是一种字典序)
多元组存储方法为
pair<int,pair<int,int>> p;
pair已经帮我们实现了一个结构体,且帮我们写好了一个比较函数
处理字符串的利器
string a ="abc";
a+="def";
a+='g';
输出a: abcdefg
substr返回的是一个子串,有两个要传入的参数,第一个参数是起始位置,第二个参数是子串的长度
a.substr(1,10);
第二个参数可省略,省略的话直接叫后面的字符串输出完
当长度大小到顶了,就输出到最后一位为止
printf("%s",a.c_str());
即可正常输出字符串a
先进先出
堆是一个二叉树,父节点的值一定比子节点大。所以队头一定是全队里最大的。
定义的堆默认是大根堆,即根节点最大
priority_queue,greater> heap
先进后出
队头队尾均可插入删除,队内元素可直接访问,相当于加强版的vector
什么操作基本都支持,但是速度很慢,用的话要谨慎
size()
empty()
clear()
front()
back()
push_back()/pop_back()
push_front()/pop_front()
基于平衡二叉树(红黑树,是平衡二叉树的一种)来实现的,本质上是动态地维护一个有序的序列
所有操作的时间复杂度是O(logn)
set与multiset的区别:set每个元素最多只出现一次,大于一次的操作都会被忽略,但是multiset没有这个限制,每个元素可以出现多次。
insert() 插入一个数
find() 查找一个数
count() 返回某一个数的个数。当然,在set中只可能取0或1。
erase() 两种参数:
(1)输入的是一个数x,删除所有x
(2)输入一个迭代器,删除这个迭代器
核心操作:lower_bound()/upper_bound()
lower_bound() 返回大于等于x的最小数的迭代器
upper_bound() 返回大于x的最小数的迭代器
所有操作的时间复杂度是O(logn)
首先说map:
map是从键(key)到值(value)的映射。因为重载了[ ]运算符,map像是更高级版的数组。
例:
用一个mapmonth_name来表示“月份名字到月份编号”的映射,然后用month_name[“July”]=7这样的方式来赋值。
multimap:
map 与 multimap是存储key-value(键-值 对)类型的容器。
不同之处在于:map只允许key与 value一一对应;multimap一个key可对应多个value;
insert() 插入的参数是pair
erase() 输入的参数是pair或者迭代器
lower_bound() 返回大于等于x的最小数的迭代器
upper_bound() 返回大于x的最小数的迭代器
[ ] 与普通数组类似
C++中已经实现好了的哈希表
它们是基于哈希表实现的
unordered造成的影响是所有基于排序的方法都不能用,但是时间复杂度由O(n)变为O(1)