STL
1、vector变长数组(动态数组)
可以动态改变数组长度,每次改变时间复杂度大概是O(1)的
系统为某一程序分配空间时,所需时间,与分配大小无关,与分配次数有关
#include<iostream> #include<algorithm> #include<vector> #include<cstring> #include<cstdio> using namespace std; int main() { vector<int> a; //vector<int> a(10); //vector<int> a(10,3); //建立一个长度为10,值全为3的vectoe int L=a.size(); //元素个数,时间复杂度是O(1)的 if(a.empty()); //判断数组是否为空,空的返回teur a.clear(); //清空 int n=a.front(); //返回第一个数 int m=a.back(); //返回第二个数 a.push_back(n); //在vector最后插入一个数n a.pop_back(); //删除最后一个数 //迭代器为begin/end //[] 支持 //支持比较运算,两个vector容器会按照字典序比较vector<int> a(4,3)>vector<int> b(3,4) for(int i=0;i<10;i++) a.push_back(i); for(int i=0;i<a.size();i++) //与下面的等效 cout<<a[i]<<" "; for(vector<int>::iterator i=a.begin();i!=a.end();i++) cout<<*i<<" "; for(auto x:a) //dev好像不支持auto cout<<x<<" "; return 0; }
2、string字符串
string a="yxc"; a+="def"; a+='c'; int L=a.size(); if(a.empty()) a.clear(); string s=a.substr(1,2) //从1位置,取长度位2的子串,要是长度大于原字符串长度,不会多输出。不改变原字符串 string s=a.substr(1); //省略第二个参数,直接输出从1到最后 printf("%s",a.c_str()); //要用printf输出字符串,c_str()返回字符串首地址
3、queue队列、priority_queue优先队列
queue<int>a; a.push(n); //在队尾插入n int n=a.front(); //返回队头元素 int w=a.back(); //返回队尾元素 a.pop(); //弹出对头元素 int l=a.size(); if(a.empty());
priority_queue<int> heap; //默认为大根堆 heap.push(n); int m=heap.top(); //返回堆顶元素 heap.pop(); //弹出堆顶元素 priority_queue<int,vector<int>,greater<int>>heap;//小根堆
4、stack栈
stack<int>a; a.push(n); //向栈顶加入一个元素 int m=a.top(); //返回栈顶元素 a.pop(); //弹出栈顶元素 int l=a.size(); if(a.empty())
5、deque双端队列 队头队尾都可以插入删除,可以随机访问
duque<int>a; a.push_back(n); //在队尾插入n a.push_front(n); //在队首插入元素 int n=a.front(); //返回队头元素 int w=a.back(); //返回队尾元素 a.pop_front(); //弹出队头元素 a.pop_back(); //弹出队尾元素 int l=a.size(); if(a.empty()) a.clear(); //支持[]
6、set、map、multiset、multimap基于平衡二叉树(红黑树),动态维护有序序列
set<int> s;
multiset<int> ms;
s.insert(n); //插入一个元素n
s.find(n); //查找元素n
int sum=s.count(x); //返回x的个数
s.erase(x); //删除所有的x,x如果是迭代器,删除迭代器,复杂度O(k+logn)
int a=lower_bound(x); //返回大于等于x的最小的数的迭代器,不存在返回end
int b=upper_bound(x); //返回大于x的最小的数的迭代器
int l=s.size();
if(s.empty())
s.clear();
map<string,int>a; a["yxc"]=1; //类似数组的用法 insert(); //插入的数是一个pair erase(); //参数为pair或者迭代器 find(); //[]支持,时间复杂度是O(logn) int a=lower_bound(x); //返回大于等于x的最小的数的迭代器,不存在返回end int b=upper_bound(x); //返回大于x的最小的数的迭代器
7、unordered_set、unordered_map、unordered_multiset、unordered_multimap哈希表
unorder_multimap<string,int>a; //与上面对应,但是不支持lower_bound和upper_bound,也不支持迭代器++--
8、bitset压位
在一个字节上存8位,比bool省8倍内存
bitset<10000> s; //<>里写个数 //支持位运算 //支持[] count(); //返回有多少个1 any(); //判断是否至少有一个1 none(); //判断是否全为0 set(); //把所有位置成1 set(k,v); //把第k位变成v reset() //把所有位变成0 flip(); //等价与~ flip(k); //把第k位取反
9、pair二元组
pair<int,int>a; //两个类型是任意的 first是第一个元素 second是第二个元素 支持比较 支持排序,以first为第一个关键字,second为第二个关键字,字典序排列 可以直接这样写 p=make_pair(10,"yxc"); p={10,:yxc}; 要是有三个元素的话,可以pair里面套pair pair<int,pair<int,string>>p;