{"id":"58954486","type":"page","status":"current","title":"01.STL概论","version":{"by":{"type":"known","username":"ethanliu","userKey":"2c90931b6cfb654f016d5c69becc0001","profilePicture":{"path":"/images/icons/profilepics/default.svg","width":48,"height":48,"isDefault":true},"displayName":"刘浩","_links":{"self":"https://wiki.suncaper.net/rest/api/user?key=2c90931b6cfb654f016d5c69becc0001"},"_expandable":{"status":""}},"when":"2022-07-09T01:51:24.000Z","message":"","number":1,"minorEdit":false,"hidden":false,"_links":{"self":"https://wiki.suncaper.net/rest/experimental/content/58954486/version/1"},"_expandable":{"content":"/rest/api/content/58954486"}},"body":{"storage":{"value":"<ac:layout><ac:layout-section ac:type=\"two_right_sidebar\"><ac:layout-cell><p>长久以来，软件界一直希望建立一种可重复利用的东西，以及一种得以制造出”可重复运用的东西”的方法<span>,</span>让程序员的心血不止于随时间的迁移，人事异动而烟消云散，从函数<span>(functions)</span>，类别<span>(classes),</span>函数库<span>(function libraries),</span>类别库<span>(class libraries)</span>、各种组件，从模块化设计，到面向对象<span>(object oriented )</span>，为的就是复用性的提升。</p><p>复用性必须建立在某种标准之上。但是在许多环境下，就连软件开发最基本的数据结构<span>(data structures) </span>和算法<span>(algorithm)</span>都未能有一套标准。大量程序员被迫从事大量重复的工作，竟然是为了完成前人已经完成而自己手上并未拥有的程序代码，这不仅是人力资源的浪费，也是挫折与痛苦的来源。</p><p>为了建立数据结构和算法的一套标准，并且降低他们之间的耦合关系，以提升各自的独立性、弹性、交互操作性<span>(</span>相互合作性<span>,interoperability),</span>诞生了<span>STL</span>。</p><p><br /></p><h2><span>1.1 STL</span>基本概念</h2><p>STL(Standard Template Library,标准模板库<span>)</span>，是惠普实验室开发的一系列软件的统<span><br /></span>称。现在主要出现在<span> c++</span>中，但是在引入<span> c++</span>之前该技术已经存在很长时间了。<span><br />       STL </span>从广义上分为<span>: </span>容器<span>(container) </span>算法<span>(algorithm) </span>迭代器<span>(iterator)</span>,容器和算法之间通过迭代器进行无缝连接。<span>STL </span>几乎所有的代码都采用了模板类或者模板函数，这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。<span>STL(Standard Template Library)</span>标准模板库<span>,</span>在我们<span> c++</span>标准程序库中隶属于<span> STL </span>的占到了<span> 80%</span>以上。</p><h2>1.2 STL六大组件简介</h2><p>STL提供了六大组件，彼此之间可以组合套用，这六大组件分别是<span>:</span>容器、算法、迭代器、仿函数、适配器（配接器）、空间配置器。</p><p><strong>容器：</strong>各种数据结构，如<span>vector</span>、<span>list</span>、<span>deque</span>、<span>set</span>、<span>map</span>等<span>,</span>用来存放数据，从实现角度来看，<span>STL</span>容器是一种<span>class template</span>。</p><p><strong>算法：</strong>各种常用的算法，如<span>sort</span>、<span>find</span>、<span>copy</span>、<span>for_each</span>。从实现的角度来看，<span>STL</span>算法是一种<span>function tempalte.</span></p><p><strong>迭代器：</strong>扮演了容器与算法之间的胶合剂，共有五种类型，从实现角度来看，迭代器是一种将<span>operator* , operator-&gt; , operator++,operator--</span>等指针相关操作予以重载的<span>class template. </span>所有<span>STL</span>容器都附带有自己专属的迭代器，只有容器的设计者才知道如何遍历自己的元素。原生指针<span>(native pointer)</span>也是一种迭代器。</p><p><strong>仿函数：</strong>行为类似函数，可作为算法的某种策略。从实现角度来看，仿函数是一种重载了<span>operator()</span>的<span>class </span>或者<span>class template</span></p><p><strong>适配器：</strong>一种用来修饰容器或者仿函数或迭代器接口的东西。</p><p><strong>空间配置器：</strong>负责空间的配置与管理。从实现角度看，配置器是一个实现了动态空间配置、空间管理、空间释放的<span>class tempalte.</span></p><p><br /></p><p>STL六大组件的交互关系，容器通过空间配置器取得数据存储空间，算法通过迭代器存储容器中的内容，仿函数可以协助算法完成不同的策略的变化，适配器可以修饰仿函数。</p><p><br /></p><h2><span>1.3 STL</span>优点</h2><p><span> </span></p><ul><li>STL 是<span> C++</span>的一部分，因此不用额外安装什么，它被内建在你的编译器之内。</li><li>STL 的一个重要特性是将数据和操作分离。数据由容器类别加以管理，操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”<span>,</span>以使算法可以和容器交互运作</li><li>程序员可以不用思考<span> STL </span>具体的实现过程，只要能够熟练使用<span> STL </span>就<span> OK </span>了。这样他们就可以把精力放在程序开发的别的方面。</li></ul><p>STL 具有高可重用性，高性能，高移植性，跨平台的优点。<span><br /></span><span>     </span>高可重用性：<span>STL </span>中几乎所有的代码都采用了模板类和模版函数的方式实现，这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。关于模板的知<span><br /></span>识，已经给大家介绍了。<span><br /></span><span>     </span>高性能：如<span> map </span>可以高效地从十万条记录里面查找出指定的记录，因为<span> map </span>是采用红黑树的变体实现的。<span><br /></span><span>     </span>高移植性：如在项目<span> A </span>上用<span> STL </span>编写的模块，可以直接移植到项目<span> B </span>上。</p></ac:layout-cell><ac:layout-cell><p><br /></p></ac:layout-cell></ac:layout-section></ac:layout>","representation":"storage","_expandable":{"content":"/rest/api/content/58954486"}},"_expandable":{"editor":"","view":"","export_view":"","styled_view":"","anonymous_export_view":""}},"extensions":{"position":"none"},"_links":{"webui":"/pages/viewpage.action?pageId=58954486","edit":"/pages/resumedraft.action?draftId=58954486","tinyui":"/x/9pKDAw","collection":"/rest/api/content","base":"https://wiki.suncaper.net","context":"","self":"https://wiki.suncaper.net/rest/api/content/58954486"},"_expandable":{"container":"/rest/api/space/2CT","metadata":"","operations":"","children":"/rest/api/content/58954486/child","restrictions":"/rest/api/content/58954486/restriction/byOperation","history":"/rest/api/content/58954486/history","ancestors":"","descendants":"/rest/api/content/58954486/descendant","space":"/rest/api/space/2CT"}}