声明(置顶)
本网站属个人分享网站,非营利性网站!
头文件:#include<utility>
像vector iostream等头文件都包含了utility头文件,所以有这些头文件的情况下,使用pair时,utility头文件可以不写,不会报错
定义方法
pair<int,string> a;
//表示a中有两个类型,第一个元素是int型,第二个元素是string类型。
pair<string,string> a("James","Joy"); //直接初始化
常用操作
(1)对于pair类,由于它只有两个元素,分别为first和second,因此直接使用普通的点操作符即可访问其成员
pair<string,string> a("Lily","Poly");
cout<<a.first<<" "<<a.second; //a.first返回前项,a,second返回后项
(2)生成一个新的pair对象,可以使用make_pair对已存在的两个数据构造一个新的pair类型
int a=8:
string m=James";
pair <int,string> newone:
newone=make pair(a,m):
(3)两个pair类型数据可以直接使用==,!=,< , <=,>,>=比较大
小,比较规则是先以first的大小作为标准,只有当first相等时才去判别
second的大小。pair默认对first升序,当first相同时对second升序。
fill与memset类似
memset函数的格式:
memset(数组名,值,sizeof(数组名))
注意: memset需要头文件 <cstring>
memset函数的作用:将数字以单个字节逐个拷贝的方式放到指定的内存中
memset(a,127,sizeof(a))
127的二进制表示是01111111,那么在a数组里放的内容就是(十进制的2139062143)
这样就可以将数组里的全部元素初始化为一个很大的数,在最短路径问题以及其他很多算法中都是需要用到的。
今天发现一个普遍的现象,阅读竟然连开放式的想象题都有标准答案,难道教育系统只能通过标准答案来评判一道题吗?甚至我觉得这都不应该是一道题,而是卷子上留的思考对吧?
难道我就连写“你想对谁谁谁说什么?”这种题的时候,都必须要是正向的吗?生活中又不是一切都是正向的吧!这难道不是一种对反面事物的逃避吗?
假如真如我所想,是对一种反面事物的逃避,就给大家分享一个短片吧,是我前几天看到的,讲的是因为父母小的时候一直为小孩传授一种思想,这种思想为:世界上一切事物都是好的,坏事都可以跳过。这个孩子长大后就不停地自残
大家都问为什么?是啊,为什么呢?他说,他以为,所有坏事都可以跳过,所以试了试。
我觉得这个短片用来形容现在的教育系统很合适,希望他们随着时间的流逝能意识到问题,剩下的我也不过多赘述了,没什么好说的
上课时候根本不好好讲课,上她的课不如睡觉,上课时候的小表情简直了

这张图十分甚至有十五分像她上课时的样子,
身子必须是弯的,小眼神必须是有的,嘴巴必须是弯的!
有很多人问我怎么敢在网上吐槽老师
问就是


头文件<map>
map是STL的一个关联容器,翻译为映射,数字也是一种映射。如int
a[10]是int到int的映射,而a[5] = 25,是把5映射到25。
map映射容器的元素数据是一个键值和一个映照数据组成的,键值与映照数据之间有一一映照关系。
map映照容器的数据结构是采用红黑树来实现的,插入键值的元素不允许重复,比较函数只对元素的键值进行比较,元素的各项数据可通过键值检索出来
| 键值 | 映照数据 |
| Exam: Name | Score |
| Jack | 98.5 |
| Bomi | 96.0 |
| Kate | 97.5 |
map映照容器元素的数据构成示意图
普通int数组是map<int,int>a;
字母到整型的映射是map<char,int>a;
字符串到整型的映射是map<string,int>a;
| 作用 | map<int,string> m; | 常用函数功能 | 备注 |
| 查询 | m.at[3]或m[3] | 返回一个引用,指向键位3时的对应值;如果元素不存在,map会自动建立这个元素 | 注意,它和数组下标完全不是一回事 |

queue是队列的容器,需要头文件<queue>,并且必须要有"using namespace std;"
队列无法访问中间的元素,队列只能访问队首和队尾
| queue<int> q; | 常用函数功能 |
| q.front(),q.back() | 将x入队 front()返回队首元素;back()返回队尾元素 |
| q.empty() | 判断queue是否为空,空为true,否则为false |
| q.size | 返回queue内元素个数 |
| q.pop() | 队首元素出队 |
所有函数时间复杂度都为O(1)
注意:pop() 必须在队列不为空时使用,所以在使用之前一定先判断队列是否为空!!!!

stack就是栈的容器,头文件<stack>,并且必须要有 using namespace std; ,但是stack只能访问栈顶
| stack<int> st; | 常用函数功能 |
| st.push(x) | 将x入栈 |
| st.top() | 获取栈顶元素 |
| st.pop() | 弹出栈顶元素 |
| st.empty() | 判断stack是否为空,空为true,否则为false |
| st.size() | 返回stack内元素个数 |
所有函数时间复杂度都为O(1)
注意:top()和pop()必须在栈不为空时使用,所以在使用之前一定要先判断栈是否为空

vector实际就是动态数组,头文件<vector>,并且必须要有"
using namespace std;"这行代码。随机存取任何元素都能在常数时间完成。在尾部增删元素具有较好的性能。
尾端插入和删除元素,算法时间复杂度都为O(1);其他元素插入和删除为O(n)
| 作用 | vector<int> v; | 常用函数功能 | 备注 |
| 内存分配 | v.capacity() | 当前可容纳的vector元素个数 | 使用之前应该分配好使用空间和内存 |
| v.reserve(n) | 扩大容量为n | ||
| v.at(i) | 返回索引所标识的元素。对i进行越界检查 | ||
| v[i] | 返回索引所标识的元素。和数组用法几乎完全相同,不检查 | ||
| 元素存取 | v.front() | 返回第一个元素,不检查第一个元素是否存在 | |
| v.back() | 返回最后一个元素,不检查最后一个元素是否存在 |
| 作用 | vector<int> v; | 常用函数功能 | 备注 |
| 插入元素 | v.insert(pos,e) | 在pos位置插入元素e的副本,并返回新元素位置 | 这三种操作涉及大量元素的移动,可能会产生严重影响效果 |
| v.insert(pos,n,e) | 在pos位置插入n个元素e的副本 | ||
| v.insert(pos,begin,end) | 在pos位置插入区间(begin,end)内所有元素的副本 | ||
| v.push_back(20) | 尾端插入新元素的副本 |
| 作用 | vector<int> v; | 常用函数功能 | 备注 |
| 移除元素 | v.erase(pos) | 删除pos位置的元素,返回下一个元素的位置 | 由vector产生的迭代器持续有效,除非产生(1)插入元素;(2)容器变化引起内存重新分配 |
| v.erase(begin,end) | 删除区间(begin,end)内所有元素,返回下一个元素的位置 | ||
| v.pop_back() | 移除最后一个元素但不返回最后一个元素 | ||
| v.clear() | 移除所有元素,清空容器 | ||
| v.resize(num) | 将元素数量改为num(增加的元素用默认构造函数产生,多余的元素被删除) | ||
| v.resize(num,e) | 将元素数量改为num(增加的元素是e的副本) | ||
| v.empty() | 判断是否为空,空为true,否则为false | ||
| v.size() | 返回元素个数 | ||