学习STL
对于STL的理解,我仅仅局限在听说或者用过sort
这种简单的操作上面吧。毕竟在期末考试中,为了锻炼自己代码能力,是不允许使用STL的。选择了PAT考试,在甲级范围的题目上,对于一些循环的简单优化,还是无法达到它对于时间限制的要求。如此,依托于ACM学长们留下的宝贵资料,自己学习一边,自己记录了一下函数保存下来方便查用。感谢bLue学长,虽然他不一定能看到哈哈哈。
文章目录
algorithm
需要引入的头文件cstdio
、cstring
、algorithm
、functional
。
- 非修改操作
- find()查找元素
- find(begin, end, key)
- 返回第一个等于key的元素的迭代器
- count()返回元素出现次数
- count(begin, end, key)
- 返回值为key的元素的数量
- find()查找元素
- 修改操作
- swap
- swap(a,b)
- 交换两个变量的值
- reverse
- reverse(b, b+5)
- 反转后
- unique
- 去重,需要保证有序,返回去重后的end
- new_len = unique(c, c+6)-c
- *fill
- *copy
- swap
- 排序
- sort
- 运算符重载
- 定义cmp函数
- *stable_sort
- sort
- 二分查找
- 首先保证有序
- binary_search
- binary_search(begin, end, key)
- 如果找到返回真,否则返回假
- lower_bound
- lower_bound(begin,end,key)-a
- 返回第一个大于等于key的元素,返回地址,转换为坐标;找不到返回a[n],已越界
- upper_bound
- upper_bound(begin,end,key)-a
- 返回第一个大于key的元素,返回地址,转换为坐标
- 集合操作
- *merge
- *set_union
- 堆
- *make_heap
- *push_heap
- *pop_heap
- *sort_heap
- 最值操作
- min
- 返回最小值
- 自定义结构体可以写比较函数或重载小于号运算符来实现比较
- max
- min_element
- 返回最小的元素
- max_element
- *next_permutation
- *prev_permutation
- min
Vector动态数组
不定长数组,随用随加;适合不断向尾部追加元素。
常用函数
函数名 | 作用 |
---|---|
v.at(id) | 返回下标id的元素,越界抛出out_of_range的异常 |
v.clear() | 清空所有元素 |
v.erase(pos) | 删除pos位置的元素,返回下一个元素的位置 |
v.erase(begin, end) | 删除范围内的所有元素,返回下一个元素 |
v.empty() | 判断是否为空 |
v.front() | 返回第一个元素 |
v.back() | 返回最后一个元素,不检查 |
v.pop_back() | 删除最后一个元素 |
v.push_back() | 在尾部加入一个元素 |
v.count(x) | 返回某个元素出现的次数 |
v.size() | 返回元素的个数 |
引入的头文件
引入的头文件cstdio
、vector
、algorithm
。
代码
vector <int> v1; //创建一个空的vector
v1.empty() // 判断是否为空
v1.push_back(1) //向末尾加入
for(int i = 0;i < v1.size(); ++i) v1[i];//像数组访问遍历
vector<int>::iterator it; // 迭代器方式遍历
for(it=v1.begin();it!=v1.end;++it) printf("%d", *it) //类似指针的方式访问元素的值
v2.front() // 第一个元素的值
v2.back() // 最后一个元素的值
v2.pop_back() // 删除最后一个元素
v2.insert(v2.begin()+1,4) // 在下标为1处插入元素4,后方元素后移
v2.erase(v2.begin+1) // 删除下标为1的元素,后方元素前移
sort(v2.begin(),v2.end()) // 排序
v1 == v2 // 长度、元素是否一致
栈
灵活方便
常用函数
函数名 | 作用 |
---|---|
push() | 将元素压入栈 |
pop() | 将栈顶元素弹出 |
top() | 返回栈顶元素 |
empty() | 栈是否为空 |
size() | 返回栈内元素数量 |
引入头文件
引入头文件有stack
、cstdio
。
代码示例
stack<int> s;
s.top(); // 返回栈顶元素
s.empty(); //判断是否为空
s.size(); // 返回元素数量
s.push(2); // 入栈
s.pop(); // 出栈
队列
灵活方便
常用函数
函数名 | 作用 |
---|---|
push() | 将元素加入队列 |
pop() | 将队首元素弹出 |
front() | 返回队首元素 |
empty() | 队列是否为空 |
size() | 返回队列内元素数量 |
引入头文件
需要引入的头文件cstdio
、queue
。
代码使用
q.push(x) // 入队
q.pop() // 出队
q.front() // 访问队首元素
q.back() // 访问队尾元素
q.empty() // 判断是否为空
q.size() // 返回元素数量
优先队列
灵活方便,允许自定义优先级规则
函数和作用
函数名 | 作用 |
---|---|
push() | 将元素加入队列 |
pop() | 将队首元素弹出 |
top() | 返回队首元素 |
empty() | 队列是否为空 |
size() | 返回队列内元素数量 |
引入的头文件
引入头文件cstdio
、queue
。
代码使用
q.push(x) // 入队
q.pop() // 出队
q.top() // 访问队首元素
q.empty() // 判断是否为空
q.size() // 返回元素数量
集合
传统意义上的集合,元素不重复(自动去重),自动保持有序
函数和作用
函数名 | 作用 |
---|---|
insert() | 插入元素到集合 |
erase() | 从集合删除元素 |
count() | 判断元素是否存在 |
size() | 返回集合中元素的个数 |
clear() | 清空 set |
引入的头文件
引入头文件cstdio
、set
。
代码使用
s.insert(x) // 插入一个元素
s.clear() // 清空所有元素
s.erase(x) // 删除指定元素
s.empty() // 判断是否为空
s.count(x) // 返回某个元素出现的次数
s.size() // 返回元素个数
映射
堪称神器的“映射”,虽然有些时候有些慢;按照<键,值>的形式映射; 简单易写,直接按数组形式操作。
函数和作用
函数名 | 作用 |
---|---|
a[“abc”] = 1 | 梦中的写法 |
b[123456789] = 2 | 妈妈再也不用担心我开不了大数组 |
insert() | 插入键值对 |
count() | 判断键是否存在 |
erase() | 删除键 |
clear() | 清空 map |
引入的头文件
引入头文件cstdio
、map
、string
。
代码使用
m[k] = v // 插入一对元素
m.insert(k, v) // 插入一对元素
m.clear() // 清空所有元素
m.erase(x) // 删除指定元素
m.empty() // 判断是否为空
m.count(x) // 返回某个元素出现的次数
m.size() // 返回元素个数
二元组
简单好用的二元组
函数和作用
存储形式:(first, second)
例如平面上的点 (x, y) 就可以用 pair 表示
make_pair(a, b) 创建一个 pair
引入的头文件
引入头文件cstdio
、utility
。
代码使用
// pair<first, second> name
printf("通过构造器创建 pair:\n");
pair<string, int> p1("abc", 1); // 通过 first, second 访问
printf("%s %d\n", p1.first.c_str(), p1.second);
printf("通过 make_pair() 创建 pair:\n");
pair<int, int> p2 = make_pair(123, 456);
printf("%d %d\n", p2.first, p2.second);