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. set
set这种容器里面存放元素是唯一的,即不可能两个相同的数都存在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. map
map是一种映射关系,一对一,第一个为关键字(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;