泛型程序设计
1 C++语言的核心优势之一就是便于软件重用
2 C++中有两个方面体现重用:
1 面向对象的思想:继承和多态, 标准类库
2 泛型程序设计的思想:模板机制,以及标准模板库STL
3 简单的说就是使用模板的程序设计法。
4 将一些常用的数据结构(比如链表, 数组, 二叉树 写成类模板)和算法(比如排序,查找 写成函数模板)写成模板,以后则不论数据结构里放的是什么对象,算法针对什么样的对象,则都不必重新实现数据结构,重新编写算法。
5 标准模板库就是一些常用数据结构和算法的模板的集合
6 有了STL,不必再写大多的标准数据结构和算法,并且可获得非常高的性能
STL中的基本的概念
容器:可容纳各种数据类型的通用数据结构,是类模板
迭代器:可用于依次存取容器中元素,类似于指针
算法:用来操作容器中的元素的函数模板
-- sort()来对一个vector中的数据进行排序
-- find()来搜索一个list中的对象
算法本身与他们操作的数据的类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。
eg:
int array[100];
该数组就是容器,而int*类型的指针变量就可以作为迭代器,sort算法可以作用于该容器上,对其进行排序:
sort(array, array + 70); // 将前70个元素排序 其中array为迭代器 array+70也为迭代器
容器概述
1 可以用于存放各种类型的数据(基本类型的变量,对象等)的数据结构,都是类模板,分为三种:
1)顺序容器
vector:动态一维数组, deque:双向队列, list:双向链表
2)关联容器
set, multiset, map, multimap
3)容器适配器
stack:栈, queue:队列, priority_queue:优先级队列
2 对象被插入容器中时,被插入的是对象的一个复制品。
许多算法,比如排序,查找,要求对容器中的元素进行比较,有的容器本身就是排序的,所以,放入容器的对象所属的类,往往还应该重载 == 和 < 运算符。
顺序容器简介
容器并非排序的,元素的插入位置同元素的值无关。
有vector, deque, list三种
-- vector 头文件<vector>
动态数组。元素在内存连续存放。随机存取任何元素都能在常数时间完成。在尾端增删元素具有较佳的性能(大部分情况下是常数时间)
vector在实现的时候存储空间会预先多分配一些,例如只有10个元素的情况下,vector也会事先分配32个元素的空间,好处在于添加第11个元素的时候,不需要重新分配存储空间
vector在头部或者中间插入、删除一个元素,时间复杂度为O(n);
-- deque 头文件<deque>
双向队列。元素在内存连续存放。随机存取任何元素都能在常数时间完成(但次于vector)。在两端增删元素具有较佳的性能(大部分请情况下为常数时间)。
内存中连续九个单元:
head tail
空格 空格 a0 a1 a2 a3 a4 空格 空格
deque是双向队列,会有一个队头指针head和队尾指针tail
-- list 头文件<list>
双向链表。元素在内存不连续存放。在任何位置增删元素都能在常数时间完成。不支持随机存取
关联容器简介
-- 元素是排序的
-- 插入任何元素,都按相应的排序规则来确定其位置
-- 在查找时具有非常好的性能
-- 通常以平衡二叉树方式实现,插入和检索的时间都是O(log(N))
-- set/multiset 头文件 <set>
set即集合。set中不允许相同元素,multiset中允许有形同的元素。
-- map/multimap 头文件 <map>
map与set不同在于map中存放的元素有且仅有两个成员变量,一个名为first,另一个名为second,map根据first值对元素进行从小到大排序,并可快速低根据first来检索元素。
map同multimap的不同在于是否允许相同的first值的元素。
容器适配器简介
-- stack: 头文件 <stack>
栈。是项的有限序列,并满足序列中被删除、检索和修改的项只能是最近插入序列的项(栈顶的项)。后进先出
-- queue: 头文件 <queue>
队列。插入只可以在尾部进行,删除、检索和修改之允许从头部进行。先进先出
-- priority_queue: 头文件 <queue>
优先级队列。最高优先级元素总是第一个出列
顺序容器和关联容器中都有的成员函数
begin 返回指向容器中第一个元素的迭代器
end 返回指向容器中最后一个元素后面位置的迭代器
rbegin 返回指向容器中最后一个元素的迭代器
rend 返回指向容器中第一个元素后面的位置的迭代器
erase 从容器中删除一个或几个元素
clear 从容器中删除所有元素
顺序容器的常用成员函数
front: 返回容器中第一个元素的引用
back: 返回容器中最后一个元素的引用
push_back: 在容器末尾添加新元素
pop_back: 删除容器末尾的元素
erase: 删除迭代器指向的元素(可能会使迭代器失效),或删除一个区间,返回被删除元素后面的那个元素的迭代器