容器概述

1、容器概述

可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模版,分为三种:

(1)顺序容器

vector, deque,list

(2)关联容器

set, multiset, map, multimap(用于排序,速度很快)

(3)容器适配器

stack, queue, priority_queue

注意:对象被插入容器中时,被插入的是对象的一个复制品。许多算法,比如排序,查找,要求对容器中的元素进行比较,有的容器本身就是排序的,所以,放入容器的对象所属的类往往还应该重载 == 和 < 运算符

2、顺序容器

(1)顺序容器特点

容器并非排序的,元素的插入位置同元素的值无关。

(2) 常用的顺序容器

1) vector

  • 头文件 < vector>
  • 功能:向量、动态数组,即:元素个数可以动态变化。元素在内存连续存放。随机存取任何元素都能在常数时完成。
  • vertor 容器特点:在尾端增删元素具有较佳的性能(大部分情况下是常数时间,某些特殊情况下需要O(n))。
    在这里插入图片描述
    关于时间复杂度:
  • vector往往先开辟较多的存储空间,然后随着向容器中添加元素,如果空间是够用的,那么需要的时间就是常数的。
  • 但是如果空间不够用了,需要重新开辟空间,并将原本所有的元素拷贝进来,这个时候消耗的时间就是O(n)的。插入或者在头部添加元素时间复杂度是O(n)的。在学习STL时需要学习各个容器上的操作的时间复杂度,以便写出性能更好的程序。

2)deque

  • 头文件 < deque>
  • 功能:双向队列。元素在内存连续存放。
  • 特点
    (1) 随机存取任何元素都能在常数时间完成(但次于vector)。
    (2)在两端增删元素具有较佳的性能(大部分情况下是常数时间,除非deque的空间不够用了,需要重新分配存储空间。)。
    在这里插入图片描述

3)list

  • 头文件 < list>
  • 功能:双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成不支持随机存取
    在这里插入图片描述

3、关联容器

(1)关联容器特点
  • 元素是排序的。(排序的目的是为了查找)
  • 插入任何元素,都按相应的排序规则来确定其位置。
  • 在查找时具有非常好的性能
  • 通常以平衡二叉树方式实现,插入和检索的时间都是 O(log(N)) (通常以折半查找实现)。
(2) 常用的关联容器
1) set/multiset
  • 头文件:< set>
  • 功能:set 即集合。 set中不允许相同元素, multiset中允许存在相同的元素
2)map/multimap
  • 头文件:< map >
  • 功能:map与set的不同在于,map只能放对象,且对象中只能有两个成员变量,一个名为first,另一个名为second。不允许两个变量的first相同。map根据first值对元素进行从小到大排序(小到大的可以自定义),并可快速地根据first来检索元素。

注意:map同multimap的不同在于是否允许相同first值的元素。(即:map中关键字不能重复,multimap中可以重复。)

4、容器适配器

(1)容器适配器特点
(2) 常用的容器适配器
1)stack
  • 头文件:< stack>
  • 功能:。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项(栈顶的项)。栈是一种 后进先出的数据结构。
    在这里插入图片描述
2)queue
  • 头文件: < queue>
  • 功能:队列(单向队列)。对于队列来说,插入只可以在尾部进行,删除、检索和修改只允许从头部进行。 先进先出
    在这里插入图片描述
3)priority_queue
  • 头文件:< queue>
  • 功能:优先级队列(内部维持某种有序)。最高优先级元素总是第一个出列。

5、顺序容器和关联容器都要有的成员函数(共有的成员函数)

  • begin 返回指向容器中第一个元素的迭代器
  • end 返回指向容器中最后一个元素后面的位置的迭代器
  • rbegin 返回指向容器中最后一个元素的迭代器
  • rend 返回指向容器中第一个元素前面的位置的迭代器
  • erase 从容器中删除一个或几个元素
  • clear 从容器中删除所有元素

6、顺序容器中常用的成员函数(顺序容器中才有的函数)

  • front :返回容器中第一个元素的引用
  • back : 返回容器中最后一个元素的引用
  • push_back : 在容器末尾增加新元素
  • pop_back : 删除容器末尾的元素
  • erase :删除迭代器指向的元素(可能会使该迭代器失效),或删 除一个区间,返回被删除元素后面的那个元素的迭代器
posted @ 2019-12-16 17:43  江南又一春  阅读(177)  评论(0编辑  收藏  举报