STL学习笔记

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 布尔值;
}

你可能感兴趣的:(Algorithm,数据结构,算法,vector,list,iterator)