《STL的应用》课程总结
目录:
- vector
- set
- map
- 栈和队列
一. vector
问:什么时候会选择使用vector呢?
1.存n×m, 1≤n,m≤10的五次方, n*m≤10的五次方 的矩阵的时候
2.存图或树的时候
3.不知道需存数的数量的时候
问:如何定义vector呢?
vector的定义其实和定义一维数组有些相似,只不过用vector定义比较节省空间(长度可以根据需要进行变化)
例如:
vector<int> v;
vector<double> v;
vector<node> v;
//这些是一维vector的定义
vector<vector<int> > v;
//这是二维vector的定义
//注意:> >之间要加空格!!!
问:那又如何对vector进行初始化呢?
课件中的这张图解释了vector是如何初始化的
问:如何访问vector容器内的元素呢?
其实主要有两种方法:
- 通过下标访问
- 通过迭代器访问
这里就不详细说了
问:那使用vector时有哪些注意点呢?
- vector扩容常数大,耗时
- vector扩容会使vector中的元素的引用失效,导致runtime error
原因:vector扩容时会找一块新的更大(2倍)的空间,并把旧空间的元素都复制到新空间,旧
空间会释放内存。引用是取内存的地址,内存被释放了,相当于就取不到地址了
最后来展示一下vector的常用函数
——————————————————————————————————————————
二. set
问:如何定义set呢?
set的定义和vector很像,除了把前面的vector变成set,其他都一模一样
问:如何访问set中的元素呢?
访问set中元素的方法和vector中的不太一样,我们只能通过迭代器访问
下面来展示一下set的常用函数
——————————————————————————————————————————
三.map
问:如何定义map呢?
map的定义其实也和前面两个差不多,但它的"<“和”>"之间要填两个类型(第一个是键的类型,第二个是值的类型)
问:如何访问map中的元素呢?
和前面两者一样,map也能通过迭代器访问,但与前两者不同的是,它还能通过键来访问( 因为 map
中的元素是键值对,因此可以根据键来访问它的值)
下面来展示一下map的常用函数
——————————————————————————————————————————
四.栈和队列
先来展示一下分类
- stack
栈:后进先出,一般用数组模拟 - queue
队列:先进先出,bfs常用 - deque
双向队列:队首队尾都可以出队入队的队列,单调队列会用到 - priority_queue
优先队列:按照值的大小出队列,先出大的
用法与queue相似,主要区别是取队首,queue
是q.front();
priority_queue
是q.top();
上面的三个相信大家都很了解了,所以我主要讲一下优先队列
优先队列:
优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中优先级最大的元素总是位于队首。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。通俗来讲:通过优先队列可以实现快速获取极值<最大、最小>
问:优先队列怎么访问最大和最小值呢?
方法如下:
- 递增greater函数对象排序:q1.top()可访问到队列最小值
- 递减less函数对象排序:q1.top()可访问到队列最大值
下面来展示一下栈和队列的基本函数运用
首先是栈:
s.push();//入栈
s.pop();//出栈
s.top();//获取栈顶元素
s.size();//获取栈的长度
s.empty();//判断栈是否为空
再是队列:
s.push();//入队
s.pop();//出队
s.front();//获取队头元素
s.back();//获取队尾元素
s.size();//获取队的长度
s.empty();//判断队列是否为空