首页 编程 软件学院 查看内容

C++|标准模板库STL及利用STL求解问题

2017-6-4 12:29 |来自: 互联网 3638 0

摘要: 有了函数模板和类模板机制,就可以编写出通用的函数和类,如通用数组类、通用排序函数等。既然这些函数模板和类模板非常通用,那么,我们每个程序员都劳心费力一遍遍地重复制造轮子似乎没有必要,C++语言也考虑到了 ...

有了函数模板和类模板机制,就可以编写出通用的函数和类,如通用数组类、通用排序函数等。既然这些函数模板和类模板非常通用,那么,我们每个程序员都劳心费力一遍遍地重复制造轮子似乎没有必要,C++语言也考虑到了这一点。

1 标准模板库STL

C++利用模板机制,实现了计算机科学领域常用的算法和通用数据结构,形成了具有工业级强度、健壮可靠的函数模板和类模板集合,称为标准模板库(Standard Template Libarary)。

C++的标准模板库STL,是一个函数模板和类模板的集合,这些模板从功能上划分为六个逻辑组件:

容器(Container)

迭代器(Iterator)

算法(Algorithm)

仿函数(Function object)

迭代适配器(Adaptor)

空间配制器(allocator)

(前面三个是最主要的逻辑组件)

利用容器、算法、迭代器,我们可以:

1.1 把需要处理的数据或者对象放到容器中,进行有效的组织和存储。容器是实现各种数据结构的类模板集合,如vector、list、map等。

1.2 利用迭代器对容器中的元素进行存取访问。C++的迭代器是访问容器的泛型指针类模板,每种容器均附带自身的迭代器。

1.3 通过迭代器指定容器区间范围,利用算法对该区间范围内的容器元素进行操作和处理。算法是一组常用函数模板,如sort、find、copy等。

它们之间的配合关系如下图:

在上图中,容器中存储了一组整数,end表示容器最后一个元素的下一个位置。迭代器A指向容器的首元素,迭代器B指向容器尾元素的下一个位置,可以看出由迭代器A和迭代器B构成了一个左闭右开的容器区间[迭代器A,迭代器B)。然后,将此区间交给算法sort完成容器元素的排序工作。

因此,使用标准模板库STL编写程序的一般模式是:

首先利用容器模板构造出容器对象,把数据或对象放入容器;然后,使用迭代器构造出容器的区间范围;最后,把容器区间范围交给算法,由算法对区间范围内的容器元素进行操作和处理。

2 利用STL求解问题

如有给定的一组字符串,要求计算出有多少个字符串以字母S打头。问题求解思路是先用一个容器存放字符串,然后通过迭代器遍历容器对以S打头的字符串计数。

#include

#include

#include

#include

#include

using namespace std;

bool MatchFirstChar(const string &str) { return 'S' == str[0];} //谓词函数

int main(){

const int VECTOR_SIZE=8;

string names[]={"She","Sells","Sea","Shells","by","the","Sea","Shores"};

//产生容纳字符串的向量容器对象

vectorNamesVect(names,names+VECTOR_SIZE);

//定义迭代器对象,[start,end)定义了一个左开右闭区间

vector::iterator start,end;

start=NamesVect.begin();

end=NamesVect.end();

//利用迭代器在[start,end)区间遍历向量容器,输出容器元素

cout<<"NamesVect{";

for(vector::iterator it=start;it !=end; it++)

cout<<*it<<" ";

cout<<"}\n"<

//调用count_if计数向量容器中使用MatchFirstChar);

int result = count_if(start,end,MatchFirstChar);//计算以's'开头的字符串

cout<<"个数="<

getch();

return 0;

}

运算结果:

NamesVect{She Sells Sea Shells by the Sea Shores }

个数=6

阅读程序代码不难看出:使用标准模板库中的容器和算法,可以大大简化程序的逻辑。核心逻辑就是把字符串放到vector容器中,通过迭代器构造遍历容器的迭代器区间范围,然后用count_if函数遍历容器并计算。

本文出处: http://www.toutiao.com/a6427546786126168321/
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

最新评论

返回顶部