(快排、归并以及二分查找这里就不说了,前面一节都说了,这里就说一下STL vevtor 容器)
C++ STL
STL就是建立在模板函数和模板类基础之上的功能强大的库
- 模板函数可以实现一般化的常用算法( 如统计、排序、查找等)
- 模板类可以实现支持几乎所有类型的容 器,用来实现常用的数据结构(如链表 、栈、队列、平衡二叉树等)
- 一个具有工业强度的,高效的C++程序库
- 它被容纳于C++标准程序库(C++Standard Library)中,是ANSI/ISO C++标准中最新的也是
极具革命性的一部分 - 该库包含了诸多在计算机科学领域里所常用的基 本数据结构和基本算法。
- 为广大C++程序员们提供了一个可扩展的应用框架 ,高度体现了软件的可复用性
- 有了STL,不必再从头写大多的标准数据结构和算 法,并且可获得非常高的性能。
C++模板
函数模板(function template)
- 是独立于类型的函数
- 可产生函数的特定版本
函数模板方法克服了 C语言解决上述问题时用大量不同函数名表示相似功能的坏习惯 克服了宏定义不能进行参数类型检查的弊端 克服了 C++函数重载用相同函数名字重写几个函数的繁琐
缺点:调试比较困难,一般先写一个特殊版本的函数,运行正确后,改成模板函数
类模板(class template)
- 跟类相关的模板,如vector
- 可产生类对特定类型的版本,如 vecto r
STL头文件
STL六大组件
容器(Container)、迭代器(Iterator)、算法(Algorithm)、仿函数(Function object) 、适配器(Adaptor)、分配器(allocator)
C++ STL中的容器
可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构。
容器分为三大类:
1)顺序容器
vector:后部插入/删除,直接访问 deque:前/后部插入/删除,直接访问 list:双向链表,任意位置插入珊ij除
2)关联容器
set:快速查找,无重复元素
multiset :快速查找,可有重复元素
map:一对一映射,无重复元素,基于关键字查找
multimap:一对一映射,可有重复元素,基于关键字查找 前2者合称为第一类容器
3)容器适配器
stack: LIFO
queue: FIFO
priority_queue:优先级高的元素先出
顺序容器
(1)vector 头文件 < vector >
实际上就是个动态数组。随机存取任何元素都能在常数时 间完成。在尾端增删元素具有较佳的性能。
(2)deque 头文件 < deque >
也是个动态数组,随机存取任何元素都能在常数时间完成 (但性能次于vector)。在两端增删元素具有较佳的性能。
(3)list 头文件 < list >
双向链表,在任何位置增删元素都能在常数时间完成。不支持随机存取。
上述三种容器称为顺序容器,是因为元素的插入位置同元素的值无关。
关联容器
关联式容器内的元素是排序的,插入任何元素, 都按相应的排序准则来确定其位置。关联式容器的特点是在查找时具有非常好的性能。
(1)set/multiset:头文件 < set >
set即集合。set中不允许相同元素,multiset中允许存在相 同的元素。
(2)map/multimap:头文件 < map >
map与set的不同在于map中存放的是成对的key/value。 并根据key对元素进行排序,可快速地根据key来检索元素 map同multimap的不同在于是否允许多个元素有相同的key值。
上述4种容器通常以平衡二叉树方式实现,插入和检索的时间都是O(logN)
容器适配器
(1)stack :头文件 < stack >
栈。是项的有限序列,并满足序列中被删除、检索和修改 的项只能是最近插入序列的项。即按照后进先出的原则
(2)queue :头文件 < queue >
队列。插入只可以在尾部进行,删除、检索和修改只允许 从头部进行。按照先进先出的原则。
(3)priority_queue :头文件 < queue >
优先级队列。最高优先级元素总是第一个出列
vector
vector 容器 是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除。
- vector模拟动态数组
- vector的元素可以是任意类型T,但必须具备赋值和拷贝能力(具有public拷贝构造函数和重载的赋值操作符)
- 必须包含的头文件#include < vector >
- vector支持随机存取
- vector的大小(size)和容量(capacity)
size返回实际元素个数,capacity返回vector能容纳的元素最大数量。如果插入元素时,元素个数超过capacity,需要重新配置内部存储器。 - 构造、拷贝和析构
- 非变动操作
- 赋值操作
- 元素存取
- 迭代器相关函数
迭代器持续有效,除非发生以下两种情况:
(1)删除或插入元素
(2)容量变化而引起内存重新分配
- 安插(insert)元素
- 移除(remove)元素