[ACM] 常用STL
来源:互联网 发布:大张一刀流 知乎 编辑:程序博客网 时间:2024/06/09 23:13
1. stack
- stack<int>st;
- st.push(3);
- st.push(2);
- st.pop();
- int Top = st.top();
- int Size = st.size();
- bool isEmpty = st.empty();
-
- stack<T>st;
如:
- struct Node
- {
- int x,y;
- };
- stack<Node> st;
2. queue
- queue<int>que;
- que.push(3);
- que.push(2);
- que.pop();
- int Front = que.front();
- int Size = que.size();
- bool isEmpty = que.empty();
-
- queue<T>que;
3. priority_queue
优先队列中的元素按照一定的优先级进行排列,对于int型的元素,默认是从大到小进行排列的,队首为最大元素.
- const int len = 5;
- int a[len] = {3, 5, 9, 6, 2};
- priority_queue<int> q;
- for(int i = 0; i < len; ++ i)
- {
- q.push(a[i]);
- }
- for(int i = 0; i < len; ++ i)
- {
- cout<< q.top() <<endl;
- q.pop();
- }
输出的元素依次为 9 6 5 3 2
如果要按照从小到大排列,把priority_queue<int>q;这条语句换成
priority_queue<int,vector<int>,greater<int>>q;就可以实现。
另外我们可以根据需求,自己定义优先级,对’<’符号进行重载,使得队列中的元素按照一定的顺序排列,假设我们定义一个操作系统中作业的结构体,里面有两个元素,一个是作业名char name[5]; 一个是到达时间intarriveTime; 把作业对象放到优先队列里面,要求在优先队列按作业到达时间从小到大排列,即到达时间最小的作业在队首.
- struct Job
- {
- char name[5];
- int arriveTime;
- bool operator < (const Job another)const{
- if(arriveTime > another.arriveTime)
- return true;
- return false;
- }
- }job[3];
-
- int main()
- {
- strcpy(job[0].name, "no1");
- strcpy(job[1].name, "no2");
- strcpy(job[2].name, "no3");
- job[0].arriveTime = 2;
- job[1].arriveTime = 1;
- job[2].arriveTime = 3;
-
- priority_queue<Job> que;
- que.push(job[0]);
- que.push(job[1]);
- que.push(job[2]);
- for(int i = 0; i < 3; ++ i)
- {
- Job tempJob = que.top();
- que.pop();
- cout<< tempJob.name <<" "<<tempJob.arriveTime<<endl;
- }
- return 0;
- }
输出为:
no2 1
no1 2
no3 3
实现了优先队列中的作业按照到达时间排序.
4. vector
vector是一种容器,可以看做是动态的数组.
- vector<int>vec;
- vec.push_back(2);
- vec.push_back(4);
- int Size = vec.size();
- cout<< vec[1] <<endl;
-
- for(int i = 0; i < vec.size(); ++ i)
- {
- cout<< vec[i] << " ";
- }
- cout<<endl;
-
- vector<int>::iterator it;
- for(it = vec.begin(); it != vec.end(); ++ it)
- {
- cout<< *it <<" ";
- }
- cout<<endl;
-
- vec.insert(vec.begin() + 1, 6);
- vec.erase(vec.begin() + 1);
- vec.clear();
另外也可以定义二维动态数组即vector<int>vec[2];也就是两个容器,用它可以很方便的保存有向图的邻接表,即vec[i]中存放的是与第i个顶点相邻的顶点(从顶点i出发),.其操作只要把上述代码中的vec改成vec[i] 就可以.
5. setset这种容器里面存放元素是唯一的,即不可能两个相同的数都存在set里面,set的效率比较高,起内部采用了高效的平衡检索二叉树:红黑树。插入的元素按从小到大自动排好序,第一个元素为最小值。
- set<int>st;
- st.insert(2);
- st.insert(1);
- st.insert(3);
- st.insert(8);
-
- int Size = st.size();
- bool isEmpty = st.empty();
- int has1 = st.count(1);
- int has2 = st.count(6);
- st.erase(1);
- bool inSet = (st.find(-2)!= st.end());
- cout<<*st.lower_bound(1)<<endl;
- cout<<*st.upper_bound(1)<<endl;
-
- set<int>:: iterator it;
- for(it = st.begin(); it != st.end(); ++ it)
- {
- cout<< *it <<" ";
- }
- cout<<endl;
-
- st.clear();
6. mapmap是一种映射关系,一对一,第一个为关键字(first),第二个为键值(second),关键字唯一,map中的元素按关键字有序. 实际应用中要考虑好关键字和键值代表的意义,灵活运用。
比如:
- map<string, int> mp;
-
- cout<< mp[“hello”] <<endl;
-
-
- mp.clear();
- mp.insert(make_pair("hello",1));
- mp.insert(make_pair("world",3));
- mp.insert(make_pair("apple",1));
- cout<<mp.size()<<endl;
-
- map<string, int>:: iterator it;
- for(it = mp.begin(); it!= mp.end(); ++ it)
- {
- cout<<it->first<<" "<<it->second<<endl;
- }
输出如下:
apple 1
hello 1
world 3
可以发现元素是按关键字从小到大排好序的
- cout<< mp[“hello”]<<end;
- mp[“hello”] ++ ;
-
- bool inMap = mp.count(“hello”);
- inMap = (mp.find("hello") != mp.end());
-
- for(it = mp.begin(); it != mp.end(); ++ it)
- {
- if(it->first == "hello")
- {
- mp.erase(it);
- break;
- }
- }
7. sort头文件#include<algorithm>
使用sort可以很方便的对数组进行进行排序,它可以传两个或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一个地址,也就是排序的区间为[a,b),比如有一个数组 int a[5], 使得a[0] 到a[4]从小到大有序,只要写 sort(a, a + 5)就可以了,通用sort(a, a+ n);// n为元素个数。sort内部采用的是快速排序,一般情况下效率很高.
- const int n = 3;
- int arr[n] = {1, 3, 2};
- sort(arr,arr+n);
- for(int i = 0; i < n; ++ i)
- cout<< arr[i] <<endl;
另外,我们也可以按照自己的需求进行元素排序,元素可以是结构体,这里就用到了第三个参数,比较函数,告诉计算机按照什么顺序进行排序。
比如:按照从大到小排序
- bool cmp(int a, int b)
- {
- if(a >= b)
- return true;
- return false;
- }
主函数中: sort(arr, arr+n,cmp);
再比如下面结构体,要按照学生的年龄从小到大排序.
- struct Student
- {
- int age;
- string name;
- }student[3];
-
- bool cmp(Student a, Student b)
- {
- if(a.age <= b.age)
- return true;
- return false;
- }
-
- student[0].name = "aa";student[0].age = 15;
- student[1].name = "bb";student[1].age = 10;
- student[2].name = "cc";student[2].age = 8;
- sort(student, student+3, cmp);
- for(int i = 0; i < 3; ++ i)
- cout<< student[i].name <<" "<<student[i].age<<endl;
输出:
cc 8
bb 10
aa 15
8. cmath- cout<< log2(8) <<endl;
- cout<< log10(100) <<endl;
- cout<< log(20) <<endl;
补充:-
- vector<int>v;
- v.erase(v.begin() + 2);
- v.erase(v.begin() + 1, v.begin() + 5);
- sort(v.begin(), v.end());
-
- reverse(v.begin(), v.end());
-
-
- string s;
- s = "123456";
- string::iterator it;
- it = s.begin();
- s.insert(it + 1, 'p');
- s.erase(it + 3);
- s = "abc123456";
- s.replace(3, 3, "good");
- reverse(s.begin(), s.end());
-
-
- set<int>st;
-
- set<int>::reverse_iterator rit;
- for(rit = st.rbegin(); rit != st.rend(); rit ++)
- {
- cout << *rit << endl;
- }
-
-
- multiset<int> ms;
- int n = ms.erase(3);
- multiset<int>::iterator it;
- it = ms.find(3);
- if(it != ms.end())
- {
- cout << *it <<endl;
- }
- else
- {
- cout<< "not find it"<<endl;
- }
-
-
- map<int> mp;
- mp.erase(2);
- map<int>::iterator it;
- it = mp.find(2);
- if(it != mp.end())
- {
- cout << (*it).first << (*it).second <<endl;
- }
-
- struct Info
- {
- string name;
- float score;
-
- bool operator < (const Info &a) const
- {
-
- return a.score < score;
- }
- };
-
- map<Info, int> mmp;
-
-
- multimap<string, double>m;
- m.insert(pair<string, double> ("jack", 20.4));
- m.insert(pair<string, double> ("jack", 34.1));
- m.erase("jack");
-
-
-
-
- push_back()方法在尾部插入元素,不断扩张队列
- push_front()和insert()在首部和中间位置插入元素,只是将原位置上的元素值覆盖,不会增加新元素
- deque<int> d;
- d.push_back(1);
- d.push_back(2);
- d.push_back(3);
- d.insert(d.begin() + 1, 88);
- cout << d[0] << d[1] << d[2] <<endl;
- d.pop_front();
- d.pop_back();
- d.erase(d.begin() + 1);
-
-
-
- list<int> l;
- l.push_back(2);
- l.push_back(1);
- l.push_back(5);
- l.push_front(8);
- list<int>::iterator it;
- it = l.begin();
- it ++;
- l.insert(it, 20);
- for(it = l.begin(); it != l.end(); it ++)
- {
- cout << *it <<endl;
- }
- l.remove(2);
- l.pop_front();
- l.pop_back();
- l.sort();
- l.unique();
-
-
-
- bitset<10>b;
-
- b[1] = 1;
- b[6] = 1;
- b[9] = 1;
-
- for(int i = b.size() - 1; i >= 0; i --)
- {
- cout << b[i] << " ";
- }
- b.set();
- b.set(1, 1);
- b.set(6, 1);
- b.set(9, 1);
- b.reset(9);
- cout << b <<endl;