容器的总结

容器分类:

  1. 顺序容器    <--->   位置
  2. 关联容器    <--->   关键字
  3. 容器适配器

容器操作的三种层次:

  1. 对所有容器都提供的
  2. 针对顺序容器、关联容器或者无序容器
  3. 只适用于少部分容器

容器通用的常见操作:(操作形式都是函数,为了简化省略括号)

  • 大小: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();
    ...
}

回过头重新看容器,感觉只要抓住他们的重点就很简单:添加、访问、删除。

 

顺序容器

添加:

  1. push_back / push_front
  2. emplace_back / emplace /emplace_front
  3. 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都是在给定迭代器前进行元素的插入;两个操作若返回的话,返回的是指向第一个插入(构造)元素的迭代器。

访问:

  1. back
  2. front
  3. c[n]
  4. c.at(n)

NOTE3:返回值都是引用!

删除:

  1. pop_back/pop_front
  2. erase
  3. clear

NOTE4:三个可以在容器任意位置的操作:insert、erase、emplace。

当然顺序容器这些总结的操作有些容器是不适用的~如下把不适用的情况一一列举出来并且根据自己理解解释下:

 

滞留的问题:关于容器操作可能会使容器迭代器失效。C++primer p315。由于这方面感觉考的概率很小,并且在真实刷题过程中。牢记住:容器的增删操作会使得迭代器失效就行了。更多的是我目前没遇到过这种问题(先狗着吧)。。。

一个面试常见的问题:vector对象是如何增长的?

vector(string)会分配比需求空间更大的空间内存,从而避免每次添加元素都要重新分配容器的内存空间。当必须分配新的内存空间时,会将已有的元素从旧位置移动到新空间,然后添加新元素,释放旧空间。

string一些额外操作:append、replace函数。以及6种搜索函数,C++primer p320。同样的理由,面试题目肯定不会让你调stl查找字符串中的函数。所以我~不记。

 

容器适配器

适配器是啥?适配器就是一种机制,使得某种事物的行为看起来像另一种事物一样。

举例子就是:stack的低层实现就是dequeue(只不过人家把一边封口了而已~)

容器适配器分三种:

  1. stack
  2. queue
  3. 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(栈适配器)常用的操作:

  1. pop
  2. push
  3. emplace
  4. top

queue和priority_queue(队列适配器)常用的操作:

  1. pop
  2. front
  3. back       只适用于queue
  4. top         只适用于priority_queue:因为优先级队列的实现是根据“堆”,所以是二叉树的顶部。
  5. push
  6. emplace

 

关联容器在这:我是关联容器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值