STL应用论文

2024-07-05

STL应用论文(共2篇)

1.STL应用论文 篇一

关键词:标准模版库,容器,迭代器

C++语言并不支持动态数组的概念,任何需要使用数组结构存储的对象,都必须事先分配相应规模的数组空间。当面临数据对象个数未知的情况时,采用传统的链表结构可以进行动态内存分配,应付逐渐增多的数据,然而,链表结构存储的数据类型又必须在定义链表结构时预先定义,所以,一个链表结构中,只能存储一种类型的数据。

STL(Standard Template Library)的出现,解决了C++中的数据存储问题。STL是一些“容器”的集合,这些“容器”有list,vector,set,map等;STL也是算法和其他一些组件的集合。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL已经是C++的一部分,因此不用额外安装其他组件库。

1 STL使用

为了避免头文件冲突,STL的头文件不再使用常规的.h扩展名。为了包含标准的vector类,用下面的语句:

其中,命名空间就好像一个类型,将标志符封装在另一个名字中。标志符只在名字空间中存在,因此避免了和其他标志符冲突。STL中的类型与头文件的对应关系如表1所示,实际编程应用时,可参考MSDN文档中的相关帮助。

上述代码中,给出了vector类型和list类型的使用方法,从中可以看出:

(1)模版类型是万能容器。在声明模版类型对象时,将待存储类型作为参数传递给模版类型,如vecotr指定存储整形对象,vector用来存储浮点型数据。可以说,任意的数据类型都可以存储于模版类型之中,故称之为万能容器。

(2)模版类型为动态增长的容器。进行数据存储之前,除指定数据类型之外,并未明确告知模版对象实际需要存储的数据量。在例中,使用了1000次的循环体,将1000个数据存储于容器之中,即使更大的数据量,模版对象均可以有充足的空间进行存储。

