《算竞(紫书)》笔记1 STL入门


16340040
SDCS


目录

  • 算竞紫书笔记1 STL入门

    • 某些抢开头的废话
    • STL
      • 1 排序
      • 2 不定长数组vector
      • 3 集合set
      • 4 映射map
      • 5 栈stack
      • 6 队列queue
      • 7 优先队列
    • 又是废话

1.某些抢开头的废话

作为一个有基础的小白(在有基础行列中比较小白了),在高中学C++的时候,完全没有接触过STL(是不是很小白!)。毕竟,没有学过STL的C++学习之路是不完美的,甚至还有人偏激说不学STL你学C++干啥子啊!(hhhha这可不是我说的啊)所以,为了在小白面前更大神,为了在大神面前不那么小白,我觉得学学STL啦hhhhhhha。

《算法竞赛入门经典(第二版)》(封面紫白色,故人称紫书)是刘汝佳编著的一本算法入门经典之作,也进行ACM比赛的一本竞赛入门书籍。在我询问算法入门的书籍时,很多大神都推荐这本,所以我以这本书籍作为学习STL的阅读资料。(当然,我可不是在安利哦hhhhhha)

2 STL

什么是STL?STL,Standard Template Library,标准模板库。STL是早期惠普实验室为了简化程序员在处理数据结构等问题时候的工作而开发的模板库,早期版本很多,后来被加入C++标准1,成为C++重要的一部分。

2.1 排序

STL在头文件algorithm里提供了函数sort(arr_begin,arr_end),用于进行数组排序,arr_begin是数组第一个元素的地址,arr_end是数组最后一个元素的地址。

下面,输入两行数,第一行输入数n,第二行输入n个数,将这n个数进行从小到大排序,并输出排序后的结果。

#include <iostream>
#include <algorithm>
using namespace std;int main() {int n;cin >> n;int num[n];for (int i = 0; i < n; i++)cin >> num[i];sort(num, num + n);cout << num[0];for (int i = 1; i<n; i++)cout << ' ' <<num[i];cout << endl;return 0;
}
Standard Input
5
1 7 4 2 8
Standard Output
1 2 4 7 8

2.2 不定长数组vector

STL允许在包含头文件vector的情况下声明不定长数组,不过这个数组和变长数组不一样,变长数组是向普通声明数组一样声明,而vector的声明是vectorname,比如:

vector<int>num;  //声明一个标识符为num的不定长数组

在处理该数组的元素的时候,我们一样[]来处理,不过因为数组的长度不确定,vector提供了很多方法来进行不定长数组的处理(貌似这个标识符就是对象?)

方法 参数 作用
size 读取数组大小
resize NewSize 改变数组大小
push_back NewVar 向数组尾部添加一个元素
pop_back DelVar 删除数组最后一个元素
clear 清空数组
empty 判断数组是否为空

既然vector声明的也是数组,那么sort能不能对它进行排序呢?的确,sort可以对vector数组进行排序,不过这里我们不用num和num+num.size()作为sort的实参,而是num.begin()和num.end()。

sort(num.begin(),num.end());

下面,输入一行数(数量大于3),将这一行数进行从小到大排序后删除最后两个数,输出最终排序后的数组。

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;int main() {int var;vector<int>num;while (cin >> var) {num.push_back(var);}sort(num.begin(), num.end());num.resize(num.size()-2);   //也可以使用两次num.pop_back();cout << num[0];for (int i = 1; i < num.size(); i++)cout << ' ' << num[i];cout << endl;return 0;
}

2.3 集合set

STL允许是用set头文件声明类似数学中集合定义的类型,即每个元素最多只出现一次。它的声明类似vector:

set<string>str;

set的常用方法如下:

