title: C++的STL库用法
date: 2019-05-31 15:23:19
tags: STL
C++的STL库用法
empty()
,size()
所有容器都有,时间复杂度为O(1)
直接有一个变量存储size,直接取出来的
vector 变长数组 倍增的思想
系统为某一个程序分配空间所需的时间 与空间大小无关,与申请次数有关
由此可以知道,vector的优化,主要在于减少申请空间次数
front()
返回第一个数
back()
返回最后一个数
push_back()
向vector的最后插入一个数
pop_back()
向vector的最后删除一个数
有迭代器 begin()
vector的第0个数,end()
vector的最后一个数的后面一位
支持随机存取 v[i]
(和数组一样)
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> v;
vector<int> v(10);//定义一个为长度为10的vector
vector<int> v(10,3);//长度为10,每个数初始化为3
vector<int> v[10];//定义了10个vector
v.size();//返回vector中元素个数
v.empty();//返回vector是否为空
v.clear();//清空 队列就没有
//三种遍历方式
for(int i=0;i<10;i++)
v.push_back(i);//插入
for(int i=0;i<v.size();i++)
cout<<v[i]<<" ";
vector<int>::iterator it;//迭代器
for(it=v.begin();i!=v.end();i++)
cout<<(*it)<<" ";
for(auto x:v)
cout<<x<<" ";//c++的范围遍历,稍微快一些
return 0;
}
支持比较运算
vector<int> a(4,3),b(3,4);
if(a<b)//按字典序比较的 4个3 小于 3个4
printf("Yes\n");
pair 存储一个二元组
pair<int,string> p;
p.first
取得这个pair的第一个元素
p.second
取得这个pair的第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
p=make_pair(2,"abc")
或 p={2,"abc"}
构造一个pair
pair<int,pair<int,int> > p
存储三个属性
string
substr()
返回子串
c_str()
返回string数组对应的头指针
size()
,empty()
,clear()
#include <iostream>
#include <string>
using namespace std;
int main()
{
string s="abc";
s+="de";
s+='f';
cout<<s<<endl;//s=abcdef
cout<<s.substr(1,2)<<endl;//(起始下标,长度)
//bc
//若第二个参数大于了字符串长度,则输出完字串为止
cout<<s.substr(1)<<endl;//bcdef
//省略第二个参数则返回从起始下标开始的整个字串
printf("%s",s.c_str());//如果要用%s来输出的话
//c_str()返回数组起始地址
return 0;
}
queue
push()
队尾插入一个元素
front()
返回队头元素
pop()
队首弹出一个元素
back()
取队尾元素
size()
,empty()
,没有clear()
如果想清空一个队列,重新构造一个即可 q=queue<int>();
priority_queue 优先队列 实际是个堆
默认是大根堆
push()
往堆里插入元素
top()
返回堆顶元素
pop()
把堆顶元素弹出
无clear()
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{
priority_queue<int> heap;//默认是大根堆
//如果我想让它变成小根堆
//1.插入负数
heap.push(-x);
//2.定义成小根堆
priority_queue<int,vector<int>,greater<int> > heap;
return 0;
}
stack 栈
push()
往栈顶添加元素
top()
返回栈顶元素
pop()
弹出栈顶元素
size()
,empty()
和 队列 基本差不多
deque 双端队列 队头队尾都可以插入删除,且可以支持随机访问
像是加强版的vector,缺点是比较慢,一般不会用,因为
size()
,empty()
,clear()
front()
,back()
push_back()
,pop_back()
push_front()
,pop_front()
begin()
,end()
[]
基于平衡二叉树(红黑树)来实现,动态维护有序序列
红黑树是平衡二叉树的一种
以下容器都有size()
,empty()
,clear()
,
begin()
,end()
——O(log n) 有++,- -操作,返回前驱和后继
1.set 所有时间复杂度为O(log n) / multiset
find()
//查找一个数,不存在就返回迭代器end()
insert()
插入一个数
count()
返回某一个数出现的次数(即 个数)
erase()
有两种用法:
erase(i)
参数是数字i,删除所有等于i的数,时间复杂度O(k+logn),k是i的个数
若参数是一个迭代器,则删除的是这个迭代器
最核心的两个操作:
lower_bound(x)
返回大于等于x的最小的数的迭代器
upper_bound(x)
返回大于x的最小的数的迭代器
set<int> s;//不能有重复元素
multiset<int> ms;//可以有重复元素
2.map / multimap
insert()
插入的数是一个pair
erase()
输入的参数是pair或者迭代器
find()
[]
注意 multimap 不支持此操作, 时间复杂度是 O(logn)。(数组直接取下标是O(1)的)
lower_bound()/upper_bound()
基于哈希表来实现 C++里实现的hash
和上面类似,增删改查的时间复杂度为O(1),但不支持 lower_bound()/upper_bound() ,因为内部是无序的
也不支持迭代器的++ - -
1.unordered_set
2.unordered_map
3.unordered_multiset
4.unordered_multimap
bitset 压位 状态压缩
比如,一个整数int ,4个字节,32位
其实我们只需要知道每一位上的数是0是1
c++里的bool数组是一个字节的,如果我们要开一个1024的bool数组
需要 1024Byte ——>1KB 内存
而bitset是在每一位上存8位,比正常的数字省8倍空间
则需 128B 内存
我们如果想存一个10000*10000的bool矩阵,就需要
1
0
8
B
y
t
e
=
1
0
5
K
B
=
100
M
B
10^8Byte=10^5KB=100MB
108Byte=105KB=100MB
若题目限制空间位64MB
我们就需要用bitset来存,就只需12M的空间了
头文件#include <bitset>
bitset<10000> s;//括号内写的是长度,开一个长度为10000的bitset
~s;//取反操作
&,|,^ //最后一个是异或
>>,<< //支持移位操作
==,!=
[] //可以取出某一位,看是0是1
count(); //返回有多少个1
any();//判断是否 至少有一个1
none(); //判断是否全为0
set();//把所有位置成1
set(k,v);//将第k位变成v
reset(); //把所有位置成0
flip();//取反,等价于~
flip(k);//把第k位取反
测试:
#include <iostream>
#include <bitset>
#include <string>
using namespace std;
int main()
{
bitset<7> bst1;
bitset<7> bst2;
cout << "1) " << bst1 << endl; //输出 1) 0000000
bst1.set(0,1);//将第0位变成1,bst1变为 0000001
cout << "2) " << bst1 << endl; //输出 2) 0000001
bst1 <<= 4; //左移4位,变为 0010000
cout << "3) " << bst1 << endl; //输出 3) 0010000
bst2.set(2);//第二位设置为1,bst2变成 0000100
bst2 |=bst1; // bst2变成 0010100
cout << "4) " << bst2 << endl; //输出 4) 0010100
cout << "5) " << bst2.to_ulong () << endl; //输出 5) 20
bst2.flip(); //每一位都取反,bst2变成 1101011
bst1.set(3); //bst1变成 0011000
bst2.flip(6); //bst2变成 0101011
bitset<7> bst3 = bst2^ bst1;//bst3 变成 0110011
cout << "6) " << bst3 << endl; //输出 6) 0110011
cout << "7) " << bst3[3] << "," << bst3[4] << endl; //输出 7) 0,1
return 0;
}
这个博客有相关例题
想知道更多函数使用方法:C++ reference
算法竞赛中 C++ 的 STL 库有哪些奇技淫巧,参见知乎