一、priority_queue(实现堆的用法)
#include <queue>
基本操作
- empty() 如果队列为空,则返回真
- pop() 删除队头元素
- push() 加入一个元素
- size() 返回优先队列中拥有的元素个数
- top() 返回优先队列中有最高优先级的元素
声明方法:
1.普通方法:
priority_queue<int>q; //默认从大到小顺序出队
priority_queue<int,vector<int>,greater<int> >q;; //默认从小到大出队
2.结构体声明方式:
struct node {
int x,y;
friend bool operator < (node a,node b){
return a.x>b.x; //默认按x从小到大的顺序输出
}
}
priority_queue<node>q;
二、set(实现二叉搜索树的用法)
#include <set>
基本操作
- begin() 返回指向第一个元素的迭代器
- clear() 清除所有元素
- count() 返回某个值元素的个数
- empty() 如果集合为空,返回true(真)
- end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
- erase() 删除集合中的元素
- find() 返回一个指向被查找到元素的迭代器
- insert() 在集合中插入元素
- max_size() 返回集合能容纳的元素的最大限值
- size() 集合中元素的数目
- swap() 交换两个集合变量
set的要使用迭代器去访问。
set<int>::iterator iter; //定义一个迭代器变量iter,用法类似指针,*iter表示其指向的值
对于集合来说,一般有并集、交集、差集、补集这几种操作,所以在set的操作中我们也有类似的集合操作。
在#include <algorithm>头文件里。
设有set_A,set_B和用来存储操作结果的set_C。
set_union(A.begin(),A.end(),B.begin(),B.end(),inserter(C,C.begin()));//求并集
set_intersection(A.begin(),A.end(),B.begin(),B.end(),inserter(C,C.begin()));//求交集
std::set_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(C,C.begin()))//求A-(A和B的交集)
std::set_symmetric_difference(A.begin(),A.end(),B.begin(),B.end(),inserter(C,C.begin()))//求A和B的并集减去A和B的交集
for(iter=C.begin();iter!=C.end();iter++)
cout<<*iter<<' ';//查看C的元素,是按升序输出的
自定义set的排序方式
struct intCmp{
bool operator() (const int& a,const int& b) const{
return a>b;
}
};
set<int,intCmp>st;
int main(){
int n,tmp;
cin>>n;
for(int i=0;i<n;i++){
cin>>tmp;
st.insert(tmp);
}
set<int>::iterator it;
for(it=st.begin();it!=st.end();it++){
cout<<*it<<" ";
}
cout<<endl;
return 0;
}