方法 参数 作用
insert NewValue 插入一个元素
size 返回当前set的元素个数
clear 清空该set
empty 判断该函数是否为空
erase DelValue 删除该元素
#include <iostream>
#include <set>
using namespace std;int main()
{set<int>num;num.insert(1);num.insert(2);num.insert(4);num.insert(100);num.insert(2);   //num里面已经有2了,不再插入 cout << num.size() << endl;  //输出元素个数 =>4num.erase(2);cout << num.size() << endl;  // =>3return 0;
}

2.4 映射map

STL在map头文件里面提供了映射的类型(应该算是类型吧),不过我更喜欢叫这玩意Hash(哈希表)。map提供了由主键(key)到值(value)的映射,每一个key都对应一个value。

map<string,int>hash_key; //声明映射,key为string,value为int
map["CSDN"] = 2016;    //赋值

此外,map还提供insert、find、count和remove等方法。(偷懒一下)

2.5 栈stack

STL在stack头文件里面提供的栈的定义。什么是栈呢?可以把栈理解成一个存放小球的圆筒,只能从上面将小球放入筒中,并且取出小球只能先去最上面一个。所谓栈,就是符合“后进先出”(Last In First Out,LIFO)规则的数据结构。

stack<int>num; //声明栈
num.push(12);  //入栈
num.pop();  //出栈
num.top();//取栈顶元素,但不删除

2.6 队列queue

STL在queue头文件里面提供了队列的定义。什么是队列呢?可以把队列理解成一个只允许一个人通过的地下通道,先进通道的人先出来,后进通道的人后出来。所谓队列,就是是符合“先进先出”(First In First Out,FIFO)原则的数据结构。

queue<int>num; //声明队列
num.push(19);  //入队列
num.pop();   //出队列
num.front();//取首元素,但不删除

2.7 优先队列

STL的优先队列也是定义在queue头文件里面。顾名思义,出队列的元素并不是首先进队列的元素,而是优先级最高的元素。我们用priority_queuepq来声明优先队列。

priority_queue<int>num; //声明优先队列
num.push(56);  //入队列
num.pop();   //出队列
num.top();//取首元素,但不删除

3 又是废话

2016.10.9:
STL并不仅仅是这些,还有很多东西值得去学习。不过嘛,前面写的STL的内容并不是很全面,再加上自己本身也不怎么会写博客,所以……吧啦吧啦什么话就不打出来了。也比较晚了,看看明天能不能更新一下STL的内容吧,还有map、栈、队列、检索,好多东西啊!!!

2016.10.10:
今天学习了一下map、栈之类的STL内容,但是觉得今天的学习效率和学到东西远远不如昨天,或许是今天没有认真的打代码来试试这些东西(看前面章节和后面章节的代码多少就知道渣渣今天没有认真学了[哭])。看来还是得认真学,不然又是日常被大佬打脸了[哭]!!!


  1. CppReference ↩

