AcWing STL初步学习
Posted qingyuyyyyy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AcWing STL初步学习相关的知识,希望对你有一定的参考价值。
vector, 变长数组,倍增的思想 size() 返回元素个数 empty() 返回是否为空 clear() 清空 front()/back() push_back()/pop_back() begin()/end() [] 支持比较运算,按字典序 pair<int, int> first, 第一个元素 second, 第二个元素 支持比较运算,以first为第一关键字,以second为第二关键字(字典序) string,字符串 size()/length() 返回字符串长度 empty() clear() substr(起始下标,(子串长度)) 返回子串 c_str() 返回字符串所在字符数组的起始地址 queue, 队列 size() empty() push() 向队尾插入一个元素 front() 返回队头元素 back() 返回队尾元素 pop() 弹出队头元素 priority_queue, 优先队列,默认是大根堆 push() 插入一个元素 top() 返回堆顶元素 pop() 弹出堆顶元素 定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q; stack, 栈 size() empty() push() 向栈顶插入一个元素 top() 返回栈顶元素 pop() 弹出栈顶元素 没有clear deque, 双端队列 size() empty() clear() front()/back() 返回第一个或最后一个元素 push_back()/pop_back() push_front()/pop_front() begin()/end() [] set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列 size() empty() clear() begin()/end() ++, -- 返回前驱和后继,时间复杂度 O(logn) set/multiset insert() 插入一个数 find() 查找一个数 count() 返回某一个数的个数 erase() (1) 输入是一个数x,删除所有x O(k + logn) (2) 输入一个迭代器,删除这个迭代器 lower_bound()/upper_bound() lower_bound(x) 返回大于等于x的最小的数的迭代器 upper_bound(x) 返回大于x的最小的数的迭代器 map/multimap insert() 插入的数是一个pair erase() 输入的参数是pair或者迭代器 find() [] 注意multimap不支持此操作。 时间复杂度是 O(logn) lower_bound()/upper_bound() unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表 和上面类似,增删改查的时间复杂度是 O(1) 不支持 lower_bound()/upper_bound(), 迭代器的++,-- bitset, 圧位 bitset<10000> s; ~, &, |, ^ 支持所有运算 >>, << ==, != [] 也可以当成数组来用 count() 返回有多少个1 any() 判断是否至少有一个1 none() 判断是否全为0 set() 把所有位置成1 set(k, v) 将第k位变成v reset() 把所有位变成0 flip() 等价于~ 取反 flip(k) 把第k位取反
vector
/* vector, 变长数组,倍增的思想 size() 返回元素个数 //所以容器都有 empty() 返回是否为空 //所有容器都有 clear() 清空 队列没有清空 front()/back() //返回第个数字或者最后一个 push_back()/pop_back() begin()/end() 迭代器 [] 支持比较运算,按字典序 */ #include<bits/stdc++.h> using namespace std ; int main() { // vector<int>a; // vector<int>a[10]; //vector数组,表示定义了十个vector // vector<int>a(10);//长度为10的vector vector<int>a(10,3);//长度为10的vector ,且每一个数字初始化为3 for(auto x:a) cout<<x<<endl; } #include<bits/stdc++.h> using namespace std ; int main() { vector<int>a; for(int i=0;i<10;i++) a.push_back(i); for(int i=0;i<a.size();i++) cout<<a[i]<<" "; cout<<endl; for(vector<int>::iterator i=a.begin();i!=a.end();i++) cout<<*i<<" "; cout<<endl; for(auto i=a.begin();i!=a.end();i++) cout<<*i<<" "; cout<<endl;//迭代器可以看作指针,*可以简化掉 for(auto x:a) cout<<x<<" "; cout<<endl; } #include<bits/stdc++.h> using namespace std ; int main() { vector<int>a(4,3),b(3,4); //按字典排序 if(a<b) puts("a<b"); }
pair
/* pair<int, int> first, 第一个元素 second, 第二个元素 支持比较运算,以first为第一关键字,以second为第二关键字(字典序) */ #include<bits/stdc++.h> using namespace std ; int main() { pair<int,string>p; // pair<int,pair<int,int>>p 存储三个 p=make_pair(10,"ldy"); cout<<p.first<<endl<<p.second<<endl; return 0; }
string
/* string,字符串 size()/length() 返回字符串长度 empty() clear() substr(起始下标,(子串长度)) 返回子串 c_str() 返回字符串所在字符数组的起始地址 */ #include<bits/stdc++.h> using namespace std ; int main() { string a="ldy"; a+="def"; a+=‘c‘; cout<<a<<endl; cout<<a.substr(1,3)<<endl; // substr(x,y) 起始位置,长度 cout<<a.substr(1,10)<<endl; //当末尾大于长度,就输出到最后一个为止 cout<<a.substr(1,10)<<endl; //输出从1开始的整个字符串 printf("%s ",a.c_str());//用scanf输出 return 0; }
queue
/* queue, 队列 size() empty() push() 向队尾插入一个元素 front() 返回队头元素 back() 返回队尾元素 pop() 弹出队头元素 没有clear函数 */ #include<bits/stdc++.h> using namespace std ; int main() { queue<int>q; q=queue<int>(); //因为没有clear 所以如果要情空,可以重新定义 return 0; }
priority_queue
/*priority_queue, 优先队列,默认是大根堆 push() 插入一个元素 top() 返回堆顶元素 pop() 弹出堆顶元素 定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q; */ #include<bits/stdc++.h> using namespace std ; int main() { priority_queue<int,vector<int>,greater<int>>heap;//小根堆 }
map
//像数组一样来用 #include<bits/stdc++.h> using namespace std ; int main() { map<string,int>a; a["ldy"]=1; cout<<a["ldy"]<<endl; }
以上是关于AcWing STL初步学习的主要内容,如果未能解决你的问题,请参考以下文章