stl 订阅
STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL是C++的一部分,因此不用安装额外的库文件。STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等。在C++标准中,STL被组织为下面的13个头文件: 展开全文
STL是Standard Template Library的简称,中文名标准模板库,惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。这里的“容器”和算法的集合指的是世界上很多聪明人很多年的杰作。STL的目的是标准化组件,这样就不用重新开发,可以使用现成的组件。STL是C++的一部分,因此不用安装额外的库文件。STL的版本很多,常见的有HP STL、PJ STL、 SGI STL等。在C++标准中,STL被组织为下面的13个头文件:
信息
全    称
Standard Template Library
外文名
STL
包    括
容器
中文名
标准模板库
属    性
模板库
STL组成部分
STL是一种泛型编程。面向对象编程关注的是编程的数据方面,而泛型编程关注的是算法。它们之间的共同点是抽象和创建可重用代码,但它们的理念截然不同。STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。
收起全文
精华内容
参与话题
问答
  • 1. C/C++STLC++标准模板库(STL)—简介

    千次阅读 2012-05-31 17:46:25
    1. C/C++STL 1.1. 什么是STL?  STL -- 数据结构和算法的分离,模板(GP);  STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()...

    1. C/C++与STL

    1.1. 什么是STL?

       STL -- 数据结构和算法的分离,模板(GP);

       STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;

       STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;

       STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。这种现象有些类似于Microsoft Visual C++中的MFC(Microsoft Foundation Class Library),或者是Borland C++ Builder中的VCL(Visual Component Library);

       从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术;

       从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。如果查阅任何一个版本的STL源代码,你就会发现,模板作为构成整个STL的基石是一件千真万确的事情。除此之外,还有许多C++的新特性为STL的实现提供了方便;

    1.2. Hello World!

       先从经典的Hello World来引入C与C++的不同:

    C语言:

       1: //C Hello World Demo.
       2: //
       3: #include "stdio.h"
       4:  
       5: int main(void)
       6: {
       7:     printf("Hello World!\n");
       8:     return 0;
       9: }

    C++语言:

       1: //C++ Hello World Demo.
       2: //
       3: #include <iostream>
       4:  
       5: int main(void)
       6: {
       7:     std::cout<< "Hello World!" << std::endl;
       8:     return 0;
       9: }

    C标准函数库中 printf 的函数定义: int __cdecl printf(_In_z_ _Printf_format_string_ const char * _Format, ...); (面向过程)

    C++标准库中的 cout 对象定义: extern ostream cout; (面向对象)

    任何一门程序设计语言,基本都包括两大部分:核心的语言环境 + 常用的数据结构和算法(库);(算法+数据结构=程序)

    1.3. C++标准库

       作为C++,其标准库包括以下内容:

    (1)C标准函数库,基本保持了与原有C语言程序库的良好兼容,尽管有些微变化。人们总会忍不住留恋过去的美好岁月,如果你曾经是一个C程序员,对这一点一定体会颇深。或许有一点会让你觉得奇怪,那就是在C++标准库中存在两套C的函数库,一套是带有.h扩展名的(比如<stdio.h>),而另一套则没有(比如<cstdio>)。它们确实没有太大的不同。

    (2)语言支持(language support)部分,包含了一些标准类型的定义以及其他特性的定义,这些内容,被用于标准库的其他地方或是具体的应用程序中。
    诊断(diagnostics)部分,提供了用于程序诊断和报错的功能,包含了异常处理(exception handling),断言(assertions),错误代码(error number codes)三种方式。

    (3)诊断(diagnostics)部分,提供了用于程序诊断和报错的功能,包含了异常处理(exception handling),断言(assertions),错误代码(error number codes)三种方式。

    (4)通用工具(general utilities)部分,这部分内容为C++标准库的其他部分提供支持,当然你也可以在自己的程序中调用相应功能。比如:动态内存管理工具,日期/时间处理工具。记住,这里的内容也已经被泛化了(即采用了模板机制)。

    (5)字符串(string)部分,用来代表和处理文本。它提供了足够丰富的功能。事实上,文本是一个string对象,它可以被看作是一个字符序列,字符类型可能是char,或者wchar_t等等。string可以被转换成 char*类型,这样便可以和以前所写的C/C++代码和平共处了。因为那时侯除了char*,没有别的。

    (6)国际化(internationalization)部分,作为OOP特性之一的封装机制在这里扮演着消除文化和地域差异的角色,采用locale和facet可以为程序提供众多国际化支持,包括对各种字符集的支持,日期和时间的表示,数值和货币的处理等等。毕竟,在中国和在美国,人们表示日期的习惯是不同的。

    (7)容器(containers)部分,STL的一个重要组成部分,涵盖了许多数据结构,比如前面曾经提到的链表,还有:vector(类似于大小可动态增加的数组)、queue(队列)、stack(堆栈)……。string也可以看作是一个容器,适用于容器的方法同样也适用于string。现在你可以轻松的完成数据结构课程的家庭作业了。

    (8)算法(algorithms)部分,STL的一个重要组成部分,包含了大约 70个通用算法,用于操控各种容器,同时也可以操控内建数组。比如:find用于在容器中查找等于某个特定值的元素,for_each用于将某个函数应用到容器中的各个元素上,sort用于对容器中的元素排序。所有这些操作都是在保证执行效率的前提下进行的,所以,如果在你使用了这些算法之后程序变得效率底下,首先一定不要怀疑这些算法本身,仔细检查一下程序的其他地方。

    (9)迭代器(iterators)部分,STL的一个重要组成部分,如果没有迭代器的撮合,容器和算法便无法结合的如此完美。事实上,每个容器都有自己的迭代器,只有容器自己才知道如何访问自己的元素。它有点像指针,算法通过迭代器来定位和操控容器中的元素。

    (10)数值(numerics)部分,包含了一些数学运算功能,提供了复数运算的支持。

    (11)输入/输出(input/output)部分,就是经过模板化了的原有标准库中的iostream部分,它提供了对C++程序输入输出的基本支持。在功能上保持了与原有iostream的兼容,并且增加了异常处理的机制,并支持国际化(internationalization)。

      总体上,在C++标准函数库中,STL主要包含了容器、算法、迭代器。string也可以算做是STL的一部分。

    image 

      简单来讲,STL是作为C++标准库的一部分存在的(据统计,STL的代码占到了整个C++标准库德80%);

      STL用到了C++中的模板机制(泛型编程的思想)、函数重载、命名空间等特性,从其诞生的过程来看,STL与C++可以说是相辅相成的;

      STL的背后蕴含着泛型化程序设计(GP)的思想,在这种思想里,大部分基本算法被抽象,被泛化,独立于与之对应的数据结构,用于以相同或相近的方式处理各种不同情形。这一思想和面向对象的程序设计思想(OOP)不尽相同,因为,在OOP中更注重的是对数据的抽象,即所谓抽象数据类型(Abstract Data Type),而算法则通常被附属于数据类型之中。几乎所有的事情都可以被看作类或者对象(即类的实例),通常,我们所看到的算法被作为成员函数(member function)包含在类(class)中,类和类则构成了错综复杂的继承体系。

    2. STL的历史

       被誉为STL之父的Alexander Stepanov,出生于苏联莫斯科,早在20世纪70年代后半期,他便已经开始考虑,在保证效率的前提下,将算法从诸多具体应用之中抽象出来的可能性,这便是后来泛型化思想的雏形。为了验证自己的思想,他和纽约州立大学教授Deepak Kapur,伦塞里尔技术学院教授David Musser共同开发了一种叫做Tecton的语言。尽管这次尝试最终没有取得实用性的成果,但却给了Stepanov很大的启示;

       在随后的几年中,他又和David Musser等人先后用Schema语言(一种Lisp语言的变种)和Ada语言建立了一些大型程序库。这其间,Alexander Stepanov开始意识到,在当时的面向对象程序设计思想中所存在的一些问题,比如抽象数据类型概念所存在的缺陷。Stepanov希望通过对软件领域中各组成部分的分类,逐渐形成一种软件设计的概念性框架;

       1987年左右,在贝尔实验室工作的Alexander Stepanov开始首次采用C++语言进行泛型软件库的研究。但遗憾的是,当时的C++语言还没有引入模板(template)的语法,现在我们可以清楚的看到,模板概念之于STL实现,是何等重要。是时使然,采用继承机制是别无选择的。尽管如此,Stepanov还是开发出了一个庞大的算法库。与此同时,在与Andrew Koenig(前ISO C++标准化委员会主席)和Bjarne Stroustrup(C++语言的创始人)等顶级大师们的共事过程中,Stepanov开始注意到C/C++语言在实现其泛型思想方面所具有的潜在优势。就拿C/C++中的指针而言,它的灵活与高效运用,使后来的STL在实现泛型化的同时更是保持了高效率。另外,在STL中占据极其重要地位的迭代子概念便是源自于C/C++中原生指针( native pointer)的抽象;

       1988年,Alexander Stepanov开始进入惠普的Palo Alto实验室工作,在随后的4年中,他从事的是有关磁盘驱动器方面的工作。直到1992年,由于参加并主持了实验室主任Bill Worley所建立的一个有关算法的研究项目,才使他重新回到了泛型化算法的研究工作上来。项目自建立之后,参与者从最初的8人逐渐减少,最后只剩下两个人--Stepanove本人和Meng Lee。经过长时间的努力,最终,信念与汗水所换来的是一个包含有大量数据结构和算法部件的庞大运行库。这便是现在的STL的雏形(同时也是STL的一个实现版本--HP STL);

       1993年,当时在贝尔实验室的Andrew Koenig看到了Stepanove的研究成果,很是兴奋。在他的鼓励与帮助下,Stepanove于是年9月的圣何塞为ANSI/ISO C++标准委员会做了一个相关演讲(题为"The Science of C++ Programming"),向委员们讲述了其观念。然后又于次年3月,在圣迭戈会议上,向委员会提交了一份建议书,以期使STL成为C++标准库的一部分。尽管这一建议十分庞大,以至于降低了被通过的可能性,但由于其所包含的新思想,投票结果以压倒多数的意见认为推迟对该建议的决定;

       随后,在众人的帮助之下,包括Bjarne Stroustrup在内,Stepanove又对STL进行了改进。同时加入了一个封装内存模式信息的抽象模块,也就是现在STL中的 allocator,它使STL的大部分实现都可以独立于具体的内存模式,从而独立于具体平台。在同年夏季的滑铁卢会议上,委员们以80%赞成,20%反对,最终通过了提案,决定将STL正式纳入C++标准化进程之中,随后STL便被放进了会议的工作文件中。自此,STL终于成为了C++家族中的重要一员;

       此后,随着C++标准的不断改进,STL也在不断地作着相应的演化。直至1998年,ANSI/ISO C++标准正式定案,STL始终是C++标准中不可或缺的一大部件;

       STL的不同实现版本:HP STL,P. J. Plauger STL,Rouge Wave STL,SGI STL,STLport;

       HP STL是所有其它STL实现版本的根源。它是STL之父Alexander Stepanov在惠普的Palo Alto实验室工作时,和Meng Lee共同完成的,是第一个STL的实现版本;

       P. J. Plauger STL属于个人作品,由P. J. Plauger本人实现,是HP STL的一个继承版本,因此在其所有头文件中都含有HP STL的相关声明,同时还有P. J. Plauger本人的版权声明。P. J. Plauger是标准C中stdio库的早期实现者,现在是C/C++ User's Journal的主编,与Microsoft保持着良好的关系。P. J. Plauger STL便是被用于Microsoft的Visual C++中的。在Windows平台下的同类版本中,其性能不错,但是queue组件(队列,一种容器)的效率不理想,同时由于Visual C++对C++语言标准的支持不是很好(至少直到VC6.0为止,还是如此),因此一定程度上影响了P. J. Plauger STL的性能。此外,该版本的源代码可读性较差,你可以在VC的Include子目录下找到所有源文件(比如:C:\Program Files\Microsoft Visual Studio\VC98\Include);

       Rouge Wave STL是由Rouge Wave公司实现的,也是HP STL的一个继承版本,除了HP STL的相关声明之外,还有Rouge Wave公司的版权声明。同时,它也不是开放源码的,因此无法修改和销售。该版本被Borland C++ Builder所采用,你可以在C++ Builder的Include子目录下找到所有头文件(比如:C:\Program Files\Borland\Cbuilder5\Include)。尽管Rouge Wave STL的性能不是很好,但由于C++ Builder对C++语言标准的支持还算不错,使其表现在一定程度上得以改善。此外,其源代码的可读性较好;

       SGI STL是由Silicon Graphics Computer System, Inc公司实现的,其设计者和编写者包括Alexander Stepanov和Matt Austern,同样它也是HP STL的一个继承版本。它属于开放源码,因此你可以修改和销售它。SGI STL被GCC(linux下的C++编译器)所采用,你可以在GCC的Include子目录下找到所有头文件(比如:C:\cygnus \cygwin-b20\include\g++\include)。由于GCC对C++语言标准的支持很好,SGI STL在linux平台上的性能相当出色;

       STLport最初源于俄国人Boris Fomitchev的一个开发项目,主要用于将SGI STL的基本代码移植到其他诸如C++Builder或者是Visual C++这样的主流编译器上。因为SGI STL属于开放源码,所以STLport才有权这样做;

    3. STL内容介绍

       STL体系结构如下:

    image   STL中六大组件:

       1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;

       2)迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;

       3)算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;

       4)仿函数(Function object)

       5)迭代适配器(Adaptor)

       6)空间配制器(allocator)

    image 3.1. STL容器

    (1)序列式容器(Sequence containers),每个元素都有固定位置--取决于插入时机和地点,和元素值无关,vector、deque、list;

       Vectors:将元素置于一个动态数组中加以管理,可以随机存取元素(用索引直接存取),数组尾部添加或移除元素非常快速。但是在中部或头部安插元素比较费时;

       Deques:是“double-ended queue”的缩写,可以随机存取元素(用索引直接存取),数组头部和尾部添加或移除元素都非常快速。但是在中部或头部安插元素比较费时;

       Lists:双向链表,不提供随机存取(按顺序走到需存取的元素,O(n)),在任何位置上执行插入或删除动作都非常迅速,内部只需调整一下指针;

    (2)关联式容器(Associated containers),元素位置取决于特定的排序准则,和插入顺序无关,set、multiset、map、multimap;

       Sets/Multisets:内部的元素依据其值自动排序,Set内的相同数值的元素只能出现一次,Multisets内可包含多个数值相同的元素,内部由二叉树实现,便于查找;

       Maps/Multimaps:Map的元素是成对的键值/实值,内部的元素依据其值自动排序,Map内的相同数值的元素只能出现一次,Multimaps内可包含多个数值相同的元素,内部由二叉树实现,便于查找;

      容器的比较:

      Vector Deque List Set MultiSet Map MultiMap
    内部结构 dynamic array array of arrays double linked list binary tree binary tree binary tree binary tree
    随机存取 Yes Yes No No No Yes(key) No
    搜索速度 很慢
    快速插入移除 尾部 首尾 任何位置 -- -- -- --

     

      迭代器的作用:能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来,重载了*,++,==,!=,=运算符。用以操作复杂的数据结构,容器提供迭代器,算法使用迭代器;

    3.2 STL迭代器

      迭代器作用:

    (1)能够让迭代器与算法不干扰的相互发展,最后又能无间隙的粘合起来;

    (2)重载了*,++,==,!=,=运算符。用以操作复杂的数据结构;

    (3)容器提供迭代器,算法使用迭代器;

      简单例子:

    image

      迭代器的分类:

       Input Iterator, Output Iterator, Forward Iterator, Bidirectional Iterator, Random access Iterator等;

       不同容器提供自己的迭代器,所以不同迭代器具有不同的能力;

       不同的算法需要不同的迭代器的能力;相同的算法需要根据迭代器的能力不同而做相应的优化;

    image

    3.3 STL算法

    STL算法部分主要由头文件<algorithm>, <numeric>, <functional>组成;要使用STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象;

    STL中算法大致分为四类:

       非可变序列算法:指不直接修改其所操作的容器内容的算法。

       可变序列算法:指可以修改它们所操作的容器内容的算法。

       排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。

       数值算法:对容器内容进行数值计算。

    查找算法(13个):判断容器中是否包含某个值;

       adjacent_find:在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的Forward Iterator;否则返回last;

       binary_search:在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等;

       count:利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数;

       count_if:利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数;

       equal_range:功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound;

       其他:find,find_end,find_first_of,find_if,lower_bound,upper_bound,search,search_n;

    排序和通用算法(14个):提供元素排序策略;

       inplace_merge:合并两个有序序列,结果序列覆盖两端范围。重载版本使用输入的操作进行排序;

       merge:合并两个有序序列,存放到另一个序列。重载版本使用自定义的比较;

       nth_element:将范围内的序列重新排序,使所有小于第n个元素的元素都出现在它前面,而大于它的都出现在后面。重载版本使用自定义的比较操作;

       partial_sort:对序列做部分排序,被排序元素个数正好可以被放到范围内。重载版本使用自定义的比较操作;

       partial_sort_copy:与partial_sort类似,不过将经过排序的序列复制到另一个容器;

       其他:partition,random_shuffle,reverse,reverse_copy,rotate, rotate_copy,sort,stable_sort,stable_partition;

    删除和替换算法(15个);

    排列组合算法(2个):提供计算给定集合按一定顺序的所有可能排列组合;

    算术算法(4个);

    生成和异变算法(6个);

    关系算法(8个);

    集合算法(4个);

    堆算法(4个);

    4. STL使用示例

    待续…

    5. 参考文档

    (1)C++ STL 快速入门 http://morningspace.51.net/resource/stlintro/stlintro.html

    (2)三十分钟掌握STL http://net.pku.edu.cn/~yhf/UsingSTL.htm

    展开全文
  • C++ Templates and the STL 中文字幕 C ++模板和STL 中文字幕C++ Templates and the STL C ++模板支持通用编程,代码独立于类型工作 C ++标准模板库(STL)是可用的最完整和最强大的容器库之一 掌握C ++模板和STL...

    C++ Templates and the STL 中文字幕

    C ++模板和STL 中文字幕C++ Templates and the STL

    Alt
    C ++模板支持通用编程,代码独立于类型工作
    C ++标准模板库(STL)是可用的最完整和最强大的容器库之一
    掌握C ++模板和STL对于希望获得C ++能力的程序员来说至关重要
    在本课程中,系列文章中的第二篇专注于C ++基础知识,讲师Bill Weinman深入研究了这两个基本主题
    首先,他介绍模板,讨论模板语法,模板函数和类以及参数推导
    然后,他构建了该知识,以讨论STL容器,迭代器,转换,函数和算法

    主题包括:
    模板基础知识
    STL容器
    访问迭代器
    输出,转发和双向迭代器
    变换功能
    转换字符串和类型
    算术,关系和逻辑函数
    STL算法
    Alt
    Alt
    Alt
    Alt
    Alt

    • [比尔]嗨,我是比尔温曼; 并欢迎使用C ++模板和STL。
      本课程的目标是为您提供C ++标准模板库的工作知识。
      我们将首先详细讨论模板,包括模板语法,专业化,类型推断以及模板对头文件的影响。
      我将解释如何使用STL容器和迭代器。
      我将向您展示如何使用转换来转换容器的内容甚至其值的类型。
      最后,我将介绍STL算法库及其独特强大的排序和搜索功能。
      STL是一个全面而强大的库,它是C ++标准的一部分,可用于所有符合C ++的实现。
      理解STL是理解C ++的重要部分,我希望这些知识能够很好地为您的C ++项目服务。
      让我们开始使用C ++模板和STL。
      本课程视频下载地址:C ++模板和STL
    展开全文
  • C++的 面向对象 和 泛型编程 的思想, 目的就是 复用性的提升 大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量 重复工作 为了建立数据结构和算法的一套标准,诞生了STL 2.2 STL基本概念 STL...

    2.STL初识

    2.1 STL的诞生

    长久以来,软件界一直希望建立一种可重复利用的东西
    C++的 面向对象泛型编程 的思想, 目的就是 复用性的提升
    大多情况下,数据结构和算法都未能有一套标准,导致被迫从事大量 重复工作
    为了建立数据结构和算法的一套标准,诞生了STL

    2.2 STL基本概念

    STL(Standard Template Library 标准模板库)
    STL从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator)
    容器 和 算法之间通过迭代器进行无缝连接。
    STL几乎所有的代码都采用了模板类或者模板函数

    2.3 STL六大组件

    STL大体分为六大组件,分别是: 容器、算法、迭代器、仿函数、适配器、空间配置器
    1.容器:各种数据结构,如vector、list、deque、set、map等,用来存放数据
    2.算法:各种常用的算法,如sort、find、copy、for_each
    3.迭代器:扮演了容器与算法之间的胶合剂
    4.仿函数:行为类似函数,可作为算法的某种策略
    5.适配器:一种用来修饰容器或者仿函数或迭代器结构的东西
    6.空间配置器:负责空间的配置与管理

    2.4 STL中容器、算法、迭代器

    容器:直物之所也

    STL 容器 就是将运用 最广泛的一些数据结构实现出来
    常用的数据结构: 数组、链表、树、栈、队列、集合、映射表 等
    这些容器分为序列式容器关联式容器两种:

    	序列式容器:强调值得排序,序列式容器中的每个元素均有固定的位置。
    	关联式容器:二叉树结构,各元素之间没有严格的物理上的顺序关系
    

    算法:问题之解法也
    有限的步骤,解决逻辑或数学上的问题,这一门学科我们叫做算法(Algorithms)
    算法分为: 质变算法 和 非质变算法。

    	质变算法:是指运算过程中会更改区间内的元素内容。例如拷贝,替换,删除等等
    	非质变算法:是指运算过程中不会更改区间内的元素内容,例如查找、计数、遍历、寻找极值等等。
    

    迭代器:容器和算法之间的粘合剂
    提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该容器的内部表示方法。

    每个容器都有自己专属的迭代器
    迭代器的使用非常类似于指针,初学阶段可以先理解迭代器为指
    
    种类 功能 支持运算
    输入迭代器 对数据的只读访问 只读,支持++,==,!=
    输出迭代器 对数据的只写访问 只写,支持++
    前向迭代器 读写操作,并能向前推进迭代器 读写,支持++,==,!=
    双向迭代器 读写操作,并能向前和向后操作 读写,支持++,–
    随机访问迭代器 读写操作,可以以跳跃的方式访问任意数据,功能最强的迭代器 读写,支持++,–,[n],-n,>,>=,<,<=

    常用的容器中迭代器多为双向和随机访问迭代器。

    2.5 容器算法迭代器初识

    2.5.1 Vector存放内置数据类型

    STL中最常用的容器为Vector,可以理解为数组
    向Vector容器中插入数据,遍历数据

    容器:vector
    算法:for_each
    迭代器

    vector<int>::iterator
    
    
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    void myPrint (int val)
    {
    	cout << val << endl;
    }
    void test01()
    {
    	//创建vector容器
    	vector<int> v;
    
    	//向容器中插入数据
    	v.push_back(10);
    	v.push_back(20);
    	v.push_back(30);
    
    	//起始迭代器,指向容器中第一个元素
    	vector<int>::iterator itBegin = v.begin();
    	//结束迭代器,指向容器中最后一个元素的下一个位置
    	vector<int>::iterator itEnd = v.end();
    
    	//第一种遍历方式
    	while ( itBegin != itEnd)
    	{
    		cout << *itBegin << endl;
    		itBegin++;
    	}
    
    	//第二种遍历方式(常用
    	for(vector<int>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		cout << *it << endl;
    	}
    
    	//第三种遍历方式,利用STL提供遍历算法
    	for_each(v.begin(),v.end(),myPrint);
    }
    
    int main()
    {
    	test01();
    	system("pause");
    	return 0;
    }
    
    

    2.5.2 Vector存放自定义数据类型

    观察<>括号里面的数据类型,来判断解引用后的数据类型是怎么样的。

    
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    class Person
    {
    public:
    	Person(int age,string name)
    	{
    		this->m_Name = name;
    		this->m_Age = age;
    	}
    
    	string m_Name;
    	int m_Age;
    };
    //存放自定义类型
    void test01()
    {
    	vector<Person>v;
    
    	Person p1(11,"ada");
    	Person p2(123,"adsd");
    	Person p3(34,"rtr");
    
    	v.push_back(p1);
    	v.push_back(p2);
    	v.push_back(p3);
    
    	for(vector<Person>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		//解引用后拿到的数据可以直接.访问
    		cout << "Name:" << (*it).m_Name << endl;
    		cout << "Age:" << it->m_Age << endl;
    	}
    }
    //存放自定义类型指针
    void test02()
    {
    	vector<Person*>v;
    
    	Person p1(11,"ada");
    	Person p2(123,"adsd");
    	Person p3(34,"rtr");
    
    	v.push_back(&p1);
    	v.push_back(&p2);
    	v.push_back(&p3);
    
    	for(vector<Person *>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		//解引用之后拿到的是指针
    		cout << "Name:" << (*it)->m_Name << endl;
    		cout << "Age:"  << (*it)->m_Age << endl;
    	}
    }
    int main()
    {
    	test01();
    	system("pause");
    	return 0;
    }
    
    

    2.5.3 Vector 容器嵌套容器

    
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    using namespace std;
    
    void test01()
    {
    	vector<vector<int>>v;
    
    	vector<int>v1;
    	vector<int>v2;
    	vector<int>v3;
    	vector<int>v4;
    
    	for(int i = 0; i < 4; i++)
    	{
    		v1.push_back(i + 1);
    		v2.push_back(i + 2);
    		v3.push_back(i + 3);	
    		v4.push_back(i + 4);
    	}
    
    	//将小容器插入到大容器中
    	v.push_back(v1);
    	v.push_back(v2);
    	v.push_back(v3);
    	v.push_back(v4);
    
    	for( vector<vector<int>>::iterator it = v.begin(); it != v.end(); it++)
    	{
    		//(*it) ---- 容器 vector<int>
    		for (vector<int>::iterator vit = (*it).begin();vit != (*it).end(); vit++)
    		{
    			cout << *vit << "  " ;
    		}
    		cout << endl;
    	}
    }
    int main()
    {
    	test01();
    	system("pause");
    	return 0;
    }
    
    
    展开全文
  • 前段时间,突然想起了CGI这个东西来了,其实以前CGI也是很风光的,但是随着想asp,php,.net这样更加强大的web开发套件的兴起,而且CGI程序的开发难度...其实对比目前的各种流行的web开发语言,CGI(C/C++)程序有着一个很
    展开全文
  • 上周说到了用Cgicc+OTL开发的好处,并且有了一个小小的例子说明,但是仅仅如此,还是没有办法了解开发过程的,今天我们先简单了解一下各种库的使用方法。首先说说相对简单的prototype,我们的程序很小,当然用到...
  • 由于个人有些忙,所以这个文章好久没有续发了,今天有点时间,所以打算补全了。上次说到了list.cgi这个文件,这个文件实现了分页显示留言,今天我们就看看剩下的部分:”发表留言“,为了开发方便,我将发表留言分成...
  • C++11中STL总结+(boost库)

    千次阅读 2017-06-12 10:14:10
    用了快一年的STL库,决定写一下这一年的使用心得与总结。 1、概述个人觉得 STL == {算法,容器,迭代器}; 算法头文件: #include ...各种容器: #include…>C++primer 上有一句非常经典的话“”算法操作容器
  • 关于AndroidL到androidM的STLC++库的改变

    千次阅读 2016-08-09 13:27:42
    Android目前支持的c++,库如下 ls prebuilts/ndk/current/sources/cxx-stl/,库如下: gabi++ gnu-libstdc++ llvm-libc++ README stlport system 而在AndroidL中具体指定在build/core/binary.mk中,默认...
  • C++ + win32 + STL 写的QQ连连看外挂

    千次阅读 2012-02-25 21:07:08
    看了STL源码剖析 感觉没地方使用STL,于是就写了这个东西,我打算接下来写一个游戏, 类似超级玛丽的游戏,希望大家支持,虽然我只是在和自己说话,呵呵! 下载地址:...
  • 浅析STL 谓词 + 仿函数 + 函数指针(c)

    千次阅读 2015-01-30 20:57:21
    (0)提到C++ STL,首先被人想到的是它的三大组件:Containers(容器), Iterators(迭代器), Algorithms(算法)。容器为用户提供了常用的数据结构(如,vector,list,deque,stack,map,multimap,set,multiset,外加string)...
  • STL是由一些可适应不同需求的集合类和一些能够在这些数据集合上运作的算法构成,STL内的所有组件都由模板构成,所以其元素可以是任意类型。STL组件包括以下部分: - 容器(container):用来管理某类对象的集合,...
  • 学了好长时间的C++了,鉴于对标准和设计模型模式的推崇,一直没有找到合适的GUI...就省了编译器的问题了),C++库我选择了STL(MinGW自带)和Boost,GUI我使用的是wxWidget,3D图像引擎我使用的OpenSceneGraph(鉴于
  • 排列(c++ stl+哈希)

    2015-07-22 16:36:47
    Problem E: 排列 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 64 Solved: 16 [Submit][Status][Web Board] ...Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求...
  • C++STL库中,要实现排序可以通过将所有元素保存到vector中,然后通过sort算法来排序,也可以通过multimap实现在插入元素的时候进行排序。在通过vector+sort进行排序时,所有元素需要先存入vector容器中,sort在...
  • 前言: 3D 的stl 模型文件分为两种 二进制和Ascii 明码的Ascii 内容清晰可以打开看,但是文件比较大 ...本章写 qt c++ 加载 ascii 格式 和 二进制格式的 stl 文件 ASCII 格式: /* ASCII STL 格式 * * ...
  • 目录 STL历史 STL 组件 STL基本结构 STL 使用方法 ...直到 1994 年,STL 才被正式纳入 C++ 标准中。 STL 组件主要包括容器,迭代器、算法和仿函数。STL 基本结构和 STL 组件对应。 STL 主要...
  • c++ array stl"array" is a container which is used to create/container which is used to create/contains the fixed size arrays, the "array" in C++ STL is "class" actually and they are more efficient, li...
  • 模板 模板就是把类型当做参数,假设有一下代码 代码1:int max(int a, int b){ return (a > b) ? a; b; } char max(char a, char b){ return (a > b) ? a; b; }上述代码的两个函数逻辑结构相同,但是数据结构不一样...
  • c++ array stl C ++ STL array :: back()函数 (C++ STL array::back() function) back() function is a library function of array and it is used to get the last element of an array, it returns the reference ...
  • c++ array stl C ++ STL array :: front()函数 (C++ STL array::front() function) font() function is a library function of array and it is used to get the first element of an array, it returns the ...
  • C++ STL (vector+list)

    2017-01-13 19:46:25
    C++ STL (vector+list)
  • 1、C++_STL学习网站 CPlusPlus.com CppReference.com gcc.gnu.org 2、Python学习书籍及网站 《Python Crash Course》 《Learn Python the Hard Way》 《Python Cookbook》 《Pluralsight》...

空空如也

1 2 3 4 5 ... 20
收藏数 93,948
精华内容 37,579
关键字:

stl