STL( Standard Template Library)标准模板库
一、STL有两个特点:
1、它使算法和数据结构分离。
2、它使用了C++里面的模板。
这两特点都有一个目的就是使得它的通用性更强。如STL里的sort函数,它可以用来操作数组、链表等数据结构。
二、STL有三个基本组件:
1、迭代器:提供访问容器对象的方法
2、容器:是一种数据结构,如list、vector等。
3、算法:用来操作容器中的数据的模板函数。
三、头文件
为避免和其它头文件起冲突,STL不再使用.h的头文件。
例如下面的这个为了使用string类、迭代器、算法的例子:
#include <string>
#include <iterator>
#include <algorithm>
以下是一些头文件中包含的容器:
<deque> deque
<list> list
<queue> queue priority_queue
<map> map multimap
<set> set multiset
<stack> stack
<vector> vector vector<bool>
四、迭代器详解
STL提供了五种迭代器:
1、Input iterators提供对数据的只读访问。
2、Output iterators提供对数据的只写访问。
3、Forward iterators提供读写访问,并能向前推进的迭代器。
4、Bidirectional iterators提供读写访问,并能向前和向后操作。
5、Random access iterators提供读写访问,并能在数据中随机移动。
这里要说明的是指针也是一种迭代器,为了说明这个这里举了一个例子,也就是使用指针作为迭代器用于STL中的find()算法来搜索普通数组。
#include <iostream.h>
#include <algorithm>
using namespace std;
#define SIZE 100
int iarry[SIZE];
int main()
{
arry[20]=50;
int* p=find(iarry,iarry+SIZE,50);
if(ip==iarry+SIZE)
cout<<"没找到50"<<endl;
else
cout<<"找到50"<<endl;
return 0;
}
作为对比这里要使用一个容器迭代器的搜索例子,和指针不同的是可以使用容器类来提取迭代器对象。两个典型的迭代器方法begin()和end(),它们在大多数容器中表示了容器的范围。
下面这个是使用了vector来代替数组:
#include <iostream.h>
#include <algorithm>
#include <vector>
using namespace std;
vector<int> intVector(100);
int main()
{
intVector[20]=50;
vector<int>::iterator intlter=find(intVector.begin(),intVector.end(),50);
if(intlter!=intVector.end())
cout<<"vector容器包含"<<*intlter<<endl;
else
cout<<"vector容器不包含50"<<endl;
return 0;
}
五、容器(vector封装数组,list封装了链表,map和set封装了二叉树等)
vector(向量)——STL中标准而安全的数组。 相当与数组,从后面快速的插入与删除,直接访问任何元素
deque(双端队列double-ended queue)——在功能上和vector相似,但是可以在前后两端向其中添加数据。
list(列表)——游标一次只可以移动一步。如果你对链表已经很熟悉,那么STL中的list则是一个双向链表(每个节点有指向前驱和指向后继的两个指针)。
联合容器
(set multiset map multimap被称为关联容器,他们都把一个键值于一个元素对应起来,并用该键来查找,插入,删除等操作,他们对插入删除操作取得了比线型时间更好的对数时间效果,当元素增多时他们内部使用的是二分查找,效率更加高效;但如果我们不需要这种额外的效率,就可以避免那些导致好时间带来的可观的复杂度与额外的指针空间;)
set(集合)——容器中的元素会自动按大小排序。元素的键和值合二为一,这些数据的值(value)必须是唯一的。
multiset(多重集)——和集合(set)相似,然而其中的值不要求必须是唯一的(即可以有重复)。
map(映射)——经过排序了的二元组的集合,map中的每个元素都是由两个值组成,其中的key(键值,一个map中的键值必须是唯一的)是在排序 或搜索时使用,它的值可以在容器中重新获取;而另一个值是该元素关联的数值。比如,除了可以ar[43] = "overripe"这样找到一个数据,map还可以通过ar["banana"] = "overripe"这样的方法找到一个数据。如果你想获得其中的元素信息,通过输入元素的全名就可以轻松实现。
multimap(多重映射)——和映射(map)相似,然而其中的键值不要求必须是唯一的(即可以有重复)。
容器适配器
stack 后进先出
queue 先进先出
priority_queue 最高优先级元素总是第一个出列
六、算法
1、排序算法
STL中的排序算法有以下几种:
sort | 对给定区间所有元素进行排序 |
stable_sort | 对给定区间所有元素进行稳定排序 |
partial_sort | 对给定区间所有元素部分排序 |
partial_sort_copy | 对给定区间复制并排序 |
nth_element | 找出给定区间的某个位置对应的元素 |
is_sorted | 判断一个区间是否已经排好序 |
partition | 使得符合某个条件的元素放在前面 |
stable_partition | 相对稳定的使得符合某个条件的元素放在前面 |
STL中默认排序以从小到大来进行排序。如果你不想使用默认的来进行排序,
则你可以使用STL提供的以下一些仿函数
其它的有空会继续写
equal_to | 相等 |
not_equal_to | 不相等 |
less | 小于 |
greater | 大于 |
less_equal | 小于等于 |
greater_equal | 大于等于 |
vector <int> vect;
sort(vect.begin(), vect.end());
//此时相当于调用
sort(vect.begin(), vect.end(), less<int>());
你也可以自己定义一个仿函数,定义的格式如下
bool 函数名(const 参数类型 & 参数1,const 参数类型 & 参数2)
{
return 布尔值;
}