目录
容器
作为STL的最主要组成部分--容器,分为向量(vector),双端队列(deque),表(list),队列(queue),堆栈(stack),集合(set),多重集合(multiset),映射(map),多重映射(multimap)。当然还有array,forward_list,hash_map,hash_set。
容器 | 特性 | 所在头文件 |
向量vector | 可以用常数时间访问和修改任意元素,在序列尾部进行插入和删除时,具有常数时间复杂度,对任意项的插入和删除就有的时间复杂度与到末尾的距离成正比,尤其对向量头的添加和删除的代价是惊人的高的 | <vector> |
双端队列deque | 基本上与向量相同,唯一的不同是,其在序列头部插入和删除操作也具有常量时间复杂度 | <deque> |
表list | 对任意元素的访问与对两端的距离成正比,但对某个位置上插入和删除一个项的花费为常数时间。 | <list> |
队列queue | 插入只可以在尾部进行,删除、检索和修改只允许从头部进行。按照先进先出的原则。 | <queue> |
堆栈stack | 堆栈是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项。即按照后进先出的原则 | <stack> |
集合set | 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序,具有快速查找的功能。但是它是以牺牲插入删除操作的效率为代价的 | <set> |
多重集合multiset | 和集合基本相同,但可以支持重复元素具有快速查找能力 | <set> |
映射map | 由{键,值}对组成的集合,以某种作用于键对上的谓词排列。具有快速查找能力 | <map> |
多重集合multimap | 比起映射,一个键可以对应多了值。具有快速查找能力 | <map> |
hash_map hash_set | 底层是hash_table,插入删除O(1),占用空间大,无序。 | <hash_map> <hash_set> |
array | 相当于标准数组的容器类型。它是一个有 N 个 T 类型元素的固定序列。除了需要指定元素的类型和个数之外,它和常规数组没有太大的差别。显然,不能增加或删除元素。 | <array> |
常用的容器
vector
一 理论:
1.扩充空间(不论多大)都应该这样做:
- 配置一块新空间
- 将旧元素一一搬往新址
- 把原来的空间释放还给系统
2.vector 的数据安排以及操作方式,与array 非常相似。两者的唯一差别在于空间的利用的灵活性。Array 的扩充空间要程序员自己来写。
二 实际应用:
1.数据成员:
Protected:
Iterator start; //表示目前使用空间的头
Iterator finish; //表示目前使用空间的尾
Iterator end_of_storage; //表示目前可用空间的尾
(注意这几个数据成员在外部不可以使用,他们是protected , 所以只能通过函数得到他们)
Public:
Iterator //vector 的迭代器(是普通指针)
2.成员函数:
Public:
Iterator begin(); //返回start
Iterator end(); //返回 finish
Reference front(); //返回首元素的引用
Reference back(); //返回尾元素的引用
Size_type size(); //返回使用空间的大小,finish-start
Size_type capacity(); //返回容量的大小,end_of_storage-start
Void push_back(const T& x); //将元素插入到最尾端
(注意当用push_back 向vector 尾部加元素的时候,如果当前的空间不足,vector 会重新申请空间,这次申请的空间是原来的空间大小的1.5倍,也就是新的可用空间将增加为原来的1.5倍)
Void pop_back(); //将最尾端的元素取出
(注意当用pop_back 删除尾部的元素时,vector 的capacity 是不会变化的)
Iterator erase(iterator position) //清除某位置上的元素,vector的使用空间会减少
Void insert(插入的位置,插入的数值) //在某个位置才插入多少个元素,vector 的使用空间会增加
Void clear() //清除所有元素,vector 的使用空间减为零,可用空间不变
list
一 理论
STL list 是一个双向链表,迭代器具备前移和后移的能力。list 有一个重要的性质:插入操作和结合操作会造成原有的迭代器失效。应用时应该用<list>
二 实际应用
1.与vector相同的操作:
List<int> list;
Ilist.push_back(0);
Ilist.begin();
Ilist.end();
Ilist.insert();
Ilist.erase();
Ilist.clear();
2.特有的操作
(1)Void push_front(const T &x); //插入一个结点,作为头结点
(2)Void push_back(const T &x); //插入一个结点,作为尾结点
(3)Void pop_front(); //移除头结点
(4)Void pop_back(); //移除尾结点
(5)Void remove(const T&value); //将数值为value的所有元素移除
(6)Void unique(); //将“连续而相同的元素”移除只剩一个
(7)Void splice(iterator position, list &x); //将x 结合于position所指位置之前。X 必须不同于*this
(8)Void splice(iterator position, list&, iterator i); //将i所指的元素结合于position所指位置之前。Position 和 i 可指向同一个list
(9)Void splice(iterator position, list&, iterator first, iterator lsat); //将[first, last)内的所有元素结合于 position 所指的位置之前,position和[first, last)可指向同一个list,但是position 不能位于[first, last)之内。
(10)void merge(list& x); //将x合并到*this 身上。两个lists 的内容都必须先经过递增排序。
(11)void reverse(); //将*this 的内容逆向重置
(12)void sort(); //将list 的元素进行升序排序
deque
一 理论
1.Deque 是一种双向开口的连续性空间。可以在头尾两端分别做元素的插入和删除操作。Vector 从技术观点也可以在头尾两端进行插入和删除操作,但是其头部操作的效率很低。
2.deque 没有容量的观念。它是动态以分段连续空间组合而成,随时可以增加一块更大的空间,然后复制元素。
3.deque 的迭代器不是普通的指针,其复杂度比vector 复杂的多。除非必要,我们应该尽量选择使用vector 而非 deque。
4.deque 由一段一段的定量连续空间构成。一旦有必要在deque 的前端和尾端增加新空间,便配置一段定量连续空间,串接在整个deque 的头端或尾端。
5.可以使用下标的操作
6.应用时应该加<deque>
二 实际应用
deque 的其他操作基本同vector
- push_back();
- push_front();
- pop_back();
- pop_front();
- clear();
- erase();
- insert();
- resize(); //重新设置deque的长度大小
set,map
一 理论
- Map 的特性是,所有元素都会根据元素的键值自动被排序,map的所有元素都是pair,同时拥有实值(value)和键值(key)。Pair的第一元素被视为键值,第二元素被视为实值。Map 不允许两个元素拥有相同的键值。
- map 的键值关系到map的元素的排列规则,任意改变map元素键值将严重破坏map的组织。所以不可以通过map 的迭代器来改变map 的键值。但是可以通过迭代器来修改元素的实值。
- Set的特性是,所有元素都会根据元素的键值自动被排序,Set 的元素不像Map那样可以同时拥有实值和键值,Set 元素的键值就是实值,实值就是键值。Set 不允许两个元素有相同的键值。
- 因为Set 元素值就是其键值,关系到 Set 元素的排列规则。如果任意改变Set 的元素值,会严重的破坏Set组织。
二 实际应用
map:
1.使用map 时首先包括头文件: #include<map>
2.使用时应该加上宏:#pragma warning (disable:4786) 来去除警告
3.构造函数:
Map<string,int> simap; //第一个参数是键值、第二个参数是实值
4. iterator find(键值); //它是map 的成员函数,用来找指定键值map的迭代器
5.pair<string,int> pairTemp(string(“A”),5); //pair的构造函数
6.iterator insert(iterator position, pairTemp); //将pairTemp 插入到map 中
7.void erase(iterator position); //删除指定位置上的 map 元素
8.size_type count(键值); //判断该键值的Map 元素是否存在
9.size_type size(); //返回map 中的元素的个数
10.iterator lower_bound(键值); //返回该键值或者大于该键值的map 的迭代器
11.iterator upper_bound的(键值); //返回大于该键值的map 的迭代器
set:
1.初始化可以定义一个数组,将数组直接赋值给Set的元素。这时把数组中的重复元素删除。
Int a[5]={1,2,3,4,5};
Set<int> iset(a,a + 5);
2..insert(要插入的值);
3.erase(要删除的值);
4.find(要查找的值);
5.count(要数的值); //返回该值的数值
6.clear();
7.lower_bound();
8.upper_bound();
一些底层实现
参考:https://blog.csdn.net/daaikuaichuan/article/details/80717222