STL之旅,概论
1、STL Componets
构成STL的组件
1) 容器(Containers)
用来管理某类对象的集合,可以是Arrays或linked lists,或者每个元素都有一个Key。
分类:
序列式容器:每个元素有固定的位置vector,deque,list
关联式容器:位置取决于对元素值取特定排序准则的算法,通常用binary tree来实现。set,multiset,map,multimap
2) 迭代器(Iterators)
用来在一个对象集(容器)的元素上进行遍历动作,迭代器类似于smart pointer使用operator++可以累进(取得哪个群集对象取决于对应的容器),使用operator*可访问对象。
3) 算法( Algorithms )
通过使用迭代器可以将搜寻、排序、修改等算法只实现一次就能获得对任意容器进行操作的能力。
2、泛型程序设计 generic programming
3、STL Componets之容器
1) Vector:将元素放到dynamic array中管理,允许随机存储,在Array的尾部添加和删除元素特别快,但在其它位置安插元素就费事。
基本使用方法:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> coll;
for(int I=1;I<=6;I++)
{
coll.push_back(i);
}
for(I=0;I<coll.size();I++)
{
cout<<coll[I]<<’,’;
}
cout<<endl;
return 0;
}
2) Deque(double-ended queue):也是dynamic array,但可以向两端发展。
基本使用方法:
#include <iostream>
#include <deque>
using namespace std;
int main()
{
deque<int> coll;
for(int I=1;I<=6;I++)
{
coll.push_front(I);
coll.push_back(I*10);
}
for(I=0;I<coll.size();I++)
{
cout<<coll[I]<<’,’;
}
cout<<endl;
return 0;
}
3) List(double linked list):不提供随机存储,但是在任何地方插入删除元素是特别快的。
#include <iostream>
#include <list>
using namespace std;
int main()
{
list<int> coll;
for(int I=1;I<=6;I++)
{
coll.push_back(i);
}
while(!coll.empty())
{
cout<<coll.front()<<”,”;//不能用operator[]
coll.pop_front();
}
cout<<endl;
return 0;
}
4) Set/Multiset:内部元素根据其值自动排列,set不允许有重复元素出现,multiset允许重复。
5) Map/Multimap:内部元素为Key/Value Pairs,Key是排序准则的基础,Map中Key只能出现一次,multimap中允许多次出现。
4、STL Componets之迭代器:迭代器是“可遍历STL容器内全部或部分元素”的对象。
1) 其基本操作有:这些操作和C++操作指针操作类似
operator*
operator++
operator==,operator!=
operator=
2) 每个容器都用嵌套的方式提供自己的迭代器,所有的容器都提供一些成员函数,使我们获得迭代器以访问容器内对象。
bgin():返回一个指向容器起点的迭代器
end():返回一个指向容器结束点的迭代器

使用方法:
如果是对list进行遍历那么情况如图:
对set进行遍历:
#include <iostream>
#include <set>
using namespace std;
int main()
{
typedef set<int> IntSet;
IntSet coll;
coll.insert(3);
coll.insert(1);
coll.insert(5);
coll.insert(4);
coll.insert(1);
coll.insert(6);
coll.insert(2);
IntSet::const_iterator pos;//有两种iteraotr,container::iterator和container::const_iterator
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<”,”;
}
cout<<endl;
return 0;
}
//
typedef set<int> IntSet ó typedef set<int,greater<int> > IntSet
其中greater<>为预定义的仿函数(function object)它能对set内元素按照其值进行顺序排序。
在第一个图中,虽然我们插入了两次1但实际上只存储一个1。在图二中迭代器是以自己对容器理解的方式遍历其内部的对象。
5、STL Componets之算法
算法并非容器类别的成员函数,而是一种搭配迭代使用的全局函数。这样只要所有算法有一份那么就可以对所有的容器进行操作,不必每个容器要量身定做。
OOP:数据与操作结合
GP:数据与操作划分开,通过接口互动。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
vector<int> coll;
vector<int>::iterator pos;
coll.push_back(2);
coll.push_back(5);
coll.push_back(4);
coll.push_back(1);
coll.push_back(6);
coll.push_back(3);
pos=min_element(coll.begin(),coll.end());
cout<<”min:”<<*pos<<endl;
pos=max_element(coll.begin(),coll.end());
cout<<”max:”<<*pos<<endl;
sort(coll.begin(),coll.end());
pos=fine(coll.begin(),coll.end(),3);
reverse(pos,coll.end());
for(pos=coll.begin();pos!=coll.end();++pos)
{
cout<<*pos<<” “<<endl;
}
cout<<endl;
return 0;
}
区间:所有算法都用来处理一个或多个区间的元素,我们必须将区间用迭代器表示并传给算法。所有算法处理的都是半开区间[begin,end)。对区间处理时也与C++指针一样必须得小心。