stl基础知识点

学习STL

​ 对于STL的理解,我仅仅局限在听说或者用过sort这种简单的操作上面吧。毕竟在期末考试中,为了锻炼自己代码能力,是不允许使用STL的。选择了PAT考试,在甲级范围的题目上,对于一些循环的简单优化,还是无法达到它对于时间限制的要求。如此,依托于ACM学长们留下的宝贵资料,自己学习一边,自己记录了一下函数保存下来方便查用。感谢bLue学长,虽然他不一定能看到哈哈哈。

algorithm

​ 需要引入的头文件cstdiocstringalgorithmfunctional

  • 非修改操作
    • find()查找元素
      • find(begin, end, key)
      • 返回第一个等于key的元素的迭代器
    • count()返回元素出现次数
      • count(begin, end, key)
      • 返回值为key的元素的数量
  • 修改操作
    • swap
      • swap(a,b)
      • 交换两个变量的值
    • reverse
      • reverse(b, b+5)
      • 反转后
    • unique
      • 去重,需要保证有序,返回去重后的end
      • new_len = unique(c, c+6)-c
    • *fill
    • *copy
  • 排序
    • sort
      • 运算符重载
      • 定义cmp函数
    • *stable_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

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()返回元素的个数
引入的头文件

​ 引入的头文件cstdiovectoralgorithm

代码
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()返回栈内元素数量
引入头文件

​ 引入头文件有stackcstdio

代码示例
stack<int> s;
s.top(); // 返回栈顶元素
s.empty(); //判断是否为空
s.size(); // 返回元素数量
s.push(2); // 入栈
s.pop(); // 出栈

队列

​ 灵活方便

常用函数
函数名作用
push()将元素加入队列
pop()将队首元素弹出
front()返回队首元素
empty()队列是否为空
size()返回队列内元素数量
引入头文件

​ 需要引入的头文件cstdioqueue

代码使用
q.push(x)		// 入队
q.pop()			// 出队
q.front()		// 访问队首元素
q.back()		// 访问队尾元素
q.empty()		// 判断是否为空
q.size()		// 返回元素数量

优先队列

​ 灵活方便,允许自定义优先级规则

函数和作用
函数名作用
push()将元素加入队列
pop()将队首元素弹出
top()返回队首元素
empty()队列是否为空
size()返回队列内元素数量
引入的头文件

​ 引入头文件cstdioqueue

代码使用
q.push(x)		// 入队
q.pop()			// 出队
q.top()			// 访问队首元素
q.empty()		// 判断是否为空
q.size()		// 返回元素数量

集合

​ 传统意义上的集合,元素不重复(自动去重),自动保持有序

函数和作用
函数名作用
insert()插入元素到集合
erase()从集合删除元素
count()判断元素是否存在
size()返回集合中元素的个数
clear()清空 set
引入的头文件

​ 引入头文件cstdioset

代码使用
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
引入的头文件

​ 引入头文件cstdiomapstring

代码使用
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

引入的头文件

​ 引入头文件cstdioutility

代码使用
// 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);
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值