容器分类:
- 顺序容器 <---> 位置
- 关联容器 <---> 关键字
- 容器适配器
容器操作的三种层次:
- 对所有容器都提供的
- 针对顺序容器、关联容器或者无序容器
- 只适用于少部分容器
容器通用的常见操作:(操作形式都是函数,为了简化省略括号)
- 大小:size、empty
- 添加/删除:insert、emplace、erase、clear
- 迭代器:begin、end
NOTE1:leetcode做题的时候,我使用了一个适配器里面的“priority_queue”,在循环的时候设置,希望能按序的把其中元素输出到vector(因为是题目需要),后来出错了,代码如下,错误原因是每次弹出一个元素,然后你优先队列元素个数已经变了。类似的问题还有:C++primer上面的建议:不要保存end迭代器。我思考了一下应该就是这种动态的容器涉及添加删除的操作,所以size和迭代器的位置是会发生改变的!要注意这点。
for(int i= 0; i< my_heap.size();i++){
my_heap.pop();
...
}
回过头重新看容器,感觉只要抓住他们的重点就很简单:添加、访问、删除。
顺序容器
添加:
- push_back / push_front
- emplace_back / emplace /emplace_front
- insert(返回值:void,iterator)
NOTE2:emplace:在指定位置构造元素而不是拷贝元素。举例子:调用emplace_back时,会在容器管理的内存空间中直接创造对象;调用push_back则会创建一个局部临时对象,并将其压入容器中。有两个需要注意的点:1、insert可以在任意的位置插入,可以近似的看做下面这样一个对应关系。另push_back速度一般比insert快。
emplace_front <---> push_front
emplace <---> insert (同理:是在迭代器指定位置之前构造元素)
emplace_back <---> push_back
2、insert和emplace都是在给定迭代器前进行元素的插入;两个操作若返回的话,返回的是指向第一个插入(构造)元素的迭代器。
访问:
- back
- front
- c[n]
- c.at(n)
NOTE3:返回值都是引用!
删除:
- pop_back/pop_front
- erase
- clear
NOTE4:三个可以在容器任意位置的操作:insert、erase、emplace。
当然顺序容器这些总结的操作有些容器是不适用的~如下把不适用的情况一一列举出来并且根据自己理解解释下:
滞留的问题:关于容器操作可能会使容器迭代器失效。C++primer p315。由于这方面感觉考的概率很小,并且在真实刷题过程中。牢记住:容器的增删操作会使得迭代器失效就行了。更多的是我目前没遇到过这种问题(先狗着吧)。。。
一个面试常见的问题:vector对象是如何增长的?
vector(string)会分配比需求空间更大的空间内存,从而避免每次添加元素都要重新分配容器的内存空间。当必须分配新的内存空间时,会将已有的元素从旧位置移动到新空间,然后添加新元素,释放旧空间。
string一些额外操作:append、replace函数。以及6种搜索函数,C++primer p320。同样的理由,面试题目肯定不会让你调stl查找字符串中的函数。所以我~不记。
容器适配器
适配器是啥?适配器就是一种机制,使得某种事物的行为看起来像另一种事物一样。
举例子就是:stack的低层实现就是dequeue(只不过人家把一边封口了而已~)
容器适配器分三种:
- stack
- queue
- priority_queue
操作自然而然像顺序容器一样,分通用和特殊的。
默认情况下:stack和queue都是基于deque实现的;priority_queue根据vector实现的。
通用:所有适配器都必须支持添加、删除、访问尾元素的功能。
特殊:
- stack只要求push_back、pop_back、back操作(很简单就想到啊!因为数据结构就是这样规定的)
- queue要求front、back、push_back、push_front。
- priority_queue除了要求push_back、pop_back、front,还要求随机访问的能力。(所以人家用vector实现)
NOTE5:每个容器适配器都基于低层容器类型的操作定义了自己的特殊操作,我们只可以使用适配的操作,而不能使用低层容器类型的操作。
stack(栈适配器)常用的操作:
- pop
- push
- emplace
- top
queue和priority_queue(队列适配器)常用的操作:
- pop
- front
- back 只适用于queue
- top 只适用于priority_queue:因为优先级队列的实现是根据“堆”,所以是二叉树的顶部。
- push
- emplace
关联容器在这:我是关联容器