C++STL库用法总结(set,map,priority_queue)

最近整理了一下C++总常用的STL,由于匆忙,如有错误,欢迎指正。

优先队列 priority_queue

关于优先队列,它的实现就是数据结构的大顶堆跟小顶堆,如有疑问可自行百度,不在做说明。

优先队列的基本用法跟队列没什么两样,不同的是queue的取队首元素为q.front()而priority_queue是q.top(),并且优先队列可以根据自定义来实现队列中元素的排序,其原理就是利用堆排序,其复杂度为O(logn)。

基本操作:

empty()      如果队列为空,则返回真

pop()    删除对顶元素,删除第一个元素

push()        加入一个元素

size()      返回优先队列中拥有的元素个数

top()     返回优先队列对顶元素,返回优先队列中有最高优先级的元素

声明方式:

priority_queue q  //其相当于priority_queue ,less > 数值大的先出(默认为大顶堆)

priority_queue ,greater > //其排序规则是数值小的先出

自定义优先级:

struct cmp {     

  bool operator  ()(int x, int y)     

  {        

     return x > y;

  }

};

priority_queue, cmp> q;    //定义方法

结构体声明方式:

typedef struct node
{
    int x,y;
    bool operator < (const node &a) const
    {
        return x < a.x;//其排序规则为x小的小
    } 
}node;

priority_queueq;   //定义方法

实例:

