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:
- 优点: 因为内部实现了哈希表,因此其查找速度非常的快
- 缺点: 哈希表的建立比较耗费时间
- 适用处:对于查找问题,
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