C++STL容器运用

priority_queue(优先队列)是定义在 <queue> 头文件中的一个模板类,与队列相比,优先队列不是按照入队顺序出队,而是按照队列中元素的优先权出队。默认情况下,按照大者优先的顺序出队,也可以指定算子来指定所需的优先顺序。

priority_queue<int> q1;  //定义数据类型为int,默认大的先出队
priority_queue< pair<int,int> > q2;  //定义数据类型为pair,默认大的先出队
priority_queue<int, vector<int>, greater<int> > q3; //定义小的先出队

queue<int>q 的基本操作有:(先进先出)
入队,如例:q.push(x); 将x 接到队列的末端。
出队,如例:q.pop(); 弹出队列的第一个元素,注意,并不会返回被弹出元素的值。
访问队首元素,如例:q.front(),即最早被压入队列的元素。
访问队尾元素,如例:q.back(),即最后被压入队列的元素。
判断队列空,如例:q.empty(),当队列空时,返回true。

stack的基本操作:(先进后出)

size() 返回栈的元素数 O(1)
top() 返回栈顶的元素 O(1)
pop() 从栈中取出并删除元素 O(1)
push(x) 向栈中添加元素x O(1)
empty() 在栈为空时返回true O(1)

vector:

(1)a.assign(b.begin(), b.begin()+3);//b为向量,将b的0~2个元素构成的向量赋给a
(2)a.assign(4,2);//是a只含4个元素,且每个元素为2
(3)a.back();//返回a的最后一个元素
(4)a.front();//返回a的第一个元素
(5)a[i]; //返回a的第i个元素
(6)a.clear();//清空a中的元素
(7)a.empty();//判断a是否为空,空则返回ture,不空则返回false
(8)a.pop_back();//删除a向量的最后一个元素
(9)a.erase(a.begin()+1,a.begin()+3);//删除a中第1个(从第0个算起)到第2个元素,也就是说删除的元素从a.begin()+1算起(包括它)一直到a.begin()+3(不包括它)
(10)a.push_back(5);//在a的最后一个向量后插入一个元素,其值为5
(11)a.insert(a.begin()+1,5);//在a的第1个元素(从第0个算起)的位置插入数值5,如a为1,2,3,4,插入元素后为1,5,2,3,4
(12)a.insert(a.begin()+1,3,5);//在a的第1个元素(从第0个算起)的位置插入3个数,其值都为5
(13)a.insert(a.begin()+1,b+3,b+6);//b为数组,在a的第1个元素(从第0个算起)的位置插入b的第3个元素到第5个元素(不包括b+6),如b为1,2,3,4,5,9,8,插入元素后为1,4,5,9,2,3,4,5,9,8
(14)a.size();//返回a中元素的个数;
(15)a.capacity();//返回a在内存中总共可以容纳的元素个数
(16)a.rezize(10);//将a的现有元素个数调至10个,多则删,少则补,其值随机
(17)a.rezize(10,2);//将a的现有元素个数调至10个,多则删,少则补,其值为2
(18)a.reserve(100);//将a的容量(capacity)扩充至100,也就是说现在测试a.capacity();的时候返回值是100.这种操作只有在需要给a添加大量数据的时候才 显得有意义,因为这将避免内存多次容量扩充操作(当a的容量不足时电脑会自动扩容,当然这必然降低性能) 
(19)a.swap(b);//b为向量,将a中的元素和b中的元素进行整体性交换
(20)a==b; //b为向量,向量的比较操作还有!=,>=,<=,>,<

map:

std:map<int, string> personnel; 

这样就定义了一个用int作为索引,并拥有相关联的指向string的指针. 

map最基本的构造函数;

map<string , int >mapstring;

map<int ,string >mapint;

map<sring, char>mapstring;

map< char ,string>mapchar;

map<char ,int>mapchar;

map<int ,char >mapint;

map添加数据;

map<int ,string> maplive;

1.maplive.insert(pair<int,string>(102,"aclive"));

2.maplive.insert(map<int,string>::value_type(321,"hai"));

3, maplive[112]="April";//map中最简单最常用的插入添加!

使用count,返回的是被查找元素的个数。如果有,返回1;否则,返回0。注意,map中不存在相同元素,所以返回值只能是1或0。

使用find,返回的是被查找元素的位置,没有则返回map.end()。

#include < unordered_map >//无序

unordered_map:

  1. 优点: 因为内部实现了哈希表,因此其查找速度非常的快
  2. 缺点: 哈希表的建立比较耗费时间
  3. 适用处:对于查找问题,unordered_map会更加高效一些,因此遇到查找问题,常会考虑一下用unordered_map

set容器:

类似与一个集合,它底层使用平衡的搜索树——红黑树实现,插入删除操作时仅仅需要指针操作节点即可完成,不涉及到内存移动和拷贝,所以效率比较高。set作为一个容器也是用来存储同一数据类型的数据类型,并且能从一个数据集合中取出数据,在set中每个元素的值都唯一,而且系统能根据元素的值自动进行排序。

  • s.begin()  返回set容器的第一个元素

  • s.end()   返回set容器的最后一个元素

  • s.clear() 删除set容器中的所有的元素

  • s.empty()   判断set容器是否为空

  • s.insert() 插入一个元素

  • s.erase() 删除一个元素

  • s.size()  返回当前set容器中的元素个数
  • 例如统计单词数目:HDU - 2072:http://acm.hdu.edu.cn/showproblem.php?pid=2072(原本可用字典树)

  • 附上代码:

  • #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<set>
    using namespace std;
    typedef long long ll;
    int main()
    {
    	char hh;
    	string s;
    	set<string> words;
    	while((hh=getchar())!='#')
    	{
    		s="";
    		while(hh!=' '&&hh!='\n')
    		{
    			s+=hh;
    			hh=getchar();
    		}
    		if(s.length())
    		words.insert(s);
    		if(hh=='\n')
    		{
    			printf("%d\n",words.size());
    			words.clear();
    		 } 
    	}
    	return 0;
    }
    
    

    floor()是向负无穷大舍入,floor(-10.5) == -11;
    ceil()是向正无穷大舍入,ceil(-10.5) == -10

发布了56 篇原创文章 · 获赞 17 · 访问量 2345

猜你喜欢

转载自blog.csdn.net/weixin_43958964/article/details/97801504