STL和基本数据结构
栈和stack
stack<Type> s; //定义栈,Type为数据类型,例如 int,float,char等 s.push(item); //把item放到栈顶 s.top(); //返回栈顶的元素,但不会删除 s.pop(); //删除栈顶的元素,但不会返回,在出栈时需要进行两步操作 //先top()获得栈顶元素,在pop()删除栈顶元素 s.size(); //返回栈中元素的个数 s.empty(); //检查栈是否为空,如果为空,返回true,否则返回false #include<bits/stdc++.h> using namespace std; int main() { int n; char ch; cin>>n; getchar(); while(n--){ stack<char> s; while(true) { ch=getchar(); if(ch==''||ch=='\n'||ch=EOF){ cout<<s.top(); //输出栈顶 s.pop(); //清除栈顶 } if(ch=='\n'||ch=EOF) break; cout<<" "; } else s.push(ch);//入栈 } return 0; }
队列和queue
与栈恰好相反,栈是先进后出,队列是先进先出
可对比栈来学习:
queue<Type> q; q.push(item); q.front(); //返回队首元素,但不会删除 q.pop(); q.back(); //返回队尾元素 q.size(); q.empty();
优先队列和priority_queue
优先队列,顾名思义就是优先级最高的先出队,他是队列和排序的完美结合,不仅可以存储数据,还可以将这些数据按照设定的规则进行排序,每次的push和pop操作,优先队列都会动态调整,把优先级最高的元素放在前面。
优先队列的有关操作如下:
q.top(); //返回具有最高优先级的元素值,但不删除该元素; q.pop(); //删除最高优先级元素; q.push(item); //插入新元素;
链表和list:
STL的list数据结构的双向链表,它的内存空间可以是不连续的,通过指针来进行数据的访问,他可以高效率地在任意地方删除和插入,插入和删除操作是常数时间的。
比较 list和vector:
(1)vector:插入和删除操作少,随机访问元素频繁;
(2)list:插入和删除频繁,随机访问较少;
Set
set<Type> A; //定义 A.insert(item); //把item放进set A.erase(item) //删除元素item A.clear(); //清空set; A.empty(); //判断是否为空; A.size(); //返回元素个数 A.find(k); //返回一个迭代器,指向键值K; A.lower_bound(k); //返回一个迭代器,指向键值不小于k的第一个元素; A.upper_bound(k); //返回一个迭代器,指向键值大于k的第一个元素;
Sort()
sort() 排序的范围是[first,last),包括first,不包括last;
stable_sort() :当排序元素相等时,保留原来的顺序,在对结构体排序时,当
结构体中的排序元素相等时,如果需要保留原序,可以用stable_sort().
partial_sort():局部推荐。例如有10个数字,求最小的5个数。如果用sort(),
需要先全部排序,再输出前5个,而用partial_sort()可以直接输出前5个。
next_permutation()
用法: 例如3个字符a,b,c组成的序列,next_permutation()能按字典序返回6个组合,即abc,acb,,bac,bca,cab,cba.
每执行一次next_permutation(),就会把新的排列组合放到原来的空间里。
他排列的范围是[first,last),包括first,不包括last。
在使用时,初始序列一般是一个字典序最小的序列,如果不是,可以用sort()排序,得到最小序列,然后再使用next_permutation()。