《算竞(紫书)》笔记1 STL入门相关推荐

  1. 紫书《算法竞赛入门经典》

    紫书<算法竞赛入门经典>题目一览 第3章 数组和字符串(例题) UVA 272 TEX Quotes UVA 10082 WERTYU UVA 401 Palindromes UVA 34 ...

  2. ACM入门攻略(紫书入门,不间断更新)

    声明:本文仅供参考,并且假定读者已经可以熟练运用C语言及其相关知识(大神请走开,谢谢配合). 目录:一.ACM入门的相关准备(书籍,OJ,编程语言,常用网站或工具)            二.入门阶段 ...

  3. [紫书CH0] 《算法竞赛入门经典》(第2版) 题解目录

    紫书题解 本着仅仅门外看看风景的初心,却 不慎 被其内壮丽美景所深深吸引.将会持续的画上一段时间对紫书进行系统性的学习,相关的 UVa 经典习题会道道完成并贴出题解供大家学习交流.也算是记录我曾经来过 ...

  4. (紫书,感谢作者)第7章暴力求解法

    今天,我们谈一谈紫书上面的内容--暴力求解法 对于一道问题来说,我们是可以借助计算机运算快的特点,将所有可能的情况全部(不一定是全部)列出来,然后去寻找我们想要的答案,这就是暴力求解了,但暴力求解绝对 ...

  5. 逐梦旅程学习笔记 DirectX开发入门02:旋转的彩色立方体

    本文是 系列笔记DirectX部分的第2篇,上一篇参见 逐梦旅程学习笔记 DirectX开发入门01:应用程序基本框架 这个示例增加了一些实际的内容,首先是绘制一个颜色随机变幻的彩色立方体,其二是显示 ...

  6. Hadoop学习笔记(1) ——菜鸟入门

     Hadoop学习笔记(1) --菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户能够在不了解分布式底层细节的情况下.开发分布式 ...

  7. 11行代码AC——比紫书优化,例题2-3 近似计算——解题报告

    励志用更少的代码做高效的表达 题意: 计算π/4 = 1 - 1/3 + 1/5 - 1/7 + -,直到最后一项小于10^-6. 思路分析: 本题很简单,因此计算重心从解题转化为优化. 本题为重复计 ...

  8. 3.14 我总结的一些小红书笔记发布频率技巧!【玩赚小红书】

    一.笔记审核机制 说到笔记曝光率自然离不开小红书的笔记审核机制.小红书整改之前的机制近乎于零,只要避免很多不合规的发布即可.但是,现在我们必须遵守和适应新的审核规则和机制,才有更多的笔记文章分享到达用 ...

  9. 内容为王,如何打造爆款小红书笔记?

    <2020年度KOL社交媒体投放分析报告>显示:2020年广告主在各个社交平台投放金额TOP5,分别为新浪微博.小红书.微信公众号.抖音.B站.由此可见小红书平台对于品牌推广有着潜在的价值 ...

最新文章

  1. 图灵奖得主Hamming对于少数人获得重大成果原因的思考,送给此刻克服迷惘坚持前行的你...
  2. IAR调试按钮功能说明及调试主要看哪些内容
  3. 哪个瞬间你对科研圈彻底失望了?
  4. kettle 笛卡尔_Kettle用户操作手册1
  5. Flowable 菜单说明
  6. 小白必看——一位八年程序员的经验,赶紧看看!!
  7. 两个运放制作加法器_同相加法器电路图_反相加法器电路图_运放加法器电路图解析...
  8. java字符串拼接_字符串拼接,什么时候会走StringBuilder?
  9. linux sed保存,linux sed
  10. mysql搜索结果去重_MySQL去除查询结果重复
  11. 沟通CTBS助山东烟建实现财务数据大集中
  12. idea创建类时自动添加注释
  13. 别错过,卡方检验实用总结!
  14. linux安装rtl8192cu网卡驱动,ubuntu更新rtl8192cu驱动
  15. 基于python的图片比较
  16. 语言表达的6c原则是指什么,第二讲 BEC写作的语言、语法、组织和文体
  17. 论文精度 —— 2017 CVPR《High-Resolution Image Inpainting using Multi-Scale Neural Patch Synthesis》
  18. java中根遍历后根遍历构造,恳求大佬指点!!!首先标明空子树的先根遍历序列建立一棵二叉树...
  19. 刷机大师乐蛙定制版 v3.4.0 官方版
  20. SEIR传染病模型Netlogo仿真程序

热门文章

  1. Android网络编程基础(第一弹)
  2. System.Security.SecurityException: 未找到源,但未能搜索某些或全部事件日志。不可 访问的日志: Security
  3. tkinter使用canvas实现渐变色
  4. Ubuntu分区扩容
  5. 树莓派4B使用MJPG-Streamer
  6. 数字抽奖小程序_抽奖小程序凭什么成为流量的风口?怎么以最快的方式引流?...
  7. mysql qc_qc-mysql
  8. PHP 之道中文简体版
  9. 使用html2canvas 截图 出现图片空白的问题
  10. 软件测试基本价值观笔记