STL学习(三)

STL之旅,概论

1、STL Componets

构成STL的组件

1)     容器(Containers

用来管理某类对象的集合,可以是Arrayslinked 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)     Dequedouble-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 PairsKey是排序准则的基础,MapKey只能出现一次,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::iteratorcontainer::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++指针一样必须得小心。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章