#include
using namespace std;
typedef struct node
{
	int x,y;
	bool operator < (const node &a) const
	{
		return x!=a.x?x q;
	for(int i = 1;i <= 3;i++)
	{
		node t;
		scanf("%d%d",&t.x,&t.y);
		q.push(t);
	}
	while(!q.empty())
	{
		node t = q.top();
		q.pop();
		
		cout<

双端队列 deque

其实双端队列我更认为应该叫做双端栈(瞎起的名字),因为它像是一个两头的栈,它的原则是后进先出,而队列是先进先出

本操作:

push_back(x)/push_front(x)//把x压入后/前端
back()/front() //访问(不删除)后/前端元素
pop_back() pop_front() //删除后/前端元素 
empty() //判断deque是否空 
size() //返回deque的元素数量 
clear() //清空deque 

声明方式:

deque q;

实例:

#include
using namespace std;
#define ll long long
int main(){
	deque  q;
	int t;
	for(int i = 1;i <= 5;i++)
	{
		scanf("%d",&t);
		if(t&1)
		{
			q.push_front(t);//从开始压入 
		}
		else
		{
			q.push_back(t);//结尾压入 
		}
	}
	//迭代器查询
	deque  ::iterator it; 
	for(it=q.begin();it!=q.end();it++)
	{
		cout<<*it<

set容器

set容器是默认从小到大排序并且去重,还有个容器交multiset,此容器跟set一样,但是可以允许存在重复元素,其用法与set完全一致,所以不再补充。

基本操作:

    begin()  返回set容器的第一个元素,注意返回的是地址,以下均是
    end()   返回set容器的最后一个元素
    clear()  删除set容器中的所有的元素
    empty()  判断set容器是否为空
    max_size()  返回set容器可能包含的元素最大个数
    size()  返回当前set容器中的元素个数
    rbegin  返回的值和end()相同
    rend()  返回的值和rbegin()相同 
    count(int value) 查询某个键值出现的次数,但对于set来说,只能存在不重复的数,所以其值只可能是0或1
    erase(iterator或者value) 删除定位器指向的值或者删除键值为value的值
    find(value) 查找值为value的值如果不存在返回end,返回的也是地址

声明方式:

set s//默认从小到大排序并且去重

set s

自定义优先级:

struct cmp
{
    bool operator()(const int& x,const int& y) const
    {
        return x>y;
    }
};

set s1;    //定义方法

结构体声明方式:

typedef struct node
{
    int x,y;
    friend bool operator < (const node& a,const node& b)
    {
        return a.x < b.x;
    }
    bool operator < (const node& a)const
    {
        return x     }

//以上两种方法均可
}node;

set s  //定义方法

实例:

#include
using namespace std;
#define ll long long
typedef struct node
{
	int x,y;
	/*friend bool operator < (const node& a,const node& b)
	{
		return a.x < b.x;
	}*/
	bool operator < (const node& a)const
	{
		return xy;
	}
};
set  s1;
set  s2;
int main()
{
	//迭代器
	
	for(int i = 0;i < 10;i++)
	{
		int x;
		cin>>x;
		s1.insert(x);
	}
	set  ::iterator it;
	for(it = s1.begin();it != s1.end();it++)
	{
		cout<<*it<>t.x>>t.y;
		s2.insert(t);
	}
	set  ::iterator it;
	for(it = s2.begin();it != s2.end();it++)
	{
		cout<<(*it).x<<" "<<(*it).y< > s1;
	set  ::iterator it1;
	for(it1 = s1.begin();it1!=s1.end();it1++)
	cout<<*it1<<" ";
	cout<

 

map容器

C++中map容器提供一个键值对容器,同set一样,map与multimap差别仅仅在于multiple允许一个键对应多个值。  

基本操作:

    begin()         返回指向map头部的迭代器
    clear()        删除所有元素
    count()         返回指定元素出现的次数
    empty()         如果map为空则返回true
    end()           返回指向map末尾的迭代器
    equal_range()   返回特殊条目的迭代器对
    erase()         删除一个元素
    find()          查找一个元素
    get_allocator() 返回map的配置器
    insert()        插入元素
    key_comp()      返回比较元素key的函数
    lower_bound()   返回键值>=给定元素的第一个位置
    max_size()      返回可以容纳的最大元素个数
    rbegin()        返回一个指向map尾部的逆向迭代器
    rend()          返回一个指向map头部的逆向迭代器
    size()          返回map中元素的个数
    swap()           交换两个map
    upper_bound()    返回键值>给定元素的第一个位置
    value_comp()     返回比较元素value的函数

声明方式:

map mmp;

实例

#include
using namespace std;
#define ll long long
map  mmp;
int main()
{
	for(int i = 0;i < 5;i++)
	{
		string s;
		cin>>s;
		mmp[s]++;//下标 
	}
	mmp.insert(pair("lgy",999));
	//map插入有两中不同的方法,一种是insert另一种是直接利用下标进行插入,不同的是insert插入不会覆盖而利用下标可以覆盖。 
	cout< ::iterator it;
	for(it = mmp.begin();it!=mmp.end();it++)
	{
		cout<<(*it).first<<" "<<(*it).second<

vector容器

vector可以理解为就是数组的使用,但是它的好处是动态开辟空间,节约了空间

基本用法:

1.构造函数
    vector():创建一个空vector
    vector(int nSize):创建一个vector,元素个数为nSize
    vector(int nSize,const t& t):创建一个vector,元素个数为nSize,且值均为t
    vector(const vector&):复制构造函数
    vector(begin,end):复制[begin,end)区间内另一个数组的元素到vector中
2.增加函数
    void push_back(const T& x):向量尾部增加一个元素X
    iterator insert(iterator it,const T& x):向量中迭代器指向元素前增加一个元素x
    iterator insert(iterator it,int n,const T& x):向量中迭代器指向元素前增加n个相同的元素x
    iterator insert(iterator it,const_iterator first,const_iterator last):向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
3.删除函数
    iterator erase(iterator it):删除向量中迭代器指向元素
    iterator erase(iterator first,iterator last):删除向量中[first,last)中元素
    void pop_back():删除向量中最后一个元素
    void clear():清空向量中所有元素
4.遍历函数
    reference at(int pos):返回pos位置元素的引用
    reference front():返回首元素的引用
    reference back():返回尾元素的引用
    iterator begin():返回向量头指针,指向第一个元素
    iterator end():返回向量尾指针,指向向量最后一个元素的下一个位置
    reverse_iterator rbegin():反向迭代器,指向最后一个元素
    reverse_iterator rend():反向迭代器,指向第一个元素之前的位置
5.判断函数
    bool empty() const:判断向量是否为空,若为空,则向量中无元素
6.大小函数
    int size() const:返回向量中元素的个数
    int capacity() const:返回当前向量张红所能容纳的最大元素值
    int max_size() const:返回最大可允许的vector元素数量值
7.其他函数
    void swap(vector&):交换两个同类型向量的数据
    void assign(int n,const T& x):设置向量中第n个元素的值为x
    void assign(const_iterator first,const_iterator last):向量中[first,last)中元素设置成当前向量元素

实例

#include
using namespace std;
#define ll long long
//vector 声明
vector  v;
vector  a(10,3);//声明大小为10,初始值为3,相当于一维数组 
vector  b[200];//声明大小为200的向量,相当于二维数组 
int main()
{
	v.push_back(10);
	cout<<*v.begin()<<" "<>a[0];
	cout<>x;
		v.push_back(x);
		s.insert(i);
	}
	vector  ::iterator it;
	for(it = v.begin();it!=v.end();it++)
	cout<<*it<<" ";
	cout<

 

你可能感兴趣的:(算法设计与分析,map,priority_queue,deque,set)