STL 的一个重点 数据结构和算法分离
STL的算法由模版函数提供,另一个特点,它不是面向对象的,主要依赖模版,具有广泛通用性的底层特征
内联函数使得生成的代码短小高效
不依赖于任何特定的数据类型
三个基本的STL组件:
1》迭代器:提供了访问容器对象的方法
2》容器:一种数据结构,以模版类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代期
3》算法:用来操作容器中的数据的模版函数。
STL头文件和容器类
#include Container Class
<deque> deque
<list> list
<map> map,multimap
<queue> queue,priority_queue
<set> set,multiset
<stack> stack
<vector> vector,vector<bool>
名字空间: using namespace std;
迭代器
迭代器提供了对一个容器的对象的访问方法,并且定义了容器中对象的访问范围。如同指针
但不一定具有地址值
创建迭代器:1》作为变量创建。2》为了使用一个特定的类型的数据而创建一个迭代器
提示:STL不保证可以从另一个迭代器来抵达一个迭代器
迭代器的类型
对于STL数据结构和算法,分为5种类型
1》Input iterators 提供对数据的只读访问
2》Output iterators 提供对数据的只写访问
3》Forwar iterators 提供读写操作,并能向前推进迭代器
4》Bidirectional iterators 提供读写操作,并能向前和向后操作
5》Random access iterators 提供读写操作,并能在数据中随机移动
上面的可以用下面的代替
指针迭代器
一个指针也是一种迭代器,
#include<iostream.h>
#include<algorithm> //没有.H后缀
using namespace std;// 引入命名空间
#define SIZE 100
int iarray[SIZE];
int main()
{
iarray[20]=50; //数组第20 赋值为50
int *ip=find(iarry,iarry+SIZE,50); find()函数接收3个参数,头两个表示搜索范围,iarray 指向数组第一个元素,第二个参数iarray+SIZE等同于past-the-end
//也就是最后一位,第三个带定位的值也就是50,find函数返回和前两个参数相同类型的迭代器,这里是指向整数德 指针IP
if(ip==iarry+SIZE)
cout<<"50 not found in array "<<endl;
else
cout<<*ip<<"found in array"<<endl;
return 0;
}
提示
必须记住STL使用模版,因此STL函数自动根据他们使用的数据类型来构造
用法必须符合STL迭代器的规则 不能判断返回值是否为NULL
容器迭代器
与指针迭代器不同,使用容器类方法获取迭代器对象 两个典型的容器类方法,begin(),end()
它们在大多数容器中表示整个容器的范围,其他一些容器还是用rbegin(),rend()提供反向迭代器,以按反向顺序指定对象范围
下面的程序创建一个矢量容器(STL的和数组等价的对象),并使用迭代器在其中搜索
#include<iostrream.h>
#include <algorithm>
#incclude<vector>
using namespace std;
vector<int >intVector(100);
void main()
{
intVector[20]=50;
vector<int>::iterator intIter=find(intVector.begin(),intVector.end(),50);
if(intVector!=intVector.end())
cout<<"Vector contains value"<<*intIter<<endl;
else
cout<<"Vector does not contain 50"<<endl;
}
常量迭代器
和指针一样,你可以给一个迭代器赋值。例如,首先声明一个迭代器
vector<int >::iterator first;
该语句创建一个vector<int >类的迭代器。下面的语句将迭代器设置到intVector的第一个对象,并将它指向的对象值设置为123
first=intVector.begin();
*first=123;
这种赋值对于大多数容器类都是允许的,除了只读变量
为了防止出错可以申请为
const vector<int>::iterator result;
result=find(intVector.begin(),intVector.end(),value);
if(result!=intVector.end())
*result=123;
警告
另一种防止数据被改变的方法是将容器声明为const类型