没有合适的资源?快使用搜索试试~ 我知道了~
首页ACM模板:C++编程新手指南与代码优化
ACM模板:C++编程新手指南与代码优化
5星 · 超过95%的资源 需积分: 16 275 下载量 59 浏览量
更新于2024-07-20
12
收藏 2.91MB PDF 举报
ACM模板-f_zyj是一位ACMer在2016年12月1日分享的一份精心整理的竞赛编程模板。这份模板的初衷是为了提高编程效率和代码质量,使其易于阅读和理解。作者花费大量时间进行格式化和修正,力求让代码既符合标准写法,又具有正确性、可读性和严谨性。模板主要针对C++语言,因为作者偏好C++,并且是专门为ACM(算法竞赛)设计的。 模板的创建过程并非原创,而是基于社区内广泛接受的算法和数据结构代码优化,这些代码经过多人的不断迭代和完善。模板包含了8种主要的分类,如STL(Standard Template Library,标准模板库)部分,这是C++编程的重要组成部分,用于处理各种数据结构和算法。然而,分类的设定可能存在主观性,作者欢迎读者提出改进意见或推荐更优的代码,以便模板能够持续地学习和成长。 此外,模板的更新和维护将在作者的个人博客进行,读者如有疑问或建议可以通过博客留言或私信与作者交流。这份模板的重要性在于提供了一个起点,帮助参赛者组织和优化他们的代码,以便在有限的时间内解决复杂的问题。 总结来说,ACM模板-f_zyj是一个实用的工具,旨在提升ACMer们的编程效率,通过共享和交流,推动整个社区的技术进步。模板的使用者可以根据自己的需求进行微调,使之适应个人编程风格和比赛要求。
资源详情
资源推荐
7.1.1 关于queue
stack(栈)和queue(队)是在程序设计中经常会到的数据容,STL为我们提供
的stack(栈)和queue(队)的实现。
准确的说,STL中的stack和queue同于vector、list等容,是对这些容进重新的
包装。这我们去深讨论STL的stack和queue的实现细节,是来解些他们的基本使。
queue模版类的定义在<queue>头件中。
7.1.2 使queue
queue与stack相似,queue模版类也需要两个模版参数,个元素类型,个容类型,元
素类型时必须的,容类型时可选的,默认为deque类型。
定义queue对象:
queue<int> q;
queue<double> qq;
queue的基本操作:
q.push(x); // 队
q.pop(); // 出队
q.front(); // 访问队元素
q.back(); // 访问队尾元素
q.empty(); // 判断队是否为空
q.size(); // 访问队中的元素个数
7.2.1 关于priority_queue
在<queue>头件中,还定义另个常有的模版类priority_queue(优先队)。优先
队与队的差别在于优先队是按照队的顺序出队,是按照队中元素的优先权出队(默
认为者优先,也可以通过指定算来指定的优先顺序)。
7.2.2 使priority_queue
priority_queue模版类有三个模版参数,第个是元素类型,第个是容类型,第三个是
较算。其中后两者都可以忽,默认容为vector,默认算为less,即的往前排,的往后排
(出队时尾元素先出队)。
定义priority_queue对象:
priority_queue<int> q;
priority_queue<pair<int, int> > qq; // 注意在两个尖括号之间定要空格,防误判
priority_queue<int, vector<int>, greater<int> > qqq; // 定义的先出队
priority_queue的基本操作与queue的微同。
priority_queue的基本操作:
q.empty() // 如果队为空,则返回true,否则返回false
q.size() // 返回队中元素的个数
q.pop() // 删除队元素,但返回其值
q.top() // 返回具有最优先级的元素值,但删除该元素
q.push(item) // 在基于优先级的适当位置插新元素
初学者在使priority_queue时,最困难的可能就是如何定义较算。如果是基本数据类
型,或已定义较运算符的类,可以直接使STL的less算和greater算——默认为使less算
。如果要定义的较算,法有多种,这介绍其中种:重载较运算符。优先队试
图这两个元素x和y代较运算符(对于less算,调x < y,对于greater算,调x > y),若
结果为真,则x排在y前,y将先出队,反之,则y排在x前,x将先出队。
Ex(算实现示):
#include <iostream>
v 1.1 2016.12.5
! /!16 358
#include <queue>
using namespace std;
class T
{
public:
int x, y, z;
T(int a, int b, int c) : x(a), y(b), z(c) {}
};
bool operator < (const T &tOne, const T &tTwo)
{
return tOne.z < tTwo.z; // 按照z的顺序来决定tOne和tTwo的顺序
}
int main()
{
priority_queue<T> q;
q.push(T(4, 4, 3));
q.push(T(2, 2, 5));
q.push(T(1, 5, 4));
q.push(T(3, 3, 6));
while (!q.empty())
{
T t = q.top();
q.pop();
cout << t.x << " " << t.y << " " << t.z << '\n';
}
return 0;
}
/*
* 输出结果为:
* 4 4 3
* 1 5 4
* 2 2 5
* 3 3 6
*/
如果我们将第个中的较运算符重载为:
bool operator < (const T &tOne, const T &tTwo)
{
return tOne.z > tTwo.z; // 按照z的顺序来决定tOne和tTwo的顺序
}
则会得到和第个样的结果,所以,决定算的是较运算符重载函数内部的返回值。
8. STL map
8.1 关于map
在STL的头件中<map>中定义模版类map和multimap,有序叉树表存储类型为
pair<const Key, T>的元素对序。序中的元素以const Key部分作为标识,map中所有元素的Key
值必须是唯的,multimap则允许有重复的Key值。
v 1.1 2016.12.5
! /!17 358
8.2 使map
可以将map看作是由Key标识元素的元素集合,这类容也被称为“关联容”,可以通过个
Key值来快速决定个元素,因此常适合于需要按照Key值查找元素的容。
map模版类需要四个模版参数,第个是键值类型,第个是元素类型,第三个是较算
,第四个是分配类型。其中键值类型和元素类型是必要的。
定义map对象:
map<string, int> m;
map的基本操作:
/* 向map中插元素 */
m[key] = value; // [key]操作是map很有特的操作,如果在map中存在键值为
key的元素对, 则返回该元素对的值域部分,否则将会创建个键值为key的元素对,值域为默认值。
所以可以该操作向map中插元素对或修改已经存在的元素对的值域部分。
m.insert(make_pair(key, value)); // 也可以直接调insert法插元素对,insert操作会返回个
pair,当map中没有与key相匹配的键值时,其first是指向插元素对的迭代,其second为true;若
map中已经存在与key相等的键值时,其first是指向该元素对的迭代,second为false。
/* 查找元素 */
int i = m[key]; // 要注意的是,当与该键值相匹配的元素对存在时,会创建键
值为key(当另个元素是整形时,m[key]=0)的元素对。
map<string, int>::iterator it = m.find(key); // 如果map中存在与key相匹配的键值时,find操作将返
回指向该元素对的迭代,否则,返回的迭代等于map的end()(参vector中提到的begin()和end()
操作)。
/* 删除元素 */
m.erase(key); // 删除与指定key键值相匹配的元素对,并返回被删除的元素的个数。
m.erase(it); // 删除由迭代it所指定的元素对,并返回指向下个元素对的迭代。
/* 其他操作 */
m.size(); // 返回元素个数
m.empty(); // 判断是否为空
m.clear(); // 清空所有元素
Ex_One:
#include <iostream>
#include <map>
using namespace std;
typedef map<int, string, less<int> > M_TYPE
typedef M_TYPE::iterator M_IT
typedef M_TYPR::const_iterator M_CIT
int main()
{
M_TYPR myTestMap;
myTestMap[3] = "No.3";
myTestMap[5] = "No.5";
myTestMap[1] = "No.1";
v 1.1 2016.12.5
! /!18 358
myTestMap[2] = "No.2";
myTestMap[4] = "No.4";
M_IT itStop = myTestMap.find(2);
cout << "myTestMap[2] = " << itStop->second << endl;
itStop->second = "No.2 After modification";
cout << "myTestMap[2] = " << itStop->second << endl;
cout << "Map contents:" << endl;
for (M_CIT it = myTestMap.begin(); it != myTestMap.end(); it++)
{
cout << it->second << endl;
}
return 0;
}
/*
* 程序的输出结果为:
* MyTestMap[2] = No.2
* MyTestMap[2] = No.2 After modification Map contents :
* No.1
* No.2 After modification
* No.3
* No.4
* No.5
*/
Ex_Two:
#include <iostream>
#include <map>
using namespace std;
int main()
{
map<string, int> m;
m["one"] = 1;
m["two"] = 2;
// 种同的 insert 调法
m.insert(make_pair("three", 3));
m.insert(map<string, int>::value_type("four", 4));
m.insert(pair<string, int>("five", 5));
string key;
while (cin >> key)
{
map<string, int>::iterator it = m.find(key);
if (it == m.end())
{
cout << "No such key!" << endl;
}
else
{
v 1.1 2016.12.5
! /!19 358
cout << key << " is " << it->second << endl;
cout << "Erased " << m.erase(key) << endl;
}
}
return 0;
}
9. STL iterator
9.1 关于iterator
iterator(迭代)是于访问容中元素的指示,从这个意义上说,iterator(迭代)相
当于数据结构中所说的“遍历指针”,也可以把iterator(迭代)看作是种泛化的指针。
STL中关于iterator(迭代)的实现和使时相当复杂的,这我们暂时去详细讨论关于
iterator(迭代)的实现和使,只对iterator(迭代)做点简单的介绍。
简单的说,STL中有以下类iterator(迭代):
输iterator(迭代),在容的连续区内向前移动,可以读取容内任意值;
输出iterator(迭代),把值写进它所指向的容中;
前向iterator(迭代),读取队中的值,并可以向前移动到下个位置(++p, p++);
双向iterator(迭代),读取队中的值,并可以向前后遍历容;随机访问向iterator(迭
代),可以直接以下标式对容进访问,vector的iterator(迭代)就是这种iterator(迭代
);
流iterator(迭代),可以直接输、输出流中的值。
9.2 使iterator
每种STL容都有的iterator(迭代)类,下先来看段简单的示代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> s;
for (int i = 0; i < 10; i++)
{
s.push_back(i);
}
for (vector<int>::iterator it = s.begin(); it != s.end(); it++)
{
cout << *it << " ";
}
cout << '\n';
return 0;
}
vector的begin()和end()法都会返回个vector::iterator对象,分别指向vector的元素位置
和尾元素的下个位置(我们可以称之为结束标志位)。
对个iterator(迭代)对象的使与个指针变的使极为相似,或者可以这样说,指针就是
个常标准的iterator(迭代)。
Ex:
#include <iostream>
v 1.1 2016.12.5
! /!20 358
剩余357页未读,继续阅读
f_zyj
- 粉丝: 2993
- 资源: 24
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 前端面试必问:真实项目经验大揭秘
- 永磁同步电机二阶自抗扰神经网络控制技术与实践
- 基于HAL库的LoRa通讯与SHT30温湿度测量项目
- avaWeb-mast推荐系统开发实战指南
- 慧鱼SolidWorks零件模型库:设计与创新的强大工具
- MATLAB实现稀疏傅里叶变换(SFFT)代码及测试
- ChatGPT联网模式亮相,体验智能压缩技术.zip
- 掌握进程保护的HOOK API技术
- 基于.Net的日用品网站开发:设计、实现与分析
- MyBatis-Spring 1.3.2版本下载指南
- 开源全能媒体播放器:小戴媒体播放器2 5.1-3
- 华为eNSP参考文档:DHCP与VRP操作指南
- SpringMyBatis实现疫苗接种预约系统
- VHDL实现倒车雷达系统源码免费提供
- 掌握软件测评师考试要点:历年真题解析
- 轻松下载微信视频号内容的新工具介绍
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功