TZOJ-STL系列题
C++实验:STL之vector
#include <bits/stdc++.h>
using namespace std;
void Input(vector<int>& v) {
int n, m;
scanf("%d", &n);
for (int i = ; i <= n; i++) {
scanf("%d", &m);
v.push_back(m);
}
}
int main()
{
vector<int> vec;
Input(vec);
for(int i=;i<vec.size();i++)
{
cout<<vec[i]<<endl;
}
return ;
}C++实验:STL之vector2
#include <bits/stdc++.h>
using namespace std;
void Insert(vector<int>& v, int x) {
for(int i = ; i < v.size(); i++) // 由于vector内存中的存储方式是连续的,所以可以用下标直接访问,当然也可以用迭代器访问
{
if (v[i] == x) return; // 找到x说明不需要插入,直接返回
}
v.insert(v.begin(), x); // 在第x个数后面插入一个y可以写成v.insert(v.begin() + x, y);因为内存连续,所以迭代器也能直接加x
}
int main()
{
vector<int> vec;
int n, x;
cin>>n;
while(n--)
{
cin>>x;
Insert(vec, x);
}
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
cout<<*it<<endl;
}
return ;
}C++实验:STL之vector3
#include <bits/stdc++.h>
using namespace std;
bool Input(vector<int>& v) { // 返回值表示是否还有输入
int n, m;
v.clear();
if (scanf("%d", &n) == EOF) return false;
for (int i = ; i <= n; i++) {
scanf("%d", &m);
v.push_back(m);
}
return true;
}
bool cmp(int a, int b) {
return a > b;
}
void Sort(vector<int>& v) {
// sort的三个参数,排序的起始地址,排序的尾地址,比较函数
sort(v.begin(), v.end(), cmp);
}
int main()
{
vector<int> vec;
while(Input(vec))
{
Sort(vec);
for(vector<int>::iterator it=vec.begin();it!=vec.end();it++)
{
if(it!=vec.begin())
cout<<" ";
cout<<*it;
}
cout<<endl;
} return ;
}C++实验:STL之vector4
#include <bits/stdc++.h>
using namespace std;
int Input(vector< vector<int> >& v1) {
int n, m, k;
scanf("%d%d", &n, &m);
vector<int> v2;
for (int i = ; i <= n; i++) {
for (int j = ; j <= m; j++) {
scanf("%d", &k);
v2.push_back(k);
}
v1.push_back(v2);// STL容器里还可以套其他容器,这里把v2当参数传进去
v2.clear();
}
}
int main()
{
vector< vector<int> > vec;
Input(vec);
for(int i=;i<vec.size();i++)
{
for(int j=;j<vec[i].size();j++)
{
if(j)
cout<<" ";
cout<<vec[i][j];
}
cout<<endl;
}
return ;
}C++实验:STL之stack
#include <bits/stdc++.h>
using namespace std;
void Op(stack<int>& st) {
char p[]; int m;
scanf("%s", p);
// 后面只需判断p[1]是什么就好了,因为三种操作的p[1]都不同,判断单个字符效率比strcmp(p, "push")要高。
if (p[] == 'u') {
scanf("%d", &m);
st.push(m);
} else if (p[] == 'o') {
if (!st.empty()) // 数据可能有空栈pop的情况
st.pop();
} else {
while (!st.empty()) st.pop();
}
}
int main()
{
stack<int> st;
int n;
cin>>n;
while(n--)
{
Op(st);
}
while(!st.empty())
{
cout<<st.top()<<endl;
st.pop();
}
return ;
}因为栈这个容器只能访问栈顶,所以不支持迭代器的操作,也没有clear方法
C++实验:STL之queue
#include <bits/stdc++.h>
using namespace std;
int tail; // 因为队列只能访问队头,所以如果想访问队尾我们只能手动记录最后一次入队的是谁。
void Op(queue<int>& st) {
char p[]; int m;
scanf("%s", p);
if (p[] == 'u') {
scanf("%d", &m);
st.push(m);
tail = m;
} else if (p[] == 'o') {
if (!st.empty()) st.pop();
} else if (p[] == 'l') {
while (!st.empty()) st.pop();
} else if (p[] == 'i') {
if (!st.empty()) printf("%d\n", st.front());
} else {
if (!st.empty()) printf("%d\n", tail);
}
}
int main()
{
queue<int> qu;
int n;
cin>>n;
while(n--)
{
Op(qu);
}
while(!qu.empty())
{
cout<<qu.front()<<endl;
qu.pop();
}
return ;
}因为栈这个容器只能访问队头,所以不支持迭代器的操作,也没有clear方法
C++实验:STL之priority_queue
#include <bits/stdc++.h>
using namespace std;
// 优先队列,在普通队列的基础上增加了自动排序的功能,默认会把最大元素放到队头
void Input(priority_queue<char>& qu) {
string s;
cin >> s;
for (int i = ; s[i] != '\0'; i++)
qu.push(s[i]);
}
int main()
{
priority_queue<char> qu;
int n;
cin>>n;
while(n--)
{
Input(qu);
while(!qu.empty())
{
cout<<qu.top();
qu.pop();
}
cout<<endl;
}
return ;
}C++实验:STL之map
#include <bits/stdc++.h>
using namespace std;
void Input(map<string, int>& mp) {
int n; string s;
cin >> n;
for (int i = ; i <= n; i++) {
cin >> s;
mp[s] ++;
}
}
int main()
{
int m;
map<string, int> sm;
Input(sm);
cin>>m;
while(m--)
{
string s;
cin>>s;
cout<<sm[s]<<endl;
}
return ;
}C++实验:STL之priority_queue2
#include <bits/stdc++.h>
using namespace std;
// greater<char> >这中间的空格不能少,否则 >> 两个尖括号连在一起会被认为是右移运算符。
priority_queue<char, vector<char>, greater<char> > qu;
void Input() {
string s;
cin >> s;
for (int i = ; s[i] != '\0'; i++)
qu.push(s[i]);
}
int main()
{
int n;
cin>>n;
while(n--)
{
Input();
while(!qu.empty())
{
cout<<qu.top();
qu.pop();
}
cout<<endl;
}
return ;
}C++实验:STL之priority_queue3
#include <bits/stdc++.h>
using namespace std;
struct Point {
int x, y;
// 因为Point是我们自己定义的一个数据类型,优先队列要排序不知道该怎么排,所以要实现小于号的重载
friend bool operator < (Point a, Point b) {
if (a.x != b.x) return a.x > b.x;
else return a.y > b.y;
}
};
priority_queue<Point> qu;
void Input() {
int n; scanf("%d", &n);
Point p;
for (int i = ; i <= n; i++) {
scanf("%d%d", &p.x, &p.y);
qu.push(p);
}
}
int main()
{
int n;
cin>>n;
while(n--)
{
Input();
while(!qu.empty())
{
Point p = qu.top();
cout<<p.x<<" "<<p.y<<endl;
qu.pop();
}
}
return ;
}关于实现小于号那一部分可以看成是在结构体里写了一个像sort的cmp一样的东西,只不过写法不一样而已,实现了小于号两个Point之间就能进行比大小了
C++实验:STL之全排列
#include <bits/stdc++.h>
using namespace std;
void Permutation(vector<int> v) {
sort(v.begin(), v.end());
do {
printf("%d", v[]);
for (int i = ; i < v.size(); i++)
printf(" %d", v[i]);
puts("");
} while (next_permutation(v.begin(), v.end())); // 求v的下一个排列。1,2,3的下一个排列是1,3,2。会直接改变原数组
}全排列的函数在acm的比赛中用处不是很大(因为需要全排列就说明算法效率低),但是蓝桥杯比赛基本每年都考。
C++实验:STL之upper_bound
#include <bits/stdc++.h>
using namespace std;
void PrintFind(vector<int> v, int x) {
// upper_bound内部是用二分实现的,还记得育英比赛的唐伯虎点秋香的一题吗,所以为了二分,要先将v排好序
sort(v.begin(), v.end());
// upper_bound(查找首地址,查找尾地址,查找的元素),返回第一个大于查询元素的元素地址。
vector<int>::iterator it = upper_bound(v.begin(), v.end(), x);
// printf("%d\n", *it);
if (it == v.end()) puts("None"); // 当不存在的时候返回v.end();
else printf("%d\n", it - v.begin() + ); // 为了得到下标减一下v.begin() + 1;
}
int main()
{
vector<int> vec;
int n, a, x;
cin>>n>>x;
while(n--)
{
int a;
cin>>a;
vec.push_back(a);
}
PrintFind(vec, x);
return ;
}C++实验:STL之upper_bound
#include <bits/stdc++.h>
using namespace std;
void PrintFind(vector<int> v, int x) {
// lower_bound内部是用二分实现的,还记得育英比赛的唐伯虎点秋香的一题吗,所以为了二分,要先将v排好序
sort(v.begin(), v.end());
// lower_bound(查找首地址,查找尾地址,查找的元素),返回第一个大于或等于查询元素的元素地址。
vector<int>::iterator it = lower_bound(v.begin(), v.end(), x);
// printf("%d\n", *it);
if (it == v.end()) puts("None"); // 当不存在的时候返回v.end();
else printf("%d\n", it - v.begin() + ); // 为了得到下标减一下v.begin() + 1;
}
int main()
{
vector<int> vec;
int n, a, x;
cin>>n>>x;
while(n--)
{
int a;
cin>>a;
vec.push_back(a);
}
PrintFind(vec, x);
return ;
}
TZOJ-STL系列题的更多相关文章
- 《STL系列》之map原理及实现
上一篇文章<STL系列>之vector原理及实现,介绍了vector的原理及实现,这篇文章介绍map的原理及实现.STL实现源码下载.STL中map的实现是基于RBTree的,我在实现的时 ...
- Gengxin讲STL系列目录
引言:有人催我写关于STL的博客#(滑稽) STL嘛,昨晚有人一直逼问我STL名字的由来——STL = Standard Template Library,标准模板库,惠普实验室开发的一 ...
- 跟我学STL系列(1)——STL入门介绍
一.引言 最近这段时间一直都在自学C++,所以这里总结下自己这段时间的学习过程,通过这种方式来巩固自己学到的内容和以备后面复习所用,另外,希望这系列文章可以帮助到其他自学C++的朋友们. 由于本人之前 ...
- Gengxin讲STL系列——Set
本系列第二篇blog 第一篇写的心潮澎湃,结果写完一看,这都是些什么玩意= =| Set的中文名称是“集合”.集合,高一数学必修一课本给出的定义已经很明确了,简单来讲就是一个不含重复元素的空间(个人定 ...
- hdu4585 STL水题
题意: 成立少林寺,刚开始有一个大师,id是1,攻击力是10E,现在陆续来人,每个人有自己的id,和自己的攻击力,但是每一个新来的要和之前的和尚pk,他必须选择和他攻击力差值最小的那个,如 ...
- 《STL系列》之vector原理及实现
最近忙得蛋疼,但还是想写点属于自己的东西.也不知道写点啥,最后决定试着自己实现STL中常用的几个集合,一来加深自己对STL的理解,二来看看自己是否有这个能力实现.实现目标就是:1能和STL兼容:2最大 ...
- Gengxin讲STL系列——Queue和Stack
第三篇. 感觉队列和栈是必须的……所以决定加上这两个…… 我发现我已经买域名买上隐了……今天又买了个.top……真是智障…… Queue(队列FIFO)和Statk(栈LIFO). 那么为什么要这两个 ...
- Gengxin讲STL系列——String
衔接上一篇引导. 作为第一篇博客,就要大气一点. 可我好像并不知道怎么才能让自己的博客大气一点= =: 明天是我生日,自己先买个中文域名庆祝了一下…… 好了,废话说完了,结果博客也没大气到哪去……,正 ...
- STL系列
STL—对象的构造与析构 STL—内存的配置与释放 STL—vector STL—vector空间的动态增长
随机推荐
- maven镜像仓库
国内连接maven官方的仓库更新依赖库,网速一般很慢,收集一些国内快速的maven仓库镜像以备用. ====================国内OSChina提供的镜像,非常不错=========== ...
- UML-逻辑架构精化
向下请求:Facade模式 向上返回:观察者模式 不局限于上图中指定的层使用相应模式,其他层也可以使用. 另外,尽量不要出现“公共业务模块”,设计时尽量做好系统拆分.否则,一旦修改公共代码,可能会影响 ...
- String 字符串拼接
字符串拼接有两个方法 第一中 var sad = "happy" var variable = "you"+sad +"" variable ...
- 28. docker swarm 容器编排简介
1.采用集群架构 集群架构包含节点和角色 docker 节点中 包含 worker 和 manager 两个角色 manager 相当于 swarm 集群的 大脑 是用来管理配置节点的 (避免单点故 ...
- 22. docker 数据持久化 Data Volume
1 . 使用场景 在docker 容器被删除的时候 希望数据不丢失 2 . Volume 的使用 * 注意 在 mysql 的 Dockerfile 内 定义了 VOLUME ["var/ ...
- UVA 558 SPFA 判断负环
这个承认自己没看懂题目,一开始以为题意是形成环路之后走一圈不会产生负值就输出,原来就是判断负环,用SPFA很好用,运用队列,在判断负环的时候,用一个数组专门保存某个点的访问次数,超过了N次即可断定有负 ...
- python装饰器的参数传递
被装饰器装饰的函数名即使没有被调用(因为有@xxx,会触发运行装饰器),(装饰器工厂函数)定义装饰器的代码已经运行了(最内部的那个函数并没有运行)(把被装饰的原函数引用赋值给了装饰器内部的那个函数名) ...
- 自由职业平台Upwork申请上市,能给国内猪八戒网带来什么启示?
当下,在互联网的全面渗入下已经对整个社会的运行机制.大众的生活产生了前所未有的影响.尤其是在工作方面,更是衍生出诸多新兴职业.如,主播.水军.新媒体运营.自媒体人等.值得注意的是,这些职业绝大部分都有 ...
- 前端快速构建神器vue-cli,windows下安装并且构建前端项目
1.nodejs官网http://nodejs.cn/下载安装包,傻瓜式安装即可 2.dos命令查询node的版本 node -v 查询版本号 npm -v 查询npm包管理版本 3.安装国内镜像 n ...
- nodejs服务后台持续运行三种方法
一.利用 forever forever是一个nodejs守护进程,完全由命令行操控.forever会监控nodejs服务,并在服务挂掉后进行重启. 1.安装 forever npm install ...