<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8">
<meta name="generator" content="pdf2htmlEX">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<link rel="stylesheet" href="https://static.pudn.com/base/css/base.min.css">
<link rel="stylesheet" href="https://static.pudn.com/base/css/fancy.min.css">
<link rel="stylesheet" href="https://static.pudn.com/prod/directory_preview_static/638b337ce53e5839a71c4afc/raw.css">
<script src="https://static.pudn.com/base/js/compatibility.min.js"></script>
<script src="https://static.pudn.com/base/js/pdf2htmlEX.min.js"></script>
<script>
try{
pdf2htmlEX.defaultViewer = new pdf2htmlEX.Viewer({});
}catch(e){}
</script>
<title></title>
</head>
<body>
<div id="sidebar" style="display: none">
<div id="outline">
</div>
</div>
<div id="pf1" class="pf w0 h0" data-page-no="1"><div class="pc pc1 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/638b337ce53e5839a71c4afc/bg1.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">1</div></div><div class="t m0 x3 h4 y3 ff2 fs1 fc0 sc0 ls0 ws0">STL<span class="_ _0"> </span><span class="ff3 sc1">简介</span></div><div class="t m0 x4 h5 y4 ff4 fs2 fc0 sc0 ls0 ws0">1<span class="_"> </span>概况<span class="_ _1"> </span>..........................................................<span class="_ _2"></span>2</div><div class="t m0 x5 h5 y5 ff4 fs2 fc0 sc0 ls0 ws0">1.1<span class="_"> </span>STL<span class="_ _1"> </span>是什么<span class="_ _1"> </span>...............................................<span class="_ _2"></span>2</div><div class="t m0 x5 h5 y6 ff4 fs2 fc0 sc0 ls0 ws0">1.2<span class="_"> </span>为什么我们需要学习<span class="_ _1"> </span>STL<span class="_ _1"> </span>...................................<span class="_ _2"></span>2</div><div class="t m0 x5 h5 y7 ff4 fs2 fc0 sc0 ls0 ws0">1.3<span class="_"> </span>初识<span class="_ _1"> </span>STL<span class="_ _1"> </span>.................................................<span class="_ _2"></span>2</div><div class="t m0 x5 h5 y8 ff4 fs2 fc0 sc0 ls0 ws0">1.4<span class="_"> </span>STL<span class="_"> </span>的组成<span class="_ _1"> </span>..............................................<span class="_ _3"> </span>5</div><div class="t m0 x4 h5 y9 ff4 fs2 fc0 sc0 ls0 ws0">2<span class="_"> </span>容器<span class="_ _1"> </span>..........................................................<span class="_ _2"></span>6</div><div class="t m0 x5 h5 ya ff4 fs2 fc0 sc0 ls0 ws0">2.1<span class="_"> </span>基本容器——向量(vector)<span class="_ _1"> </span>..............................<span class="_ _3"> </span>6</div><div class="t m0 x5 h5 yb ff4 fs2 fc0 sc0 ls0 ws0">2.2<span class="_ _4"> </span>双端队列(deque<span class="_ _1"> </span>容器类)<span class="_ _1"> </span>...............................<span class="_ _2"></span>9</div><div class="t m0 x5 h5 yc ff4 fs2 fc0 sc0 ls0 ws0">2.3<span class="_"> </span>表(List<span class="_ _1"> </span>容器类)<span class="_ _1"> </span>.......................................<span class="_ _2"></span>10</div><div class="t m0 x5 h5 yd ff4 fs2 fc0 sc0 ls0 ws0">2.4<span class="_"> </span>集和多集(set<span class="_"> </span>和<span class="_ _1"> </span>multiset<span class="_"> </span>容器类):<span class="_ _1"> </span>....................<span class="_ _2"></span>12</div><div class="t m0 x5 h5 ye ff4 fs2 fc0 sc0 ls0 ws0">2.5<span class="_"> </span>映射和多重映射(map<span class="_"> </span>和<span class="_ _1"> </span>multimap)<span class="_ _1"> </span>.......................<span class="_ _2"></span>13</div><div class="t m0 x4 h5 yf ff4 fs2 fc0 sc0 ls0 ws0">3<span class="_"> </span>算法(algorithm):<span class="_ _1"> </span>..........................................<span class="_ _2"></span>15</div><div class="t m0 x5 h5 y10 ff4 fs2 fc0 sc0 ls0 ws0">3.1<span class="_"> </span>翻转和复制(reverse()和<span class="_ _1"> </span>copy())<span class="_ _1"> </span>........................<span class="_ _2"></span>15</div><div class="t m0 x5 h5 y11 ff4 fs2 fc0 sc0 ls0 ws0">3.2<span class="_"> </span>单值交换(Swap())<span class="_ _1"> </span>.....................................<span class="_ _3"> </span>16</div><div class="t m0 x5 h5 y12 ff4 fs2 fc0 sc0 ls0 ws0">3.3<span class="_"> </span>查找(find())<span class="_ _1"> </span>.........................................<span class="_ _3"> </span>17</div><div class="t m0 x5 h5 y13 ff4 fs2 fc0 sc0 ls0 ws0">3.4<span class="_"> </span>得到数目(Count())<span class="_ _1"> </span>....................................<span class="_ _3"> </span>18</div><div class="t m0 x5 h5 y14 ff4 fs2 fc0 sc0 ls0 ws0">3.5<span class="_"> </span>排序(sort())<span class="_ _1"> </span>.........................................<span class="_ _3"> </span>19</div><div class="t m0 x4 h5 y15 ff4 fs2 fc0 sc0 ls0 ws0">4<span class="_"> </span>迭代器(itertor)<span class="_ _1"> </span>............................................<span class="_ _2"></span>21</div><div class="t m0 x4 h5 y16 ff4 fs2 fc0 sc0 ls0 ws0">5<span class="_"> </span>STL<span class="_ _1"> </span>的其他标准组件<span class="_ _1"> </span>...........................................<span class="_ _3"> </span>22</div><div class="t m0 x5 h5 y17 ff4 fs2 fc0 sc0 ls0 ws0">5.1<span class="_"> </span>函数对象(functor<span class="_ _1"> </span>或者<span class="_ _1"> </span>funtion<span class="_"> </span>objects)<span class="_ _1"> </span>................<span class="_ _3"> </span>22</div><div class="t m0 x5 h5 y18 ff4 fs2 fc0 sc0 ls0 ws0">5.2<span class="_"> </span>适配器(adapter)<span class="_ _1"> </span>......................................<span class="_ _3"> </span>23</div><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a><a class="l" rel='nofollow' onclick='return false;'><div class="d m1"></div></a></div><div class="pi" data-data='{"ctm":[1.611830,0.000000,0.000000,1.611830,0.000000,0.000000]}'></div></div>
</body>
</html>
<div id="pf2" class="pf w0 h0" data-page-no="2"><div class="pc pc2 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/638b337ce53e5839a71c4afc/bg2.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">2</div></div><div class="t m0 x6 h6 y19 ff4 fs3 fc0 sc1 ls0 ws0">1<span class="_"> </span>概况</div><div class="t m0 x6 h7 y1a ff5 fs4 fc0 sc0 ls0 ws0">1.1<span class="_ _5"> </span>STL<span class="_ _6"> </span><span class="ff4 sc1">是什<span class="_ _7"></span>么</span></div><div class="t m0 x6 h5 y1b ff4 fs2 fc0 sc0 ls0 ws0">作为一个<span class="_ _1"> </span>C++程序设计者,STL<span class="_ _1"> </span>是一种不可忽视的技术。</div><div class="t m0 x6 h5 y1c ff4 fs2 fc0 sc0 ls0 ws0">Standard<span class="_"> </span>Template<span class="_"> </span>Library<span class="_"> </span>(STL):标准模板库,更准确的说是<span class="_"> </span>C++<span class="_"> </span>程序设计</div><div class="t m0 x6 h5 y1d ff4 fs2 fc0 sc0 ls0 ws0">语言标准模板库。STL<span class="_ _1"> </span>是所有<span class="_ _1"> </span>C++编译器和所有操作系统平台都支持的一种库,</div><div class="t m0 x6 h5 y1e ff4 fs2 fc0 sc0 ls0 ws0">说它是一种库是因为,<span class="_ _8"></span>虽然<span class="_ _1"> </span>STL<span class="_ _1"> </span>是一种标准,<span class="_ _8"></span>也就是说对所有的编译器来说,<span class="_ _8"></span>提</div><div class="t m0 x6 h5 y1f ff4 fs2 fc0 sc0 ls0 ws0">供给<span class="_ _1"> </span>C++程序设计者的接口都是一样的。<span class="_ _8"></span>也就是说同一段<span class="_ _1"> </span>STL<span class="_ _1"> </span>代码在不同编译器</div><div class="t m0 x6 h5 y20 ff4 fs2 fc0 sc0 ls0 ws0">和操作系统平台上运行的结果都是相同的,但是底层实现可以是不同的。<span class="_"> </span>令人</div><div class="t m0 x6 h5 y21 ff4 fs2 fc0 sc0 ls0 ws0">兴奋的是,STL<span class="_ _1"> </span>的使用者并不需要了解它的底层实现。<span class="_"> </span>试想一下,如果我们有</div><div class="t m0 x6 h5 y22 ff4 fs2 fc0 sc0 ls0 ws0">一把能打开所有锁的钥匙,那将是多么令人疯狂啊。</div><div class="t m0 x6 h5 y23 ff4 fs2 fc0 sc0 ls0 ws0">STL<span class="_ _1"> </span>的目的是标准化组件,<span class="_ _9"></span>这样你就不用重新开发它们了。<span class="_ _9"></span>你可以仅仅使用这些</div><div class="t m0 x6 h5 y24 ff4 fs2 fc0 sc0 ls0 ws0">现成的组件。STL<span class="_ _1"> </span>现在是<span class="_ _1"> </span>C++的一部分,因此不用额外安装什么。它被内建在你</div><div class="t m0 x6 h5 y25 ff4 fs2 fc0 sc0 ls0 ws0">的编译器之内。</div><div class="t m0 x6 h7 y26 ff5 fs4 fc0 sc0 ls0 ws0">1.2<span class="_ _5"> </span><span class="ff4 sc1">为什<span class="_ _7"></span>么我们<span class="_ _7"></span>需要<span class="_ _7"></span>学习<span class="_ _3"> </span></span>STL</div><div class="t m0 x6 h5 y27 ff4 fs2 fc0 sc0 ls0 ws0">STL<span class="_ _a"> </span>是<span class="_"> </span>C++的<span class="_ _a"> </span>ANSI/ISO<span class="_"> </span>标准的一部分,可以用于所有<span class="_ _a"> </span>C++语言编译器和所有平台</div><div class="t m0 x6 h5 y28 ff4 fs2 fc0 sc0 ls0 ws0">(Windows/Unix/Linux..)。STL<span class="_ _1"> </span>的同一版本在任意硬件配置下都是可用的;</div><div class="t m0 x6 h5 y29 ff4 fs2 fc0 sc0 ls0 ws0">STL<span class="_"> </span>提供了大量的可复用软件组织。<span class="_ _8"></span>例如,<span class="_ _8"></span>程序员再也不用自己设计排序,<span class="_ _8"></span>搜索</div><div class="t m0 x6 h5 y2a ff4 fs2 fc0 sc0 ls0 ws0">算法了,这些都已经是<span class="_ _1"> </span>STL<span class="_ _1"> </span>的一部分了。嘎嘎,有意思吧。</div><div class="t m0 x6 h5 y2b ff4 fs2 fc0 sc0 ls0 ws0">使用<span class="_ _1"> </span>STL<span class="_"> </span>的应用程序保证了得到的实现在处理速度和内存利用方面都是高效</div><div class="t m0 x6 h5 y2c ff4 fs2 fc0 sc0 ls0 ws0">的,因为<span class="_ _1"> </span>STL<span class="_ _1"> </span>设计者们已经为我们考虑好了。</div><div class="t m0 x6 h5 y2d ff4 fs2 fc0 sc0 ls0 ws0">使用<span class="_ _1"> </span>STL<span class="_ _1"> </span>编写的代码更容易修改和阅读,<span class="_ _8"></span>这是当然的啦。<span class="_ _8"></span>因为代码更短了,<span class="_ _8"></span>很多</div><div class="t m0 x6 h5 y2e ff4 fs2 fc0 sc0 ls0 ws0">基础工作代码已经被组件化了;</div><div class="t m0 x6 h5 y2f ff4 fs2 fc0 sc0 ls0 ws0">使用简单,虽然内部实现很复杂。</div><div class="t m0 x6 h5 y30 ff4 fs2 fc0 sc0 ls0 ws0">虽然,<span class="_ _b"></span>STL<span class="_ _1"> </span>的优点甚多,<span class="_ _b"></span>但是<span class="_ _1"> </span>STL<span class="_ _1"> </span>的语法实在令初学者人头疼,<span class="_ _b"></span>许多人望而却步。</div><div class="t m0 x6 h5 y31 ff4 fs2 fc0 sc0 ls0 ws0">可是<span class="_ _1"> </span>STL<span class="_ _1"> </span>是每个<span class="_ _1"> </span>C++程序设计者迟早都要啃的一块骨头。</div><div class="t m0 x6 h7 y32 ff5 fs4 fc0 sc0 ls0 ws0">1.3<span class="_ _5"> </span><span class="ff4 sc1">初识<span class="_ _3"> </span></span>STL</div><div class="t m0 x6 h5 y33 ff4 fs2 fc0 sc0 ls0 ws0">下面让我们来看几段代码吧:</div><div class="t m0 x6 h5 y34 ff4 fs2 fc0 sc0 ls0 ws0">#include<span class="_"> </span><iostream></div><div class="t m0 x6 h5 y35 ff4 fs2 fc0 sc0 ls0 ws0">int<span class="_"> </span>main(void)</div><div class="t m0 x6 h5 y36 ff4 fs2 fc0 sc0 ls0 ws0">{</div><div class="t m0 x7 h5 y37 ff4 fs2 fc0 sc0 ls0 ws0">double<span class="_"> </span>a[]<span class="_"> </span>=<span class="_"> </span>{1,<span class="_"> </span>2,<span class="_"> </span>3,<span class="_"> </span>4,<span class="_"> </span>5};</div><div class="t m0 x7 h5 y38 ff4 fs2 fc0 sc0 ls0 ws0">std::cout<<mean(a,<span class="_"> </span>5)<<std::endl;<span class="_ _c"> </span>//<span class="_"> </span>will<span class="_"> </span>print<span class="_"> </span>3</div><div class="t m0 x7 h5 y39 ff4 fs2 fc0 sc0 ls0 ws0">return<span class="_"> </span>0;</div><div class="t m0 x6 h5 y3a ff4 fs2 fc0 sc0 ls0 ws0">}</div></div><div class="pi" data-data='{"ctm":[1.611830,0.000000,0.000000,1.611830,0.000000,0.000000]}'></div></div>
<div id="pf3" class="pf w0 h0" data-page-no="3"><div class="pc pc3 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/638b337ce53e5839a71c4afc/bg3.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">3</div></div><div class="t m0 x6 h5 y3b ff4 fs2 fc0 sc0 ls0 ws0">好懂吧,除了那个<span class="_ _1"> </span>std<span class="_ _1"> </span>有点让人不舒服以外,这是一段普通的没有使用<span class="_ _1"> </span>STL<span class="_ _1"> </span>的</div><div class="t m0 x6 h5 y3c ff4 fs2 fc0 sc0 ls0 ws0">C++代码。</div><div class="t m0 x6 h5 y3d ff4 fs2 fc0 sc0 ls0 ws0">再看下面一段:</div><div class="t m0 x6 h5 y3e ff4 fs2 fc0 sc0 ls0 ws0">#include<span class="_"> </span><vector></div><div class="t m0 x6 h5 y3f ff4 fs2 fc0 sc0 ls0 ws0">#include<span class="_"> </span><iostream></div><div class="t m0 x6 h5 y40 ff4 fs2 fc0 sc0 ls0 ws0">int<span class="_"> </span>main()</div><div class="t m0 x6 h5 y41 ff4 fs2 fc0 sc0 ls0 ws0">{</div><div class="t m0 x7 h5 y42 ff4 fs2 fc0 sc0 ls0 ws0">std::vector<double><span class="_"> </span>a;</div><div class="t m0 x7 h5 y43 ff4 fs2 fc0 sc0 ls0 ws0">a.push_back(1);</div><div class="t m0 x7 h5 y44 ff4 fs2 fc0 sc0 ls0 ws0">a.push_back(2);</div><div class="t m0 x7 h5 y45 ff4 fs2 fc0 sc0 ls0 ws0">a.push_back(3);</div><div class="t m0 x7 h5 y46 ff4 fs2 fc0 sc0 ls0 ws0">a.push_back(4);</div><div class="t m0 x7 h5 y47 ff4 fs2 fc0 sc0 ls0 ws0">a.push_back(5);</div><div class="t m0 x7 h5 y48 ff4 fs2 fc0 sc0 ls0 ws0">for(int<span class="_"> </span>i<span class="_"> </span>=<span class="_"> </span>0;<span class="_"> </span>i<span class="_"> </span><<span class="_"> </span>a.size();<span class="_"> </span>++i)</div><div class="t m0 x6 h5 y49 ff4 fs2 fc0 sc0 ls0 ws0">{</div><div class="t m0 x8 h5 y4a ff4 fs2 fc0 sc0 ls0 ws0">std::cout<<a[i]<<std::endl;</div><div class="t m0 x7 h5 y4b ff4 fs2 fc0 sc0 ls0 ws0">}</div><div class="t m0 x7 h5 y4c ff4 fs2 fc0 sc0 ls0 ws0">return<span class="_"> </span>0;</div><div class="t m0 x6 h5 y4d ff4 fs2 fc0 sc0 ls0 ws0">}</div><div class="t m0 x6 h5 y4e ff4 fs2 fc0 sc0 ls0 ws0">如果你真的没有接触过<span class="_ _1"> </span>STL<span class="_ _1"> </span>的话,你会问,呀,<span class="ff6">vector<span class="_"> </span></span>是啥呀?这是一段纯种</div><div class="t m0 x6 h5 y4f ff4 fs2 fc0 sc0 ls0 ws0">的<span class="_ _a"> </span>STL<span class="_ _a"> </span>代码,<span class="_ _d"></span>看到尖括号了吧,<span class="_ _d"></span>知道那是模板了吧。<span class="_ _d"></span>看到<span class="_ _a"> </span><span class="ff6">a.push_back(5)、<span class="_ _d"></span>a.size()</span></div><div class="t m0 x6 h5 y50 ff4 fs2 fc0 sc0 ls0 ws0">你不感觉奇怪么?可是我们并没有定义这些函数啊。</div><div class="t m0 x6 h5 y51 ff4 fs2 fc0 sc0 ls0 ws0">#include<span class="_"> </span><vector></div><div class="t m0 x6 h5 y52 ff4 fs2 fc0 sc0 ls0 ws0">#include<span class="_"> </span><iostream></div><div class="t m0 x6 h5 y53 ff4 fs2 fc0 sc0 ls0 ws0">int<span class="_"> </span>main()</div><div class="t m0 x6 h5 y54 ff4 fs2 fc0 sc0 ls0 ws0">{</div><div class="t m0 x7 h5 y55 ff4 fs2 fc0 sc0 ls0 ws0">std::vector<<span class="_"> </span>int<span class="_"> </span>><span class="_"> </span>q;</div><div class="t m0 x7 h5 y56 ff4 fs2 fc0 sc0 ls0 ws0">q.push_back(10);</div><div class="t m0 x7 h5 y57 ff4 fs2 fc0 sc0 ls0 ws0">q.push_back(11);</div><div class="t m0 x7 h5 y58 ff4 fs2 fc0 sc0 ls0 ws0">q.push_back(12);</div><div class="t m0 x7 h5 y59 ff4 fs2 fc0 sc0 ls0 ws0">std::vector<<span class="_"> </span>int<span class="_"> </span>><span class="_"> </span>v;</div><div class="t m0 x7 h5 y5a ff4 fs2 fc0 sc0 ls0 ws0">for(int<span class="_"> </span>i=0;<span class="_"> </span>i<5;<span class="_"> </span>++i){</div><div class="t m0 x8 h5 y5b ff4 fs2 fc0 sc0 ls0 ws0">v.push_back(i);</div><div class="t m0 x7 h5 y5c ff4 fs2 fc0 sc0 ls0 ws0">}</div><div class="t m0 x7 h5 y5d ff4 fs2 fc0 sc0 ls0 ws0">std::vector<int>::iterator<span class="_"> </span>it<span class="_"> </span>=<span class="_"> </span>v.begin()<span class="_"> </span>+<span class="_"> </span>1;</div><div class="t m0 x7 h5 y5e ff4 fs2 fc0 sc0 ls0 ws0">it<span class="_"> </span>=<span class="_"> </span>v.insert(it,<span class="_"> </span>33);</div><div class="t m0 x7 h5 y5f ff4 fs2 fc0 sc0 ls0 ws0">v.insert(it,<span class="_"> </span>q.begin(),<span class="_"> </span>q.end());</div><div class="t m0 x7 h5 y60 ff4 fs2 fc0 sc0 ls0 ws0">it<span class="_"> </span>=<span class="_"> </span>v.begin()<span class="_"> </span>+<span class="_"> </span>3;</div><div class="t m0 x7 h5 y61 ff4 fs2 fc0 sc0 ls0 ws0">v.insert(it,<span class="_"> </span>3,<span class="_"> </span>-1);</div><div class="t m0 x7 h5 y62 ff4 fs2 fc0 sc0 ls0 ws0">it<span class="_"> </span>=<span class="_"> </span>v.begin()<span class="_"> </span>+<span class="_"> </span>4;</div><div class="t m0 x7 h5 y63 ff4 fs2 fc0 sc0 ls0 ws0">v.erase(it);</div><div class="t m0 x7 h5 y64 ff4 fs2 fc0 sc0 ls0 ws0">it<span class="_"> </span>=<span class="_"> </span>v.begin()<span class="_"> </span>+<span class="_"> </span>1;</div><div class="t m0 x7 h5 y65 ff4 fs2 fc0 sc0 ls0 ws0">v.erase(it,<span class="_"> </span>it<span class="_"> </span>+<span class="_"> </span>4);</div></div><div class="pi" data-data='{"ctm":[1.611830,0.000000,0.000000,1.611830,0.000000,0.000000]}'></div></div>
<div id="pf4" class="pf w0 h0" data-page-no="4"><div class="pc pc4 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/638b337ce53e5839a71c4afc/bg4.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">4</div></div><div class="t m0 x7 h5 y3b ff4 fs2 fc0 sc0 ls0 ws0">v.clear();</div><div class="t m0 x7 h5 y3c ff4 fs2 fc0 sc0 ls0 ws0">return<span class="_"> </span>0;</div><div class="t m0 x6 h5 y3d ff4 fs2 fc0 sc0 ls0 ws0">}</div><div class="t m0 x6 h5 y3e ff4 fs2 fc0 sc0 ls0 ws0">这一段你又看到了新东西了吧:<span class="ff6">iterator、insert、erase、clear</span>。不罗嗦了,</div><div class="t m0 x6 h5 y3f ff4 fs2 fc0 sc0 ls0 ws0">等你看完这篇文章,回头再看就简单了。</div><div class="t m0 x6 h5 y40 ff4 fs2 fc0 sc0 ls0 ws0">关于模板的其他细节,<span class="_ _e"></span>读者可以参阅<span class="_ _e"></span>《C++<span class="_ _1"> </span>Templates<span class="_"> </span>中文版》<span class="_ _e"></span>在这里,简单的</div><div class="t m0 x6 h5 y41 ff4 fs2 fc0 sc0 ls0 ws0">介绍一下模板类和函数模板的概念。</div><div class="t m0 x6 h5 y42 ff4 fs2 fc0 sc0 ls0 ws0">模板是<span class="_ _1"> </span>C++中实现代码重用机制的一种工具,<span class="_ _9"></span>可以实现类型参数化,<span class="_ _9"></span>把类型定义</div><div class="t m0 x6 h5 y43 ff4 fs2 fc0 sc0 ls0 ws0">为参数。函数模板和类模板允许用户构造模板函数和模板类。</div><div class="t m0 x6 h5 y45 ff4 fs2 fc0 sc0 ls0 ws0">下面我们来看一段函数模板的例子:</div><div class="t m0 x6 h5 y46 ff4 fs2 fc0 sc0 ls0 ws0">#include<iostream></div><div class="t m0 x6 h5 y47 ff4 fs2 fc0 sc0 ls0 ws0">#include<string></div><div class="t m0 x6 h5 y48 ff4 fs2 fc0 sc0 ls0 ws0">using<span class="_"> </span>namespace<span class="_"> </span>std;</div><div class="t m0 x6 h5 y49 ff4 fs2 fc0 sc0 ls0 ws0">//定义函数模板</div><div class="t m0 x6 h5 y4a ff4 fs2 fc0 sc0 ls0 ws0">template<class<span class="_"> </span>T><span class="_ _4"> </span>//template<span class="_"> </span>是关键字,T<span class="_"> </span>表示一种待实例化的类型</div><div class="t m0 x9 h5 y4b ff4 fs2 fc0 sc0 ls0 ws0">//template<typename<span class="_"> </span>T><span class="_ _f"> </span>也是对的</div><div class="t m0 x6 h5 y4c ff4 fs2 fc0 sc0 ls0 ws0">T<span class="_"> </span>MAX(T<span class="_"> </span>a,<span class="_"> </span>T<span class="_"> </span>b)//函数模板,函数名为<span class="_"> </span>max,此函数有<span class="_ _1"> </span>2<span class="_ _1"> </span>个<span class="_ _1"> </span>T<span class="_ _1"> </span>类型的参数,返</div><div class="t m0 x6 h5 y4d ff4 fs2 fc0 sc0 ls0 ws0">回类型为<span class="_ _1"> </span>T</div><div class="t m0 x6 h5 y4e ff4 fs2 fc0 sc0 ls0 ws0">{</div><div class="t m0 xa h5 y4f ff4 fs2 fc0 sc0 ls0 ws0">return<span class="_"> </span>(a>b)?a:b;</div><div class="t m0 x6 h5 y50 ff4 fs2 fc0 sc0 ls0 ws0">}</div><div class="t m0 x6 h5 y51 ff4 fs2 fc0 sc0 ls0 ws0">//在此例实例化的时候,T<span class="_ _1"> </span>可以是多种类型的,int,char,string…</div><div class="t m0 x6 h5 y52 ff4 fs2 fc0 sc0 ls0 ws0">int<span class="_"> </span>main()</div><div class="t m0 x6 h5 y66 ff4 fs2 fc0 sc0 ls0 ws0">{</div><div class="t m0 x6 h5 y53 ff4 fs2 fc0 sc0 ls0 ws0">int<span class="_"> </span>x=2,y=6;</div><div class="t m0 x7 h5 y54 ff4 fs2 fc0 sc0 ls0 ws0">double<span class="_"> </span>x1=9.123,y1=12.6543;</div><div class="t m0 x7 h5 y55 ff4 fs2 fc0 sc0 ls0 ws0">cout<<"把<span class="_ _1"> </span>T<span class="_ _1"> </span>实例化为<span class="_ _1"> </span>int:"<<MAX(x,y)<<endl;//<span class="fs0">实例化函数模板,把<span class="_ _a"> </span>T<span class="_ _10"> </span>实例化为</span></div><div class="t m0 x6 h8 y67 ff4 fs0 fc0 sc0 ls0 ws0">int</div><div class="t m0 x7 h5 y57 ff4 fs2 fc0 sc0 ls0 ws0">cout<<"把<span class="_ _1"> </span>T<span class="_ _1"> </span>实例化为<span class="_ _1"> </span>double:"<<MAX(x1,y1)<<endl;<span class="_ _f"> </span>//<span class="fs0">把<span class="_ _10"> </span>T<span class="_ _a"> </span>实例化为<span class="_ _10"> </span>double</span></div><div class="t m0 x6 h5 y58 ff4 fs2 fc0 sc0 ls0 ws0">}</div><div class="t m0 x6 h5 y59 ff4 fs2 fc0 sc0 ls0 ws0">下面再看看,类模板:</div><div class="t m0 x6 h5 y5a ff4 fs2 fc0 sc0 ls0 ws0">#include<iostream></div><div class="t m0 x6 h5 y5b ff4 fs2 fc0 sc0 ls0 ws0">using<span class="_"> </span>namespace<span class="_"> </span>std;</div><div class="t m0 x6 h5 y5c ff4 fs2 fc0 sc0 ls0 ws0">//定义名为<span class="_ _1"> </span>ex_class<span class="_ _1"> </span>的类模板</div><div class="t m0 x6 h5 y5d ff4 fs2 fc0 sc0 ls0 ws0">template<span class="_"> </span><<span class="_"> </span>typename<span class="_"> </span>T><span class="_ _f"> </span>class<span class="_"> </span>ex_class</div><div class="t m0 x6 h5 y5e ff4 fs2 fc0 sc0 ls0 ws0">{</div><div class="t m0 x7 h5 y5f ff4 fs2 fc0 sc0 ls0 ws0">T<span class="_"> </span>value;</div><div class="t m0 x6 h5 y60 ff4 fs2 fc0 sc0 ls0 ws0">public:</div><div class="t m0 x7 h5 y61 ff4 fs2 fc0 sc0 ls0 ws0">ex_class(T<span class="_"> </span>v)<span class="_"> </span>{<span class="_"> </span>value=v;<span class="_"> </span>}</div><div class="t m0 x7 h5 y62 ff4 fs2 fc0 sc0 ls0 ws0">void<span class="_"> </span>set_value(T<span class="_"> </span>v)<span class="_"> </span>{<span class="_"> </span>value=v;<span class="_"> </span>}</div><div class="t m0 x7 h5 y63 ff4 fs2 fc0 sc0 ls0 ws0">T<span class="_"> </span>get_value(void)<span class="_"> </span>{return<span class="_"> </span>value;}</div><div class="t m0 x6 h5 y64 ff4 fs2 fc0 sc0 ls0 ws0">};</div><div class="t m0 x6 h5 y65 ff4 fs2 fc0 sc0 ls0 ws0">//main()函数中测试<span class="_ _1"> </span>ex_class<span class="_ _1"> </span>类模板</div></div><div class="pi" data-data='{"ctm":[1.611830,0.000000,0.000000,1.611830,0.000000,0.000000]}'></div></div>
<div id="pf5" class="pf w0 h0" data-page-no="5"><div class="pc pc5 w0 h0"><img class="bi x0 y0 w1 h1" alt="" src="https://static.pudn.com/prod/directory_preview_static/638b337ce53e5839a71c4afc/bg5.jpg"><div class="c x1 y1 w2 h2"><div class="t m0 x2 h3 y2 ff1 fs0 fc0 sc0 ls0 ws0">5</div></div><div class="t m0 x6 h5 y3b ff4 fs2 fc0 sc0 ls0 ws0">int<span class="_"> </span>main()</div><div class="t m0 x6 h5 y3c ff4 fs2 fc0 sc0 ls0 ws0">{</div><div class="t m0 x7 h5 y3d ff4 fs2 fc0 sc0 ls0 ws0">//测试<span class="_ _1"> </span>int<span class="_ _1"> </span>类型数据</div><div class="t m0 x7 h5 y3e ff4 fs2 fc0 sc0 ls0 ws0">ex_class<span class="_"> </span><int><span class="_"> </span>a(5),b(10);</div><div class="t m0 x7 h5 y3f ff4 fs2 fc0 sc0 ls0 ws0">cout<<"a.value:"<<a.get_value()<<endl;</div><div class="t m0 x7 h5 y40 ff4 fs2 fc0 sc0 ls0 ws0">cout<<"b.value:"<<b.get_value()<<endl;</div><div class="t m0 x7 h5 y41 ff4 fs2 fc0 sc0 ls0 ws0">//测试<span class="_ _1"> </span>char<span class="_ _1"> </span>类型数据</div><div class="t m0 x7 h5 y42 ff4 fs2 fc0 sc0 ls0 ws0">ex_class<span class="_"> </span><char><span class="_"> </span>ch('A');</div><div class="t m0 x7 h5 y43 ff4 fs2 fc0 sc0 ls0 ws0">cout<<"ch.value:"<<ch.get_value()<<endl;</div><div class="t m0 x7 h5 y44 ff4 fs2 fc0 sc0 ls0 ws0">ch.set_value('a');</div><div class="t m0 x7 h5 y45 ff4 fs2 fc0 sc0 ls0 ws0">cout<<"ch.value:"<<ch.get_value()<<endl;</div><div class="t m0 x7 h5 y46 ff4 fs2 fc0 sc0 ls0 ws0">//测试<span class="_ _1"> </span>double<span class="_ _1"> </span>类型数据</div><div class="t m0 x7 h5 y47 ff4 fs2 fc0 sc0 ls0 ws0">ex_class<span class="_"> </span><double><span class="_"> </span>x(5.5);</div><div class="t m0 x7 h5 y48 ff4 fs2 fc0 sc0 ls0 ws0">cout<<"x.value:"<<x.get_value()<<endl;</div><div class="t m0 x7 h5 y49 ff4 fs2 fc0 sc0 ls0 ws0">x.set_value(7.5);</div><div class="t m0 x7 h5 y4a ff4 fs2 fc0 sc0 ls0 ws0">cout<<"x.value:"<<x.get_value()<<endl;</div><div class="t m0 x6 h5 y4b ff4 fs2 fc0 sc0 ls0 ws0">}</div><div class="t m0 x6 h7 y68 ff5 fs4 fc0 sc0 ls0 ws0">1.4<span class="_ _5"> </span>STL<span class="_"> </span><span class="ff4 sc1">的组成</span></div><div class="t m0 x6 h5 y69 ff4 fs2 fc0 sc0 ls0 ws0">STL<span class="_ _1"> </span>有三大核心部分:<span class="_ _11"></span>容器<span class="_ _11"></span>(Container)<span class="_ _11"></span>、<span class="_ _11"></span>算法<span class="_ _12"></span>(Algorithms)<span class="_ _11"></span>、<span class="_ _11"></span>迭代器<span class="_ _11"></span>(Iterator)<span class="_ _d"></span>,</div><div class="t m0 x6 h5 y6a ff4 fs2 fc0 sc0 ls0 ws0">容器适配器(container<span class="_"> </span>adaptor),函数对象(functor),除此之外还有<span class="_ _1"> </span>STL</div><div class="t m0 x6 h5 y6b ff4 fs2 fc0 sc0 ls0 ws0">其他标准组件。通俗的讲:</div><div class="t m0 x6 h5 y6c ff4 fs2 fc0 sc0 ls0 ws0">容器:<span class="_ _e"></span>装东西的东西,<span class="_ _e"></span>装水的杯子,<span class="_ _e"></span>装咸水的大海,装人的教室……STL<span class="_ _1"> </span>里的容</div><div class="t m0 x6 h5 y6d ff4 fs2 fc0 sc0 ls0 ws0">器是可容纳一些数据的模板类。</div><div class="t m0 x6 h5 y6e ff4 fs2 fc0 sc0 ls0 ws0">算法:<span class="_ _e"></span>就是往杯子里倒水,<span class="_ _e"></span>往大海里排污,<span class="_ _e"></span>从教室里撵人……STL<span class="_ _1"> </span>里的算法,就</div><div class="t m0 x6 h5 y6f ff4 fs2 fc0 sc0 ls0 ws0">是处理容器里面数据的方法、操作。</div><div class="t m0 x6 h5 y70 ff4 fs2 fc0 sc0 ls0 ws0">迭代器:往杯子里倒水的水壶,排污的管道,撵人的那个物业管理人员……STL</div><div class="t m0 x6 h5 y71 ff4 fs2 fc0 sc0 ls0 ws0">里的迭代器:<span class="_ _8"></span>遍历容器中数据的对象。<span class="_ _8"></span>对存储于容器中的数据进行处理时,<span class="_ _8"></span>迭代</div><div class="t m0 x6 h5 y72 ff4 fs2 fc0 sc0 ls0 ws0">器能从一个成员移向另一个成员。<span class="_ _13"></span>他能按预先定义的顺序在某些容器中的成员间</div><div class="t m0 x6 h5 y73 ff4 fs2 fc0 sc0 ls0 ws0">移动。对普通的一维数组、向量、双端队列和列表来说,迭代器是一种指针。</div><div class="t m0 x6 h5 y74 ff4 fs2 fc0 sc0 ls0 ws0">下面让我们来看看专家是怎么说的:</div><div class="t m0 x6 h5 y75 ff4 fs2 fc0 sc0 ls0 ws0">容器(container):容器是数据在内存中组织的方法,例如,数组、堆栈、队</div><div class="t m0 x6 h5 y76 ff4 fs2 fc0 sc0 ls0 ws0">列、<span class="_ _e"></span>链表或二叉树<span class="_ _e"></span>(不过这些都不是<span class="_ _1"> </span>STL<span class="_ _1"> </span>标准容器)<span class="_ _e"></span>。STL<span class="_ _1"> </span>中的容器是一种存储</div><div class="t m0 x6 h5 y77 ff4 fs2 fc0 sc0 ls0 ws0">T<span class="_ _8"></span>(Template)<span class="_ _8"></span>类型值的有限集合的数据结构,容器的内部实现一般是类。<span class="_ _8"></span>这些值</div><div class="t m0 x6 h5 y78 ff4 fs2 fc0 sc0 ls0 ws0">可以是对象本身,如果数据类型<span class="_ _1"> </span>T<span class="_ _1"> </span>代表的是<span class="_ _1"> </span>Class<span class="_ _1"> </span>的话。</div><div class="t m0 x6 h5 y79 ff4 fs2 fc0 sc0 ls0 ws0">算法<span class="_ _8"></span>(algorithm)<span class="_ _8"></span>:<span class="_ _8"></span>算法是应用在容器上以各种方法处理其内容的行为或功能。</div><div class="t m0 x6 h5 y7a ff4 fs2 fc0 sc0 ls0 ws0">例如,<span class="_ _9"></span>有对容器内容排序、<span class="_ _9"></span>复制、<span class="_ _14"></span>检索和合并的算法。<span class="_ _14"></span>在<span class="_ _1"> </span>STL<span class="_ _1"> </span>中,<span class="_ _9"></span>算法是由模板</div><div class="t m0 x6 h5 y7b ff4 fs2 fc0 sc0 ls0 ws0">函数表现的。<span class="_ _14"></span>这些函数不是容器类的成员函数。<span class="_ _14"></span>相反,<span class="_ _14"></span>它们是独立的函数。<span class="_ _14"></span>令人</div><div class="t m0 x6 h5 y7c ff4 fs2 fc0 sc0 ls0 ws0">吃惊的特点之一就是其算法如此通用。<span class="_ _b"></span>不仅可以将其用于<span class="_ _1"> </span>STL<span class="_ _1"> </span>容器,<span class="_ _15"></span>而且可以用</div><div class="t m0 x6 h5 y7d ff4 fs2 fc0 sc0 ls0 ws0">于普通的<span class="_ _1"> </span>C++数组或任何其他应用程序指定的容器。</div><div class="t m0 x6 h5 y7e ff4 fs2 fc0 sc0 ls0 ws0">迭代器(iterator):<span class="_ _b"></span>一旦选定一种容器类型和数据行为(算法),<span class="_ _15"></span>那么剩下唯一要</div><div class="t m0 x6 h5 y7f ff4 fs2 fc0 sc0 ls0 ws0">他做的就是用迭代器使其相互作用。<span class="_ _13"></span>可以把达代器看作一个指向容器中元素的普</div></div><div class="pi" data-data='{"ctm":[1.611830,0.000000,0.000000,1.611830,0.000000,0.000000]}'></div></div>