《STL的应用》课程总结

《STL的应用》课程总结

目录:

  1. vector
  2. set
  3. map
  4. 栈和队列

一. 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容器内的元素呢?

其实主要有两种方法:

  1. 通过下标访问
  2. 通过迭代器访问

这里就不详细说了

:那使用vector时有哪些注意点呢?

  1. vector扩容常数大,耗时
  2. 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相似,主要区别是取队首,queueq.front(); priority_queueq.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();//判断队列是否为空

大佬nb

1 个赞

有帮助!!!赞!!!

1 个赞