(3)模型类型并非具有统一的操作接口。使用vector类型和list类型时,对于数据插入操作,二者包含相同的接口push_back。而对于数据读取操作,vector类型已经重载了[运算符,程序员可以将之看做数组结构。在list类型中,并未重载数组下标运算符,故不能进行[]操作。

2 迭代器模式

STL为程序员提供了一系列的容器类型,在使用这些类型时,除了特殊的算法外,基本的存储与取操作应该一致。为达到这种基础操作一致性,STL中使用Iterator模式,完成数据的读取操作。

本例给出了STL中使用迭代器变量容器内部数据的典型代码,从中可以发现,vector类型与list类型在使用iterator时几乎完全相同———这也正是迭代器的目的,使得多个类型拥有相同的接口,通过这个接口可以访问其数据。

上述代码模拟了一个STL类型实现的原理,需要重点关注其中的iterator1类型的实现。iterator1作为Stack容器内部的嵌套类型,主要重载了3个运算符:*运算符,模拟指针的取值操作;!=运算符,用于比较两个迭代器是否指向相同的存储内容;++运算符,模拟指针的移位操作。而容器Stack类型中,定义了begin方法和end方法,分别返回指向容器首部和尾部的迭代器对象。这里模拟的Stack类型可以使用类似vector迭代器的方式进行数据访问。STL中,对于所有容器类型的迭代器规定:每个容器都必须包含一个迭代器类,且需要定义begin和end接口;迭代器至少支持指针操作、移位操作和判等(不等于)操作。

3 线性模版对比

STL中,最为常用的线性模版是vector、list与deque。vector模拟了类似数组的存储结构,list则代表链表结构,而deque是一双向开口的队列结构。三者的相似之处和区别见表2。

vector和list是线性模版类型的典型代表。vector模拟了数组数据结构,对于随机访问实现了快速的支持,但是其插入的开销很大,中间插入新数据时,需要将后继元素逐个后移。list模拟了单向链表的数据结构,对于插入操作,只需要改变中间节点的指针结构即可实现,但对于list内特定位置的元素的访问,需要从链表首部逐一查找,效率低下。虽然二者均能够实现动态增长的容器结构,但实现机理不同。vector对象创建时,首先根据系统状态,随机申请“足够大”的连续内存空间作为自身存储单元,随着数据量的增多,以前的空间可能无法满足存储需求,vector对象会在内存中重新寻找一个更大的空间。然而,以前空间内的元素与新空间并非连续内存,所以需要将原存储元素逐个拷贝至新空间之内。元素的拷贝过程,实际上是对于元素对象所属类型的拷贝构造函数(Copy Constructor)的调用,而一旦类型的拷贝构造没有做深拷贝处理,则会产生指针错误,造成程序崩溃。所以说,vector对于内存空间的获取方式是低效的,而list并非连续内存空间,故不存在类似问题。

实际使用中,往往以实现业务逻辑为首要任务,所以,在实现系统功能之前,并不需要特别在意模版类型对程序性能的影响。如果后期测试阶段发现性能的确存在不能满足需求之处,则可以斟酌模版对象的选取问题。

4 结语

STL完善了C++的功能,为程序开发提供了若干个动态增长的万能容器,并提供标准的迭代器模式,使得不同容器存在一致的基本操作方式。

参考文献

[1][10]B.Eckel.Thinking in C++.Second Edition.2000,Vol-ume 1.

[2]韩玉坤,王冬星.浅谈C++中泛型编程方法的运用[J].电脑学习,2007,(02).

[3]田保军.基于C++的STL编程思想[J].信息技术,2007,(12).

2.STL应用论文 篇二

标准模板库STL (Standard Template Library) 是一个高效的C++程序库, 已经被容纳于C++标准函数库中。主要由容器 (container) , 算法 (algorithmn) , 迭代子 (itcrator) 等组成。容器包含了象list (链表) 、vector (类似于大小可动态增加的数组) 、set (集合) 、map (映射) 、queue (队列) 、stack (堆栈) 等许多数据结构。算法包含了大约70个通用算法, 用于操控各种容器, 也可以操控内建数组。可以进行对象排序、删除、记数、比较、找出特殊对象、把对象合并到另一个容器中, 以及执行其他有用的操作。迭代器是容器中指向对象的指针, 算法通过迭代器来定位和操控容器中的元素。

vector是C++标准模板库中的一个内容, 它是一个多功能的, 能够操作多种数据结构和算法的模板类和函数库, 可以存放各种类型的对象, 特别是能够存放任意类型的动态数组, 能够增加和压缩数据。vector相当于一个动态的数组, 当程序员无法知道自己需要的数组的规模多大时, 用其来解决问题可以达到最大节约空间的目的。其用法和数组类似, 比如push_back可以在数组的最后添加一个数据;pop_back可以去掉数组的最后一个数据;size获得当前使用数据的大小等。对于vector中存在的元素需要更改其值时, 可以使用数组的方式, 或成员函数at () , 得到编号位置的数据。

2 应用

开发文电收发系统时, 拆分字符串函数Split String () 和获取主机的IP地址函数Get Host IPs () 属于用数组来存储一组变量, 而数组长度无法确定的情形。这两个函数中, Split String () 功能是将一个字符串拆成几个部分, 如IP地址中以“.”为分隔符进行拆分, 目录路径中以“”为分隔符进行拆分等, 分拆后的字符串列表是一个变化的量, 即不同拆分情况下所得到的拆分字符串数目不同。Get Host IPs () 是获取网内相关计算机的IP地址, 因机器的配置不同所获得的IP地址数目也不固定。所以, 存储拆分后的字符串和IP地址的数组长度需要动态增长或缩小。下面介绍vector在Split String () 和Get Host IPs () 中的应用, 说明解决软件编程中数组长度动态变化问题的方法。

(1) 新建一个名为vector Cstring Test的SDI程序

可在Main Frm.h中添加文件包含:

(2) 定义Split String () 与Get Host IPs ()

在Main Frm.h中声明这两个函数, Split String () 的实现代码:

(3) 遍历vector中存储的内容:

以上程序段运行结果为:分割字符串的结果为:wohihzhonhgguoren。

获取的本机IP为:127.0.0.1 (未连接网络的状态下) 。

以上代码随拆分方式不同和本机IP数量差异, 每增加一个字符串或IP, vector会自动扩大容量。push_back是vector容器的一个类属成员函数, 用来在容器尾端插入一个元素。

3 STL的使用

在开发某软件时, 对一个文件夹内的所有文件路径进行搜索统计时, 被操作目录内的文件数是一个变化的量, 即不同目录内的文件数量各不相同。所以, 此数组长度需要动态增长或缩小。利用vector实现的具体方法如下:

(1) 文件包含

同上

(2) 定义搜索函数Search_Directory

(3) 遍历vectorlst Files

同上例一样, 程序中用到STL中一个可以动态调整大小的容器vector。以上程序片段中随着搜索进程的进行, 搜索到的文件每增加一个, 如果需要再放入元素则vector会自动扩大自己的容量。push_back是vector容器的一个类属成员函数, 用来在容器尾端插入一个元素。这种用法比用new、delete操作符简洁, 也减少了出错的概率。

4 结语

通过对C++标准模板库 (STL) 的使用, 有效解决了拆分字符串存储计算机IP地址和搜索目录内所有文件路径列表中需要动态添加数组元素的问题。vector可以动态增长, 可以容易地增加新元素。与MFC中的CArray、COb Array等方法相比, STL解决动态数组问题很有效, 使用了vector容器, 可以事先不用定义数组大小, 可以动态添加数组元素, 参考文中的vector, 也可以对vector, vector, vector等举一反三, 灵活运用。随着应用的深入, STL还提供许多典型的算法, 如排序等, STL使用起来更简洁、方便。

摘要:通过文件收发系统中vector<CString>在存储IP地址中的应用和对一个文件夹内的所有文件路径进行搜索统计两个实例, 介绍了STL中的vector容器在程序中的使用方法, 阐述了用C++标准模板库 (STL) 解决软件编程中数组长度动态变化问题的方法。

上一篇:消防管理人员职责下一篇:水利 分部工程验收讲话