520A5p3高袋程 Chinapub.com 下载 cringLength mysTLStr myStr mySTLStrc_str(): stringLength w strlen( myStr for int i-0:i< stringLength mystr[主] / Iteration using a pointer.*/ for( const char *myPtr my Str: *myptr i='\0' myPtr++) s Iteration using an iterator. for(string:: iterator iter mySTLStr begin()i iter ! mySTLStr end()i iter++) if(*iter==“t’) 使用遍历器解决了使用指针或下标时出现的问题。指针和下标依赖于数据,这些数据在 内存中相邻存放,而遍历器隐藏数据,使数据结构的使用者不必了解数据存储的顺序。隐藏 数据结构允许创建通用的算法,这种算法能够与各种数据结构一起工作,例如与容器一起工 为了算法的效率,SIL定义了五种遍历器的类:输入、输出、前向、双向和随机访问。算 法针对特定的遍历方法设计,因此具有最优的性能。 遍历器相似于指针,移动到下一条目和前一条目分别使用操作符“++”和“-”,同样, 获得一个条目的值使用操作符“*”。 2.STL映射 个映射就是一个排好序的容器,这里关心的是能够根据存储在条目中的键以尽可能快 的速度检索条目,而不是关心使条目以线性的顺序存储在容器中。 STL排序容器有set、 multiset、map和 multimap。set用于条目集合,map用于一个条目与 另一条目的关联。由于使用双向遍历器,排序容器支持以线性顺序移动数据条目,尽管排序 容器的目的是用于键访问。 个映射容器支持基于单独键的快速数据检索,这个键在映射中是唯一的,映射对于稀 疏数据具有节省大量存储空间和减少许多计算时间的潜力,在后面的叙述中你将看到。键和 值是以pair类型存储的,这个类型有两个成员: first和 second。检索 first返回键,检索 second返 回键的值。映射的遍历器就是par类型的遍历器 在本章后面将看到使用映射的例子。 3.STL矢量 个矢量就是序列容器的一个例子,其他序列容器是 deque和list。它们具有相似的功能, 基本的区别在于性能。例如,除了在 deque的开始处插入和删除的速度比在 vector中快之外 一个 deque与一个 vector没什么区别。不同的问题要用不同的方式来访问数据。矢量能对不同 长度的数据提供快速随机的访问,在此序列的末尾插入和删除时较快,而在其他在地方则比 较慢
使用遍历器解决了使用指针或下标时出现的问题。指针和下标依赖于数据,这些数据在 内存中相邻存放,而遍历器隐藏数据,使数据结构的使用者不必了解数据存储的顺序。隐藏 数据结构允许创建通用的算法,这种算法能够与各种数据结构一起工作,例如与容器一起工 作。 为了算法的效率,S T L定义了五种遍历器的类:输入、输出、前向、双向和随机访问。算 法针对特定的遍历方法设计,因此具有最优的性能。 遍历器相似于指针,移动到下一条目和前一条目分别使用操作符“ + +”和“- -”,同样, 获得一个条目的值使用操作符“ *”。 2. STL映射 一个映射就是一个排好序的容器,这里关心的是能够根据存储在条目中的键以尽可能快 的速度检索条目,而不是关心使条目以线性的顺序存储在容器中。 S T L排序容器有s e t、m u l t i s e t、m a p和m u l t i m a p。s e t用于条目集合, m a p用于一个条目与 另一条目的关联。由于使用双向遍历器,排序容器支持以线性顺序移动数据条目,尽管排序 容器的目的是用于键访问。 一个映射容器支持基于单独键的快速数据检索,这个键在映射中是唯一的,映射对于稀 疏数据具有节省大量存储空间和减少许多计算时间的潜力,在后面的叙述中你将看到。键和 值是以p a i r类型存储的,这个类型有两个成员: f i r s t和s e c o n d。检索f i r s t返回键,检索s e c o n d返 回键的值。映射的遍历器就是 p a i r类型的遍历器。 在本章后面将看到使用映射的例子。 3. STL矢量 一个矢量就是序列容器的一个例子,其他序列容器是 d e q u e和l i s t。它们具有相似的功能, 基本的区别在于性能。例如,除了在 d e q u e的开始处插入和删除的速度比在 v e c t o r中快之外, 一个d e q u e与一个v e c t o r没什么区别。不同的问题要用不同的方式来访问数据。矢量能对不同 长度的数据提供快速随机的访问,在此序列的末尾插入和删除时较快,而在其他在地方则比 较慢。 520计计ASP 3 高级编程 下载
apub. coM Mi7% BC R AS mm 521 4.STL算法 STL算法根据对其操作的数据结构的影响方式和相互作用进行分类。STL算法与其操作的 STL数据结构的接口是STL遍历器。STL遍历器扮演了一个重要角色,因为它限制了算法怎样 访问数据。许多算法接收一个函数作为其接口的一部分,这个函数的参数返回一个布尔值 表示一种情况。用函数参数可以定制算法。 当STL算法允许函数作为参数传递。多数情况下,这些函数完成一个比较,并且返回布 尔值。例如,一个排序算法使用一个函数作为参数来比较两个值,这个函数根据某些准则比 较一个值是否比另一个值小。不同的函数有不同的准则,从而导致数据以不同的顺序排列。 更有趣的是,将一个函数对象(而不是函数)作为传递参数。函数对象可以包含状态,这种 状态可以启用存在于某处的比较规则。使用的比较规则依赖于对象的状态。在本章的后面有 个排序算法的比较函数的例子,以这种方式实现。 5.STL算法的分类 STL算法可分为四大类。非变异序列算法,操作不改变数据结构内容:变异序列算法则改 变数据结构内容:相关排序算法能用于排序、合并和二进制查找等多种算法。最后,STL具 有广义的数值算法,用于计算数据结构中的元素。 ·非变异序列算法:不直接改变其操作的数据结构的元素。通常,它们查找数据结构中的 元素,检査序列元素的等式,计算序列元素的个数。find和 count是非变异序列算法的例 子,fnd算法在数据结构的某个范围中移动,査找第一个等于给定值的遍历器。而 count 算法计算数据结构中等于给定值的元素的个数。 ·变异序列算法:修改其操作的数据结构中的元素。这些算法在容器中拷贝、替换、转换、 删除和循环移动元素。fi算法是这种算法的一个例子,它的功能是把给定值的拷贝填 充到一个序列范围中的所有位置。 ·相关排序算法:排序、合并和查找元素。同样,能够对排好序的序列进行设置操作 merge算法是一个例子,它将两个已排序范围内的元素放到一个范围内,并且结果不发 生重叠。 广义数值算法的例子是 accumulate,这个算法对数据结构内的某一指定范围的值求和。 6.使用算法的遍历器 前面已经讲过,STL定义了五种遍历器的类:输入、输出、前向、双向和随机访问,算法 针对特定的遍历方法设计,以确保优化性能 例如,find算法可以用于在各种数据结构中查找值,算法并不关心容器是一个矢量,还 个列表,还是一个数组。唯一的条件是数据结构必须支持 InputIterator, Inputlterator的设计 确保它支持的操作的工作效率。find算法只需要 Inputlterator支持的操作,因此,find算法能高 效地工作。 些算法要求功能更强的遍历器:如sort需要随机访问遍历器( Random Accesslterator) 提供随机访问是以降低性能为代价的,并影响其他操作,例如在容器中间插入元素的操作。 现在已经你有充分的理论知识,下面建立一个组件。 17.3建立一个C++服务器组件 C++是标准化的计算机语言,不属于任何人,而属于一个标准委员会。STL是支持数据结
4. STL算法 S T L算法根据对其操作的数据结构的影响方式和相互作用进行分类。 S T L算法与其操作的 S T L数据结构的接口是S T L遍历器。S T L遍历器扮演了一个重要角色,因为它限制了算法怎样 访问数据。许多算法接收一个函数作为其接口的一部分,这个函数的参数返回一个布尔值, 表示一种情况。用函数参数可以定制算法。 一些S T L算法允许函数作为参数传递。多数情况下,这些函数完成一个比较,并且返回布 尔值。例如,一个排序算法使用一个函数作为参数来比较两个值,这个函数根据某些准则比 较一个值是否比另一个值小。不同的函数有不同的准则,从而导致数据以不同的顺序排列。 更有趣的是,将一个函数对象 (而不是函数)作为传递参数。函数对象可以包含状态,这种 状态可以启用存在于某处的比较规则。使用的比较规则依赖于对象的状态。在本章的后面有 一个排序算法的比较函数的例子,以这种方式实现。 5. STL算法的分类 S T L算法可分为四大类。非变异序列算法,操作不改变数据结构内容;变异序列算法则改 变数据结构内容;相关排序算法能用于排序、合并和二进制查找等多种算法。最后, S T L具 有广义的数值算法,用于计算数据结构中的元素。 • 非变异序列算法:不直接改变其操作的数据结构的元素。通常,它们查找数据结构中的 元素,检查序列元素的等式,计算序列元素的个数。 f i n d和c o u n t是非变异序列算法的例 子,f i n d算法在数据结构的某个范围中移动,查找第一个等于给定值的遍历器。而 c o u n t 算法计算数据结构中等于给定值的元素的个数。 • 变异序列算法:修改其操作的数据结构中的元素。这些算法在容器中拷贝、替换、转换、 删除和循环移动元素。 f i l l算法是这种算法的一个例子,它的功能是把给定值的拷贝填 充到一个序列范围中的所有位置。 • 相关排序算法:排序、合并和查找元素。同样,能够对排好序的序列进行设置操作, m e rg e算法是一个例子,它将两个已排序范围内的元素放到一个范围内,并且结果不发 生重叠。 广义数值算法的例子是a c c u m u l a t e,这个算法对数据结构内的某一指定范围的值求和。 6. 使用算法的遍历器 前面已经讲过,S T L定义了五种遍历器的类:输入、输出、前向、双向和随机访问,算法 针对特定的遍历方法设计,以确保优化性能。 例如,f i n d算法可以用于在各种数据结构中查找值,算法并不关心容器是一个矢量,还是 一个列表,还是一个数组。唯一的条件是数据结构必须支持 I n p u t I t e r a t o r,I n p u t I t e r a t o r的设计 确保它支持的操作的工作效率。 f i n d算法只需要I n p u t I t e r a t o r支持的操作,因此,f i n d算法能高 效地工作。 一些算法要求功能更强的遍历器:如 s o r t需要随机访问遍历器 ( R a n d o m A c c e s s I t e r a t o r )。 提供随机访问是以降低性能为代价的,并影响其他操作,例如在容器中间插入元素的操作。 现在已经你有充分的理论知识,下面建立一个组件。 17.3 建立一个C + +服务器组件 C + +是标准化的计算机语言,不属于任何人,而属于一个标准委员会。 S T L是支持数据结 第1 7章 用C + +建立A S P组件计计521 下载
522 ASP3高级编程 Chinapub.com 下载 构和算法的C++扩展。AIL是微软拥有和维护的模板库,使得COM编程更容易。综合这些技 术形成了创建COM组件的一种有效方法,这些COM组件用于ASP页面。 下面用所有这些技术创建一个COM对象,你将看到C++60的向导如何提供大量代 因此,可以把注意力集中在解决问题上,而不是担心具体的编程细节 173.1问题 表现数据的最普通方法是表,列代表字段的类型,每一行是一条记录,拥有字段的值。 在文本文件中,表通常由用逗号分开的值( comma-separated values,CSv)组成 我们将要创建的COM组件以CSV数据作为输入,高效地存储它,并提供访问函数去检索 它。这些数据在COM组件中以STL数据结构表示。在以后部分中,我们会看到怎样用STL算 法去处理这些数据。另外,在下一章,将介绍怎样在数据库中存储存这些数据 为了便于说明,假设数据在一个稀疏表中。第一行的字段是列标题,接下来的是一条条 数据记录,记录的每个字段对齐于列标题。逗号隔离字段,换行符(m)隔离行,空的字段用两 个逗号表示,即 表17-1是一个展开的表的例子。导出时,逗号会隔离每一个字段。 表17-1示例表 Keith moon The who rums Jimi hendrix Guitar vocals enny Kravitz Everything Robert plant Led zeppelin 173.2设计 这个组件的设计目的是使数据的存储空间和访问时间最小。由于数据有可能是稀疏的 即许多字段是空的,这就有可能使数据的存储空间最小化。可以通过数值(基于零的索引)访问 数据的行,可以通过字段名访问数据的列。例如,要得到表17-1中 Keith moon的 iNstrument, 可以调用 Get Field(l," Instrument") 完成以上工作的工具是STL的 vector和map数据结构,这些数据结构是容器,就是说,它 们是包含其他对象的一个集合的对象。为了访问集合中的对象,使用STL遍历器 7.33实现 现在你对这个组件的功能已经有了概念,我们将按下面的步骤实现它 创建包含组件的DLL。 ·创建组件 ·增加属性 增加方法, 1.创建DLL和一个组件 选择 ATL COM App Wizard,创建一个新的vC++项目,然后命名为 ASPComponents。使
构和算法的C + +扩展。AT L是微软拥有和维护的模板库,使得 C O M编程更容易。综合这些技 术形成了创建C O M组件的一种有效方法,这些 C O M组件用于A S P页面。 下面用所有这些技术创建一个 C O M对象,你将看到 VC++ 6.0的向导如何提供大量代码, 因此,可以把注意力集中在解决问题上,而不是担心具体的编程细节。 17.3.1 问题 表现数据的最普通方法是表,列代表字段的类型,每一行是一条记录,拥有字段的值。 在文本文件中,表通常由用逗号分开的值 (comma-separated values,C S V )组成。 我们将要创建的 C O M组件以C S V数据作为输入,高效地存储它,并提供访问函数去检索 它。这些数据在 C O M组件中以S T L数据结构表示。在以后部分中,我们会看到怎样用 S T L算 法去处理这些数据。另外,在下一章,将介绍怎样在数据库中存储存这些数据。 为了便于说明,假设数据在一个稀疏表中。第一行的字段是列标题,接下来的是一条条 数据记录,记录的每个字段对齐于列标题。逗号隔离字段,换行符 ( / n )隔离行,空的字段用两 个逗号表示,即“,,”。 表1 7 - 1是一个展开的表的例子。导出时,逗号会隔离每一个字段。 表17-1 示例表 N a m e G r o u p I n s t r u m e n t Jim Morrison The Doors Vo c a l s Keith Moon The Who D r u m s Jimi Hendrix Guitar & Vo c a l s Lenny Kravitz E v e r y t h i n g Robert Plant Led Zeppelin Vo c a l s 17.3.2 设计 这个组件的设计目的是使数据的存储空间和访问时间最小。由于数据有可能是稀疏的, 即许多字段是空的,这就有可能使数据的存储空间最小化。可以通过数值 (基于零的索引)访问 数据的行,可以通过字段名访问数据的列。例如,要得到表 1 7 - 1中Keith Moon的I n s t r u m e n t, 可以调用GetField (1, "Instrument")。 完成以上工作的工具是 S T L的v e c t o r和m a p数据结构,这些数据结构是容器,就是说,它 们是包含其他对象的一个集合的对象。为了访问集合中的对象,使用 S T L遍历器。 17.3.3 实现 现在你对这个组件的功能已经有了概念,我们将按下面的步骤实现它: • 创建包含组件的D L L。 • 创建组件。 • 增加属性。 • 增加方法。 1. 创建D L L和一个组件 选择ATL COM AppWi z a r d,创建一个新的V C + +项目,然后命名为A S P C o m p o n e n t s。使 522计计ASP 3 高级编程 下载