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

时间:2022-12-28 14:05:57

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


16340040
SDCS


目录


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; //输出元素个数 =>4
num.erase(2);
cout << num.size() << endl; // =>3
return 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