泛型程序设计简单地说是使用模板的程序设计法。
将一些常用的数据结构(比如链表,数组,二叉树)和算法(比如排序,查找)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。
标准模板库(标准模板库)就是一些常用数据结构和算法的模板的集合。
有了STL,不必再写大多的标准数据结构和算法,并且可获得非常高的性能。
STL中的基本的概念
容器:可容纳各种数据类型的通用数据结构,是类模板
迭代器:可用于依次存取容器中元素,类似于指针
算法:用来操作容器中的元素的函数模板
- 排序()来对一个矢量中的数据进行排序
- 找到()来搜索一个列表中的对象
算法本身与他们操作的数据的类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
容器以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模版,分为三种:
1)顺序容器
矢量,双端,列表
2)关联容器
设置,多集,地图,多重映射
3)容器适配器
栈,队列,priority_queue
对象被插入容器中时,被插入的的英文对象的一个复制品。许多算法,比如排序,查找,要求对容器中的元素进行比较,有的容器本身就是排序的,所以,放入容器的对象所属的类,往往还应该重载==和<运算符。
顺序容器简介:
容器并非排序的,元素的插入位置同元素的值无关。
有载体,双端队列,列表三种
矢量头文件<矢量>动态数组。
元素在内存连续存放。随机存取元素任何都能在常数时间完成。在尾端增量元素具有较佳的性能(大部分情况下是常数时间)。因为矢量一般会多分配存储空间,元素填满空间溢出后,才会重新再分配存储空间。
队列queue详细介绍:
https://www.cnblogs.com/xuning/p/3321733.html
双端队列头文件<双端队列>双向队列。
元素在内存连续存放。随机存取任何元素都能在常数时间完成(但次于vector)。在两端增量元素具有较佳的性能(大部分情况下是常数时间)。
列表头文件<列表>双向链表。
元素在内存不连续存放,在任何位置增量元素都能在常数时间完成。不支持随机存取。
关联容器:
- 元素是排序的
- 插入任何元素,都按相应的排序规则来确定其位置
- 在查找时具有非常好的性能
- 通常以平衡二叉树方式实现,插入和检索的时间都是O(日志(N))
-
set / multiset头文件<set>
设置即集合.SET中不允许相同元素,多集中网求允许存在相同的元素。
-
map / multimap头文件<map>
地图与集的不同在于映射存放中的元素有御姐仅有两个成员变量,一个名为第一,另一个名为第二,地图根据第一值对元素进行从小到大排序,并可快速地根据第一来检索元素.MAP多同图产品的不同在于是否网求允许相同第一值的元素。
容器适配器
堆栈:头文件<堆>栈。
是项的有限序列,并满足序列中被删除,检索和修改的项只能是最近插入序列的项(栈顶的项)。后进先出。
队列头文件<队列>队列。
插入只可以在尾部进行,删除,检索和修改只允许从头部进行。先进先出。
priority_queue头文件<队列>优先级队列。
最高优先级元素总是第一个出列
顺序容器和关联容器中都有的成员函数:
顺序容器的常用成员函数:
迭代器:
定义一个容器类的迭代器的方法可以是:
容器类名:: iterator变量名;
或:
容器类名:: const_iterator变量名;
访问一个迭代器指向的元素:
*迭代器变量名
迭代器上可以执行++操作,以使其指向容器中的下一个元素。如果迭代器到达了容器中的最后一个元素的后面,此时再使用它,就会出错,类似于使用NULL或未初始化的指针一样。
双向迭代器:
随机访问迭代器:
P <P1指的是p在P1前面:
算法简介:
在STL里的区间都是左闭右开的
向量:
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素
vector::erase()方法有两种重载形式
如下:
1,迭代器擦除(iterator _Where);
v1.erase(v1.begin()); //删除v1中的第一个元素
vec.erase(vec.begin()+ 2);删除第3个元素
2,迭代器擦除(迭代器_First,iterator _Last);
//删除v1.begin()+ 1和v1.begin()+ 2两个元素
v1.erase(v1.begin()+ 1,v1.begin()+ 3);
vec.erase(vec.begin()+ 1,vec.begin()+ j)的;删除区间[I,J-1];区间从0开始
双端队列
所有适用于向量的操作都适用于deque.deque还有push_front(将元素插入到前面)和pop_front(删除最前面的元素)操作,复杂度是O(1)
拼接:在指定位置前面插入另一链表中的一个或多个元素,并在另一链表中删除被插入的元素