STL小结
\(\mathcal{STL}(\mathcal{Standard\ Template\ Library})\)
\(queue\) (队列):
这是一种先进先出的数据结构。
主要操作:
操作 功能 \(front()\) 返回队尾元素的值 \(pop()\) 弹出队头元素 \(push(x)\) 将 \(x\) 压入队尾 \(empty()\) 如果队列为空,返回 \(true\) \(size()\) 返回当前队列内元素个数 海港 \(\mathcal{OJ}\)
这道题主要思路是用一个队列维护时间,再用一个队列记录这个人的国籍
代码:
#include <queue>
#include <cstdio>
using namespace std;
const int TIME = 86400;
int n, Countries_, t, k, x, f[ 100005 ];
queue <int> Time, PeoPle;
int main () {
scanf ("%d", &n);
for (int i = 1; i <= n; i ++) {
scanf ("%d %d", &t, &k);
while (k --) {
Time.push(t);
scanf ("%d", &x);
PeoPle.push(x);
Countries_ += f[ x ] == 0 ? 1 : 0;//当这个人是该国家唯一到达的人时,国家数加加
f[ x ] ++;
}
while (Time.empty() == false and t - Time.front() >= TIME) {//在每艘船到达后,维护队列,将不满足条件的人弹出队列,并判断该国是否有人在24小时内到达
Time.pop();
if (-- f[ PeoPle.front() ] == 0) {
Countries_ --;
}
PeoPle.pop();
}
printf ("%d\n", Countries_);
}
return 0;
}
\(stack(\)栈\()\):
在我看来,栈与队列相当于孪生兄弟,但是队列 \(pop()\) 弹出队头元素,先进先出;栈 \(pop()\) 弹出栈顶元素,先进后出
主要操作:
操作 功能 \(top()\) 返回栈顶元素的值 \(pop()\) 弹出栈顶元素 \(push(x)\) 将 \(x\) 压入栈顶 \(empty()\) 如果栈顶元素为空,返回 \(true\) \(size()\) 返回当前栈内元素个数 例题 表达式括号匹配 \(\mathcal{OJ}\)
思路:如果当前第i位是右括号, 则判断如果前面有左括号且并未用过。若有,将其弹出栈,否则直接输出 \(NO\)
代码:#include <stack>
#include <cstdio>
using namespace std;
stack <char> s;
int n;
char c;
int main () {
while (scanf ("%c", &c) != EOF && c != '@') {
if (c == '(') {//如果c是左括号,将其push进栈,以便于后面判断
s.push(c);
}
else if (c == ')') {
if (s.empty() == true) {//如果栈为空,即前方无可用左括号,则输出"NO"
puts("NO");
return 0;
}
s.pop();//若有可用左括号,将左括号弹出,当成已用过
}
}
if (s.empty() == true) {//如果左括号用完,输出"YES"
puts("YES");
return 0;
}
puts("NO");
return 0;
}
\(vector\)(顺序容器,不定长数组):
和数组差不多,但比数组优越。特征是相当于可分配拓展的数组。它的随机访问、在末端插入和删除快,但在中间插入和删除慢。
主要操作:
操作 功能 \(push\_back(x)\) 在 \(vector\) 的末尾插入变量 \(x\) \(pop\)_\(back()\) 去掉 \(vector\) 的末尾数据 \(front()\) 返回 \(vector\) 第一个元素 \(begin()\) 返回 \(vector\) 头的指针 \(end()\) 返回 \(vector\) 最后一个单元 \(+1\) 的指针 \(clear()\) 清除 \(vector\) 所有数据 \(empty()\) 如果 \(vector\) 为空,返回 \(true\) \(erase(t)\) 删除t位置的数据 \(erase(Begin, End)\) 删除 \([Begin, End)\) 区间的数据 \(size()\) 返回当前\(vector\)中数据个数 \(insert(t, data)\) 在t处插入数据\(data\)
\(map\)(关联容器、有序无重复):
它提供一对一(其中第一个称为关键字,每个关键字只在 \(map\) 中出现一次,第二个称为该关键字的值)的数据处理能力
注意:
- \(map\) 内部所有的数据都是有序的(红黑树)
- 对于迭代器来说,可以修改实值,但不能修改 \(key\)。
例题 词典 \(\mathcal{OJ}\)
代码:
#include <map>
#include <cstdio>
#include <iostream>
using namespace std;
map <string, string> Dictionary;
string s, s2;
char a[ 155 ], b[ 155 ];
int main () {
while (getline(cin, s, '\n')) {
if (s == "") {
break;
}
sscanf(s.c_str(), "%s %s", a, b);
Dictionary[ b ] = a;
}
while (cin >> s) {
if (Dictionary[ s ] == "\0") {
puts("eh");
}
else {
cout << Dictionary[ s ] << endl;
}
}
return 0;
}
\(set\)(关联容器,集合):
\(set\)是“集合”的意思,\(set\) 中元素都是唯一的,默认情况下会对元素自动进行升序排列,如果需要集合中的元素允许重复那么可以使用 \(multiset\)。
主要操作:
操作 功能 \(begin()\) 返回 \(set\) 中的第一个元素 \(end()\) 返回 \(set\) 中的最后一个元素 \(clear()\) 删除 \(set\) 中的所有数据 \(empty()\) 如果 \(set\) 为空,返回 \(true\) \(insert()\) 插入一个元素 \(erase()\) 删除一个元素 \(size()\) 返回当前\(set\)中元素个数 \(count()\) 返回\(set\)中某个值元素的个数 \(find()\) 返回一个指向被查找到元素的迭代器 \(lower\_bound()\) 返回指向第一个 \(\geq\) 某个值的元素的迭代器 \(upper\_bound()\) 返回第一个>某个值的元素的迭代器 提示:若想让 \(set\) 以降序排序,可使用 \(set<int,\ greater\ < int >\ >\)
\(priority\_queue\)(优先队列)
定义:任何时刻,队首元素一定是当前队列中优先级最高(优先值最大)的那一个(大根堆),也可以是最小的那一个(小根堆),可以不断向优先队列中添加某个优先级的元素,也可以不断弹出优先级最高的元素,每次操作会自动调整结构,始终保证队首元素的优先级最高。(懵逼 )
主要操作:
操作 功能 时间复杂度 \(push()\) 将 \(x\) 加入优先队列 \(O(log_2{n}),n\) 为元素个数 \(pop()\) 队首元素出队 \(O(log_2{n}),n\) 为元素个数 \(top()\) 获得队首元素 \(O(1)\) \(empty()\) 如果优先队列为空,返回 \(true\) \(O(1)\) \(size()\) 返回 \(priority\_queue\) 内元素的个数 \(O(1)\) 重点:
\(priority\_queue<int>\ q\ <=>\ priority\_queue<int,\ vector<int>,\ less<int>\ >\ q\) (升序)
\(priority\_queue<int,\ vector<int>,\ greater<int>\ >\ q\) (降序)例题 合并果子 \(\mathcal{OJ}\)
代码:
#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
priority_queue <int,vector<int>,greater<int> > q;//升序
int n, a, tot;
int main () {
scanf ("%d", &n);
for (int i = 1; i <= n; i ++) {
scanf ("%d", &a);
q.push (a);
}
for (int i = 1; i < n; i ++) {//贪心
int x = q.top ();
q.pop ();
x += q.top ();
q.pop ();
q.push (x);
tot += x;
}
printf ("%d\n", tot);
return 0;
}
STL小结的更多相关文章
- C++ STL 知识小结
qwq...接近联赛,就在这里对STL做一点知识小结吧,因为STL曾经失分很多. 简介 (来自Baidu) STL是Standard Template Library的简称,中文名标准模板库,惠普实验 ...
- STL中的算法小结
()要运用STL的算法,首先必须包含头文件<algorithm>,某些STL算法用于数值处理,因此被定义于头文件<numeric> ()所有STL算法都被设计用来处理一个或多个 ...
- STL中priority_queue小结
(1)为了运用priority_queue,你必须包含头文件<queue>:#include<queue> (2)在头文件中priority_queue定义如下: namesp ...
- STL学习小结
STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些" ...
- STL set 使用小结
这是微软帮助文档中对集合(set)的解释: “描述了一个控制变长元素序列的对象(注:set中的key和value是Key类型的,而map中的key和value是一个pair结构中的两个分 量)的模板类 ...
- STL容器小结
1.空间分配器 std::alloc用于容器中内存空间的分配和释放,以及分配内存的管理.construct().destroy()等全局函数用于为对象的构造和析构. 2.迭代器和trains 迭代器 ...
- 小结:STL
概要: c++的stl是个神奇的东西,需要好好学习. 技巧及注意: lower_bound是第一个大于等于要查找值 upper_bound是第一个大于要查找的值 stl中的容器中的比较几乎全都用< ...
- STL 中priority_queue小结
(1)为了运用priority_queue,你必须包含头文件<queue>:#include<queue> (2)在头文件中priority_queue定义如下: nam ...
- HZNU-ACM寒假集训Day1小结 STL 并查集
常用STL 1.优先队列 priority_queue 内部是用堆(heap)实现的 priority_queue<int> pq; 默认为一个“越小的整数优先级越低的优先队列” 对于一些 ...
随机推荐
- buuctfweb刷题wp详解及知识整理----[安洵杯 2019]easy_web
尝试之路加wp 观察源代码和get所传参数可猜测img所传参数img就是该图片经过两次base64编码和一次hex编码后可得555.png成果验证猜测 然后发现该图片以data元数据封装的方式放到了源 ...
- 浅谈php反序列化漏洞
关于php的反序列化漏洞要先说到序列化和反序列化的两个函数,即: serialize() 和unserialize(). 简单的理解: 序列化就是将一个对象变成字符串 反序列化是将字符串恢复成对象 这 ...
- python中的多线程和多进程
一.简单理解一下线程和进程 一个进程中可有多个线程,线程之间可共享内存,进程间却是相互独立的.打比方就是,进程是火车,线程是火车厢,车厢内人员可以流动(数据共享) 二.python中的多线程和多进程 ...
- 你必须知道的MySQL知识点
什么是索引 索引是帮助MySQL高效获取数据的排好序的数据结构 索引数据结构(掌握) 数据结构可视化 前置知识:树的高度越低查询效率越高 二叉树:不能自平衡,极端情况出现倾斜,查询效率和链表类似 红黑 ...
- js 转为整数之Number()、parseInt()、parseFloat()区别
一:Number() 如果是Boolean值,true和false值将分别被转换为1和0. 如果是数字值,只是简单的传入和返回. 如果是null值,返回0. 如果是undefined,返回NaN. 如 ...
- CRT, lucas及其扩展形式
CRT, lucas及其扩展形式 exgcd int exgcd(int a, int b, int &x, int &y) { if (b == 0) return a, x = 1 ...
- P4267 [USACO18FEB]Taming the Herd
说实话感觉不是一道蓝题--感觉挺水的,不过为了水题解,水题就够了(其实是觉得思考的过程比较典型,记录一下) 题解 刚开始看这道题感觉上没什么思路,但是我们可以先考虑用 \(O(n)\) 的时间去枚举发 ...
- 基于Dokcer搭建Redis集群搭建(主从集群)
最近陆陆续续有不少园友加我好友咨询 redis 集群搭建的问题,我觉得之前写的这篇 <基于Docker的Redis集群搭建> 文章一定是有问题了,所以我花了几分钟浏览之前的文章总结了下面几 ...
- 转载-没有IE就没有伤害!浏览器兼容性问题解决方案汇总
普及:浏览器的兼容性问题,往往是个别浏览器(没错,就是那个与众不同的浏览器)对于一些标准的定义不一致导致的.俗话说:没有IE就没有伤害. 贴士:内容都是自己总结的,不免会出现错误或者bug,欢迎更正和 ...
- Office Word文件批量生成软件
一.软件用途 如果Word文件模板固定,只是要素信息不同,则可以使用本软件批量生成Word文件. 软件下载地址(2020-12-6更新):https://files.cnblogs.com/files ...