资源预览内容
第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
第9页 / 共12页
第10页 / 共12页
亲,该文档总共12页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
STL简介1作为一个 C+程序设计者,STL 是一种不可忽视的技术。Standard Template Library (STL):标准模板库,更准确的说是 C+ 程序设计语言标准模板库。STL 是所有 C+编译器和所有操作系统平台都支持的一种库,说它是一种库是因为,虽然 STL是一种标准,也就是说对所有的编译器来说,提供给 C+程序设计者的接口都是一样的。也就是说同一段 STL代码在不同编译器和操作系统平台上运行的结果都是相同的,但是底层实现可以是不同的。 令人兴奋的是,STL 的使用者并不需要了解它的底层实现。 试想一下,如果我们有一把能打开所有锁的钥匙,那将是多么令人疯狂啊。STL的目的是标准化组件,这样你就不用重新开发它们了。你可以仅仅使用这些现成的组件。STL 现在是 C+的一部分,因此不用额外安装什么。它被内建在你的编译器之内。2. 为什么我们需要学习 STLSTL是 C+的 ANSI/ISO 标准的一部分,可以用于所有 C+语言编译器和所有平台(Windows/Unix/Linux.)。STL 的同一版本在任意硬件配置下都是可用的;STL 提供了大量的可复用软件组织。例如,程序员再也不用自己设计排序,搜索算法了,这些都已经是 STL的一部分了。嘎嘎,有意思吧。使用 STL 的应用程序保证了得到的实现在处理速度和内存利用方面都是高效的,因为 STL设计者们已经为我们考虑好了。使用 STL编写的代码更容易修改和阅读,这是当然的啦。因为代码更短了,很多基础工作代码已经被组件化了;使用简单,虽然内部实现很复杂。虽然,STL 的优点甚多,但是 STL的语法实在令初学者人头疼,许多人望而却步。可是 STL是每个 C+程序设计者迟早都要啃的一块骨头。3. 初识 STL下面让我们来看几段代码吧:#include int main(void)double a = 1, 2, 3, 4, 5;std:cout#include int main()std:vector a;a.push_back(1);a.push_back(2); a.push_back(3);a.push_back(4);a.push_back(5);for(int i = 0; i #include int main()std:vector q;q.push_back(10);q.push_back(11);q.push_back(12);std:vector v;for(int i=0; i:iterator it = v.begin() + 1;it = v.insert(it, 33);v.insert(it, q.begin(), q.end();it = v.begin() + 3;v.insert(it, 3, -1);it = v.begin() + 4;v.erase(it);it = v.begin() + 1;v.erase(it, it + 4);v.clear();return 0;这一段你又看到了新东西了吧:iterator、insert、erase、clear。不罗嗦了,等你看完这篇文章,回头再看就简单了。关于模板的其他细节,读者可以参阅C+ Templates 中文版在这里,简单的介绍一下模板类和函数模板的概念。模板是 C+中实现代码重用机制的一种工具,可以实现类型参数化,把类型定义为参数。函数模板和类模板允许用户构造模板函数和模板类。图 1下面我们来看一段函数模板的例子:#include#includeusing namespace std;/定义函数模板template /template 是关键字,T 表示一种待实例化的类型/template 也是对的T MAX(T a, T b)/函数模板,函数名为 max,此函数有 2个 T类型的参数,返回类型为 Treturn (ab)?a:b;/在此例实例化的时候,T 可以是多种类型的,int,char,stringint main()int x=2,y=6;double x1=9.123,y1=12.6543;coutusing namespace std;/定义名为 ex_class的类模板template class ex_classT value;public:ex_class(T v) value=v; void set_value(T v) value=v; T get_value(void) return value;/main()函数中测试 ex_class类模板int main()/测试 int类型数据ex_class a(5),b(10);cout ch(A);cout x(5.5);cout的组成STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(container adaptor),函数对象(functor),除此之外还有 STL其他标准组件。通俗的讲:容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室STL里的容器是可容纳一些数据的模板类。算法:就是往杯子里倒水,往大海里排污,从教室里撵人STL 里的算法,就是处理容器里面数据的方法、操作。迭代器:往杯子里倒水的水壶,排污的管道,撵人的那个物业管理人员STL 里的迭代器:遍历容器中数据的对象。对存储于容器中的数据进行处理时,迭代器能从一个成员移向另一个成员。他能按预先定义的顺序在某些容器中的成员间移动。对普通的一维数组、向量、双端队列和列表来说,迭代器是一种指针。下面让我们来看看专家是怎么说的:容器(container):容器是数据在内存中组织的方法,例如,数组、堆栈、队列、链表或二叉树(不过这些都不是 STL标准容器)。STL 中的容器是一种存储 T(Template)类型值的有限集合的数据结构,容器的内部实现一般是类。这些值可以是对象本身,如果数据类型 T代表的是 Class的话。算法(algorithm):算法是应用在容器上以各种方法处理其内容的行为或功能。例如,有对容器内容排序、复制、检索和合并的算法。在 STL中,算法是由模板函数表现的。这些函数不是容器类的成员函数。相反,它们是独立的函数。令人吃惊的特点之一就是其算法如此通用。不仅可以将其用于 STL容器,而且可以用于普通的 C数组或任何其他应用程序指定的容器。迭代器(iterator):一旦选定一种容器类型和数据行为(算法),那么剩下唯一要他做的就是用迭代器使其相互作用。可以把达代器看作一个指向容器中元素的普通指针。可以如递增一个指针那样递增迭代器,使其依次指向容器中每一个后继的元素。迭代器是 STL的一个关键部分,因为它将算法和容器连在一起。下面我将依次介绍 STL的这三个主要组件。1. 容器STL中的容器有队列容器和关联容器,容器适配器(congtainer adapters:stack,queue,priority queue),位集(bit_set),串包(string_package)等等。在本文中,我将介绍 list,vector,deque 等队列容器,和 set和multisets,map和 multimaps等关联容器,一共 7种基本容器类。队列容器(顺序容器):队列容器按照线性排列来存储 T类型值的集合,队列的每个成员都有自己的特有的位置。顺序容器有向量类型、双端队列类型、列表类型三种。u 基本容器向量向量(vector 容器类):include ,vector 是一种动态数组,是基本数组的类模板。其内部定义了很多基本操作。既然这是一个类,那么它就会有自己的构造函数。vector 类中定义了 4中种构造函数: 默认构造函数,构造一个初始长度为 0的空向量,如:vector v1; 带有单个整形参数的构造函数,此参数描述了向量的初始大小。这个构造函数还有一个可选的参数,这是一个类型为 T的实例,描述了各个向量种各成员的初始值;如:vector v2(n,0); 如果预先定义了:n,他的成员值都被初始化为 0; 复制构造函数,构造一个新的向量,作为已存在的向量的完全复制,如:vector v3(v2); 带两个常量参数的构造函数,产生初始值为一个区间的向量。区间由一个半开区间first,last) 来指定。如:vector v4(first,last)下面一个例子用的是第四种构造方法,其它的方法读者可以自己试试。/程序:初始化演示#include #include #include using namespace std;int ar10 = 12, 45, 234, 64, 12, 35, 63, 23, 12, 55 ;char* str = Hello World;int main()vector vec1(ar, ar+10); /first=ar,last=ar+10,不包括ar+10vector vec2(str,str+strlen(str); /first=str,last= str+strlen(str),cout:const_iterator p=vec1.begin();p!=vec1.end(); +p)cout:const_iterator p1=vec2.begin();p1!=vec2.end(); +p1)cout#include using namespace std;typedef vector INTVECTOR;/自定义类型 INTVECTOR/测试 vector容器的功能int main()/vec1对象初始为空INTVECTOR vec1; /vec2对象最初有 10个值为 6的元素INTVECTOR vec2(10,6);/vec3对象最初有 3个值为 6的元素,拷贝构造INTVECTOR vec3(vec2.begin(),vec2.begin()+3);/声明一个名为 i的双向迭代器INTVECTOR:iterator i;/从前向后显示 vec1中的数据cout)容器类与vector类似,支持随机访问和快速插入删除,它在容器中某一位置上的操作所花费的是线性时间。与 vector不同的是,deque 还支持从开始端插入数据:push_front()。此外 deque也不支持与 vector的 capacity()、reserve()类似的操作。#include #include using namespace std;typedef deque INTDEQUE;/有些人很讨厌这种定义法,呵呵/从前向后显示 deque队列的全部元素void put_deque(INTDEQUE deque, char *name)INTDEQUE:iterator pdeque;/仍然使用迭代器输出cout )又叫链表,是一种双线性列表,只能顺序访问(从前向后或者从后向前),图 2是 list的数据组织形式。与前面两种容器类有一个明显的区别就是:它不支持随机访问。要访问表中某个下标处的项需要从表头或表尾处(接近该下标的一端)开始循环。而且缺少下标预算符:operator。图 2同时,list 仍然包涵了 erase(),begin(),end(),insert(),push_back(),push_front()这些基本函数,下面我们来演示一下 list的其他函数功能。merge():合并两个排序列表;splice():拼接两个列表;sort():列表的排序。#include #include #include using namespace std;void PrintIt(list n)for(list:
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号