﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-旅途-文章分类-C++ STL</title><link>http://www.cppblog.com/mydriverc/category/5021.html</link><description>如果想飞得高，就该把地平线忘掉</description><language>zh-cn</language><lastBuildDate>Mon, 19 May 2008 13:37:00 GMT</lastBuildDate><pubDate>Mon, 19 May 2008 13:37:00 GMT</pubDate><ttl>60</ttl><item><title>multimap查找</title><link>http://www.cppblog.com/mydriverc/articles/33150.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Fri, 28 Sep 2007 15:41:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/33150.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/33150.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/33150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/33150.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/33150.html</trackback:ping><description><![CDATA[#include &lt;map&gt;<br />#include &lt;string&gt;<br />#include &lt;iostream&gt;<br />using namespace std;<br />int main()<br />{<br /><br />   multimap&lt;string,string&gt;mymap;<br />   mymap.insert(multimap&lt;string,string&gt;::value_type("ho","123"));<br />   mymap.insert(multimap&lt;string,string&gt;::value_type("hu","234"));<br />   mymap.insert(multimap&lt;string,string&gt;::value_type("lian","345"));<br />   mymap.insert(multimap&lt;string,string&gt;::value_type("ho","555")); <br />   mymap.insert(multimap&lt;string,string&gt;::value_type("hu","444"));<br />   mymap.insert(multimap&lt;string,string&gt;::value_type("ho","333"));<br /><br />   int num=mymap.count("ho");<br />   switch(num)<br />   {<br />       case 0:<br />       break;<br />       case 1:<br />       break;<br />       default:<br />           {<br />              multimap&lt;string,string&gt;::iterator i;<br />               pair&lt; multimap&lt;string,string&gt;::iterator, multimap&lt;string,string&gt;::iterator&gt;pos;<br />               pos=mymap.equal_range("ho");<br />               for(i=pos.first;i!=pos.second;i++)<br />               {<br />                 cout&lt;&lt;i-&gt;second &lt;&lt;endl;<br />               }<br />           }<br />           break;<br /><br />   }<br />   return 0;<br />}<br />输出<br />123<br />555<br />333<br /><img src ="http://www.cppblog.com/mydriverc/aggbug/33150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-28 23:41 <a href="http://www.cppblog.com/mydriverc/articles/33150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>multimap用法示例</title><link>http://www.cppblog.com/mydriverc/articles/33141.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Fri, 28 Sep 2007 15:25:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/33141.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/33141.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/33141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/33141.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/33141.html</trackback:ping><description><![CDATA[
		<div class="cnt">
				<p>// multimaptest.cpp : 定义控制台应用程序的入口点。<br />
//</p>
				<p>#include "stdafx.h"<br />
#include &lt;iostream&gt;<br />
#include &lt;string&gt;<br />
#include &lt;map&gt;<br />
using namespace std;</p>
				<p>struct userdevice{<br />
 string m_devicename;<br />
 string m_deviceid;<br />
 int     m_devicePopedom;<br /><br />
};<br />
typedef multimap&lt;string,userdevice&gt; USERTABLE;<br />
typedef USERTABLE::const_iterator CIT;<br />
typedef pair&lt;CIT, CIT&gt; Range;<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
 CIT it;<br />
 userdevice d1,d2,d3,d4;<br />
 d1.m_deviceid = "12341234";<br />
 d1.m_devicename = "d1";<br />
 d1.m_devicePopedom = 123;</p>
				<p> d2.m_deviceid = "23622344";<br />
 d2.m_devicename = "d2";<br />
 d2.m_devicePopedom = 234;</p>
				<p>
						<br />
 d3.m_deviceid = "3451234";<br />
 d3.m_devicename = "d3";<br />
 d3.m_devicePopedom = 345;</p>
				<p> d4.m_deviceid = "43622344";<br />
 d4.m_devicename = "d4";<br />
 d4.m_devicePopedom = 456;</p>
				<p> USERTABLE m_user;<br />
 m_user.insert(make_pair("zhangsanfeng",d1));<br />
 m_user.insert(make_pair("zhangsanfeng",d2));</p>
				<p> m_user.insert(make_pair("zhangsanfeng2",d3));<br />
 m_user.insert(make_pair("zhangsanfeng2",d4));<br />
 //查找方法一<br />
 Range range=m_user.equal_range("zhangsanfeng");<br />
 for(CIT i = range.first;i!=range.second;i++)<br />
 {<br />
   cout &lt;&lt; i-&gt;second.m_deviceid&lt;&lt;','<br />
    &lt;&lt; i-&gt;second.m_devicename&lt;&lt;','<br />
    &lt;&lt;i-&gt;second.m_devicePopedom<br />
    &lt;&lt; endl;<br />
 }<br />
 cout&lt;&lt;endl;<br />
 //查找方法二<br />
 CIT it2 = m_user.find("zhangsanfeng2");<br />
 while(it2 != m_user.end())<br />
 {<br />
   cout&lt;&lt;it2-&gt;second.m_deviceid&lt;&lt;','<br />
    &lt;&lt;it2-&gt;second.m_devicename&lt;&lt;','<br />
    &lt;&lt;it2-&gt;second.m_devicePopedom&lt;&lt;','<br />
    &lt;&lt;endl;<br />
   it2++;<br />
 }<br />
 cout&lt;&lt;endl;<br />
 //遍历<br />
 CIT it3 = m_user.begin();<br />
 while(it3 != m_user.end())<br />
 {<br />
   cout&lt;&lt;it3-&gt;second.m_deviceid&lt;&lt;','<br />
    &lt;&lt;it3-&gt;second.m_devicename&lt;&lt;','<br />
    &lt;&lt;it3-&gt;second.m_devicePopedom&lt;&lt;','<br />
    &lt;&lt;endl;<br />
   it3++;<br />
 }<br />
 cin.get();<br />
 return 0;<br />
}</p>
				<p>lower_bound() 和 upper_bound()：lower_bound(k) 查找第一个与键 k 关联的值，而
upper_bound(k) 是查找第一个键值比 k 大的元素。下面的例子示范用
upper_bound()来定位第一个其键值大于“213.108.96.7”的元素。通常，当键是一个字符串时，会有一个词典编纂比较：</p>
				<pre>dns.insert(make_pair("219.108.96.70", "pythonzone.com"));<br />CIT cit=dns.upper_bound("213.108.96.7");<br />if (cit!=dns.end()) //found anything?<br />     cout&lt;&lt;cit-&gt;second&lt;&lt;endl; //display: pythonzone.com</pre>
				<p>如果你想显示其后所有的值，可以用下面这样的循环： </p>
				<pre>// 插入有相同键的多个值<br />dns.insert(make_pair("219.108.96.70","pythonzone.com"));<br />dns.insert(make_pair("219.108.96.70","python-zone.com"));<br /><br />// 获得第一个值的迭代指针<br />CIT cit=dns.upper_bound("213.108.96.7");<br /><br />// 输出: pythonzone.com，python-zone.com<br />while(cit!=dns.end())<br />{<br />　　　cout&lt;&lt;cit-&gt;second&lt;&lt;endl; <br />　　　++cit;<br />}</pre>
				<p>
						<strong>结论</strong>
						<br />
　　虽然 map 和 multimap 具有相同的接口，其重要差别在于重复键，设计和使用要区别对待。此外，还要注意每个容器里 insert()成员函数的细微差别。</p>
		</div>
<img src ="http://www.cppblog.com/mydriverc/aggbug/33141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-28 23:25 <a href="http://www.cppblog.com/mydriverc/articles/33141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>set要点</title><link>http://www.cppblog.com/mydriverc/articles/32571.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Thu, 20 Sep 2007 10:10:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32571.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32571.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32571.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32571.html</trackback:ping><description><![CDATA[
		<p>   set&lt;string&gt; myset;<br />   myset.insert("Hello");<br />   myset.insert("Hello");<br />   myset.insert("Hou");</p>
		<p>   set&lt;string&gt;::iterator ite=myset.begin();<br />   for(;ite!=myset.end();ite++)<br />   cout&lt;&lt;(*ite)&lt;&lt;endl;<br /><br />输出Hello Hou</p>
		<p>   ite=myset.begin();<br />   myset.insert(ite,"World");<br />   cout&lt;&lt;(*ite)&lt;&lt;endl;<br />   输出Hello---说明没有替换第一个位置的键。<br /><br />map 中键/值对构成好比一个地址和电话号码，以人名为键值，相反地set 只是键的集合。</p>
<img src ="http://www.cppblog.com/mydriverc/aggbug/32571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-20 18:10 <a href="http://www.cppblog.com/mydriverc/articles/32571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>map重点</title><link>http://www.cppblog.com/mydriverc/articles/32569.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Thu, 20 Sep 2007 09:54:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32569.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32569.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32569.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32569.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32569.html</trackback:ping><description><![CDATA[
		<p>实际上，用下标操作符把map 初始化至一组元素集合，会使每个值都被初始化为缺省值<br />，然后再被赋值为显式的值，如果元素是类对象，而且它的缺省初始化和赋值的运算量都很大，<br />就会影响程序的性能，尽管不会影响程序的正确性。<br /><br /> map&lt;string,int&gt; mymap;<br /> mymap["hou"]=0;<br /> mymap["hua"]=1;<br /> mymap["liang"]=2;</p>
		<p> mymap.insert(map&lt;string,int&gt;::value_type("nihao",3));//尽量使用这种方式。<br /><br /><br /> cout&lt;&lt;mymap["nihao"]&lt;&lt;endl;<br /> mymap.insert(map&lt;string,int&gt;::value_type("nihao",4));<br />   cout&lt;&lt;mymap["nihao"]&lt;&lt;endl;－－－－依旧输出3，这说明如果已经有了一个键值，是不能再输入的。<br />   cout&lt;&lt;mymap.count("nihao")&lt;&lt;endl;－－－输出1，实际上只会有0和1这两种可能。<br /><br /><br /><br />但是只有当map 中存在这样一个键的实例时，该代码才会表现正常。如果不存在这样的实例，使用下标操<strong>作符会引起插入一个实例。</strong><br /><br />   int count=mymap.count("hou");<br />   if(count!=0)、、只有得到count不是0时，才可以安全操作。<br />    cout&lt;&lt;mymap["hou"]&lt;&lt;endl;</p>
		<p>   map&lt;string,int&gt;::iterator ite=mymap.find("hou");<br />   if(ite!=mymap.end())<br />    cout&lt;&lt;(*ite).first&lt;&lt;"----"&lt;&lt;(*ite).second&lt;&lt;endl;<br /><br /> cout&lt;&lt;mymap["ri"]&lt;&lt;endl;－－－－注意，map里没有ri这个键值，因此会增加一个。<br /><br /></p>
<img src ="http://www.cppblog.com/mydriverc/aggbug/32569.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-20 17:54 <a href="http://www.cppblog.com/mydriverc/articles/32569.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>const iterator</title><link>http://www.cppblog.com/mydriverc/articles/32567.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Thu, 20 Sep 2007 08:56:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32567.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32567.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32567.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32567.html</trackback:ping><description><![CDATA[除了iterator 类型每个容器还定义了一个const iterator 类型,后者对于遍历const 容器<br />是必需的const iterator 允许以只读方式访问容器的底层元素,例如<br />#include &lt;vector &gt;<br />void even_odd( const vector&lt;int&gt; *pvec,<br />vector&lt;int&gt; *pvec_even,<br />vector&lt;int&gt; *pvec_odd )<br />{<br />// 必须声明一个const_iterator, 才能够遍历pvec<br />vector&lt;int&gt;::const_iterator c_iter = pvec-&gt;begin();<br />vector&lt;int&gt;::const_iterator c_iter_end = pvec-&gt;end();<br />for ( ; c_iter != c_iter_end; ++c_iter )<br />if ( *c_iter % 2 )<br />pvec_odd-&gt;push_back( *c_iter );<br />else pvec_even-&gt;push_back( *c_iter );<br />}<br /><br /><br /><br />void print(const vector&lt;int&gt; *vec,vector&lt;int&gt;*vec_even,vector&lt;int&gt;*vec_odd)<br />{<br /> vector&lt;int&gt;::const_iterator ite_be=vec-&gt;begin();<br /> vector&lt;int&gt;::const_iterator ite_end=vec-&gt;end();<br /> for(;ite_be!=ite_end;ite_be++)<br /> {<br />    if(*ite_be%2)<br />     vec_even-&gt;push_back(*ite_be);<br />    else<br />     vec_odd-&gt;push_back(*ite_be);<br /> }<br />};<br />这个是错误的。<br />void print(const vector&lt;int&gt; vec,vector&lt;int&gt;vec_even,vector&lt;int&gt;vec_odd)<br />{<br /> vector&lt;int&gt;::const_iterator ite_be=vec.begin();<br /> vector&lt;int&gt;::const_iterator ite_end=vec.end();<br /> for(;ite_be!=ite_end;ite_be++)<br /> {<br />    if(*ite_be%2)<br />     vec_even.push_back(*ite_be);<br />    else<br />     vec_odd.push_back(*ite_be);<br /> }<br />};<br /><br /><br />调用<br />   vector&lt;int&gt;vec_even;<br />   vector&lt;int&gt;vec_odd;<br />  print(&amp;vec,&amp;vec_even,&amp;vec_odd);<br />  vector&lt;int&gt;::iterator ite_be=vec_even.begin();<br />  for(;ite_be!=vec_even.end();++ite_be)<br />  {<br />     cout&lt;&lt;*ite_be&lt;&lt;endl;<br />  }<br />  vector&lt;int&gt;vec_even2;<br />  vector&lt;int&gt;vec_odd2;<br />  print(vec,vec_even2,vec_odd2);<br />   for(vector&lt;int&gt;::iterator ite_be=vec_even2.begin();ite_be!=vec_even2.end();++ite_be)<br />  {<br />     cout&lt;&lt;*ite_be&lt;&lt;endl;<br />  }<img src ="http://www.cppblog.com/mydriverc/aggbug/32567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-20 16:56 <a href="http://www.cppblog.com/mydriverc/articles/32567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>容器的类型</title><link>http://www.cppblog.com/mydriverc/articles/32564.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Thu, 20 Sep 2007 08:26:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32564.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32564.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32564.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32564.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32564.html</trackback:ping><description><![CDATA[我们能够定义的容器的类型有三个限制，实际上它们只适用于用户定义的类类型<br />元素类型必须支持<strong>等于操作符 －－是＝＝而不是＝</strong><br />元素类型必须支持<strong>小于操作符  <br /></strong>－－－－<strong>前面讨论的所有关系操作符都用这两个操作符来实现<br /></strong>元素类型必须支持一个缺省值对于类类型即指<strong>缺省构造函数</strong><br />所有预定义数据类型，包括指针都满足这些限制，C++标准库给出的所有类类型也一<br />样<img src ="http://www.cppblog.com/mydriverc/aggbug/32564.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-20 16:26 <a href="http://www.cppblog.com/mydriverc/articles/32564.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vector内存管理</title><link>http://www.cppblog.com/mydriverc/articles/32547.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Thu, 20 Sep 2007 07:15:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32547.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32547.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32547.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32547.html</trackback:ping><description><![CDATA[为了提高效率,实际上vector 并不是随每一个元素的插入而增长自己,而是当vector 需<br />要增长自身时,它实际分配的空间比当前所需的空间要多一些.。也就是说它分配了一些额<br />外的内存容量或者说它预留了这些存储区分配的额外容量的确切数目由具体实现定义，<br />这个策略使容器的增长效率更高——因此<strong>实际上对于小的对象vector 在实践中比list<br />效率更高<br /></strong>让我们来看一看在C++标准库的Rogue Wave 实现版本下的一些例子但是首先<br />我们要弄清楚容器的容量和长度<strong>size </strong>之间的区别。<br />容量是指在容器下一次需要增长自己之前能够被加入到容器中的元素的总数，容量只与<br />连续存储的容器相关，例如vector deque 或string ，list 不要求容量。为了知道一个容器的<br />容量我们调用它的<strong>capacity()</strong>操作而长度size 是指容器当前拥有元素的个数为了获<br />得容器的当前长度我们调用它的size()操作例。<br /><br />我在VC++.net上试验的代码，可以看出他的增长方式<br /><br />   FILE *file=freopen("1.txt","w",stdout);<br />   vector&lt;int&gt; vec;<br />   cout&lt;&lt;"capacity"&lt;&lt;vec.capacity()&lt;&lt;"size"&lt;&lt;vec.size()&lt;&lt;endl;<br />   for(int i=0;i&lt;100;i++)<br />   {<br />      vec.push_back(i);<br />   cout&lt;&lt;"capacity"&lt;&lt;vec.capacity()&lt;&lt;"size"&lt;&lt;vec.size()&lt;&lt;endl;<br />   }<br /><br /><br />结果如下：<br />capacity0size0<br />capacity1size1<br />capacity2size2<br />capacity3size3<br />capacity4size4<br />capacity6size5<br />capacity6size6<br />capacity9size7<br />capacity9size8<br />capacity9size9<br />capacity13size10<br />capacity13size11<br />capacity13size12<br />capacity13size13<br />capacity19size14<br />capacity19size15<br />capacity19size16<br />capacity19size17<br />capacity19size18<br />capacity19size19<br />capacity28size20<br />capacity28size21<br />capacity28size22<br />capacity28size23<br />capacity28size24<br />capacity28size25<br />capacity28size26<br />capacity28size27<br />capacity28size28<br />capacity42size29<br />capacity42size30<br />capacity42size31<br />capacity42size32<br />capacity42size33<br />capacity42size34<br />capacity42size35<br />capacity42size36<br />capacity42size37<br />capacity42size38<br />capacity42size39<br />capacity42size40<br />capacity42size41<br />capacity42size42<br />capacity63size43<br />capacity63size44<br />capacity63size45<br />capacity63size46<br />capacity63size47<br />capacity63size48<br />capacity63size49<br />capacity63size50<br />capacity63size51<br />capacity63size52<br />capacity63size53<br />capacity63size54<br />capacity63size55<br />capacity63size56<br />capacity63size57<br />capacity63size58<br />capacity63size59<br />capacity63size60<br />capacity63size61<br />capacity63size62<br />capacity63size63<br />capacity94size64<br />capacity94size65<br />capacity94size66<br />capacity94size67<br />capacity94size68<br />capacity94size69<br />capacity94size70<br />capacity94size71<br />capacity94size72<br />capacity94size73<br />capacity94size74<br />capacity94size75<br />capacity94size76<br />capacity94size77<br />capacity94size78<br />capacity94size79<br />capacity94size80<br />capacity94size81<br />capacity94size82<br />capacity94size83<br />capacity94size84<br />capacity94size85<br />capacity94size86<br />capacity94size87<br />capacity94size88<br />capacity94size89<br />capacity94size90<br />capacity94size91<br />capacity94size92<br />capacity94size93<br />capacity94size94<br />capacity141size95<br />capacity141size96<br />capacity141size97<br />capacity141size98<br />capacity141size99<br />capacity141size100<br /><br />对于小的数据类型vector 的性能要比list 好得多，而对于大型的数据类型则相反list 的性能要好得多，区别是由于vector 需要重新增长以及拷贝元素。<br /><br />无论是list 还是vector ，对于已定义拷贝构造函数的类来说插入这样的类的元素都需要调用拷贝构造函数拷贝构造函数（用该类型的一个对象初始化该类型的另一个对象）<br /><br />这正说明了在简单类和string 的链表之间插入代价的区别：简单类对象和大型简单类对象通过按位拷贝插入一个对象的所有位被拷贝到第二个对象的位中，而string 类对象和大型复杂类对象通过调用拷贝构造函数来插入。<br /><br />另外随着每次重新分配内存，vector 必须为每个元素调用拷贝构造函数，而且在释放原来的内存时它要为每个元素调用其相关类型的析构函数。vector 的动态自我增长越频繁，元素插入的开销就越大。<br /><br />当然，一种解决方案是，当vector 的开销变得非常大时把vector 转换成list ；另一种经<br />常使用的方案是通过指针间接存储复杂的类对象。<br /><br /><img src ="http://www.cppblog.com/mydriverc/aggbug/32547.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-20 15:15 <a href="http://www.cppblog.com/mydriverc/articles/32547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vector list</title><link>http://www.cppblog.com/mydriverc/articles/32543.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Thu, 20 Sep 2007 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/32543.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/32543.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/32543.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/32543.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/32543.html</trackback:ping><description><![CDATA[vector 表示一段连续的内存区域每个元素被顺序存储在这段内存中<br />对vector 的随机访问比如先访问元素5 然后访问15 然后再访问7 等等效率很高<br />因为每次访问离vector起始处的位移都是固定的<br />但是在任意位置而不是在vector 末尾插人元素则效率很低因为它需要把待插入元素右边的每个元素都拷贝一遍类似地删除任意一个而不是vector的最后一个元素效率同样很低因为待删除元素右边的每个元素都必须被复制一遍这种代价对于大型的复杂的类对象来说尤其大<br /><br />一个deque 也表示一段连续的内存区域但<br />是与vector 不同的是它支持高效地在其首部插入和删除元素它通过两级数组结构来实<br />现一级表示实际的容器第二级指向容器的首和尾<br /><br />list 表示非连续的内存区域并通过一对指向首尾元素的指针双向链接起来从而允许<br />向前和向后两个方向进行遍历在list 的任意位置插入和删除元素的效率都很高指针必须<br />被重新赋值但是不需要用拷贝元素来实现移动另一方面它对随机访问的支持并不好<br />访问一个元素需要遍历中间的元素另外每个元素还有两个指针的额外空间开销<br /><br />下面是选择顺序容器类型的一些准则<br /><strong>如果我们需要随机访问一个容器则vector 要比list 好得多<br />如果我们已知要存储元素的个数则vector 又是一个比list 好的选择<br />如果我们需要的不只是在容器两端插入和删除元素则list 显然要比vector 好<br />除非我们需要在容器首部插入和删除元素否则vector 要比deque</strong> 好<img src ="http://www.cppblog.com/mydriverc/aggbug/32543.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-20 14:58 <a href="http://www.cppblog.com/mydriverc/articles/32543.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> STL学习小结 </title><link>http://www.cppblog.com/mydriverc/articles/31588.html</link><dc:creator>旅途</dc:creator><author>旅途</author><pubDate>Tue, 04 Sep 2007 17:22:00 GMT</pubDate><guid>http://www.cppblog.com/mydriverc/articles/31588.html</guid><wfw:comment>http://www.cppblog.com/mydriverc/comments/31588.html</wfw:comment><comments>http://www.cppblog.com/mydriverc/articles/31588.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/mydriverc/comments/commentRss/31588.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/mydriverc/services/trackbacks/31588.html</trackback:ping><description><![CDATA[
		<p>
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">提供了类型安全、高效而易用特性的STL无疑是最值得C++程序员骄傲的部分。每一个C＋＋程序员都应该好好学习STL：).   </span>
				</font>
		</p>
		<p>
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">STL （Standard Template Library 标准模板库）是C＋＋标准库的一个重要组成部分，它由Stepanov and Lee等人最先开发，它是与C＋＋几乎同时开始开发的；一开始STL选择了Ada作为实现语言，但Ada有点不争气，最后他们选择了C＋＋，一个原因了， C＋＋中已经有了模板。在后来，STL又被添加进了C＋＋库。1996年，惠普公司又免费公开了STL，为STL的推广做了很大的贡献。</span>
				</font>
		</p>
		<p>
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">STL大体上包括container（容器）、algorithm（算法）和iterator（迭代器），容器和算法通过迭代器可以进行无缝连接。  </span>
				</font>
		</p>
		<p>
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">STL体现了<span class="GramE">范</span>型编程的思想，它具有高度的可重用性，高性能，高移植性。程序员不用思考具体实现过程，只要能够熟练的应用就OK了。（有兴趣研究具体实现的，可以看侯捷老师编著的《STL源码剖析》）这样他们就可以把精力放在程序开发的别的方面。</span>
				</font>
		</p>
		<p>
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">我非常佩服创造STL的那些计算机和数学精英。因为他们做了一件非常辛苦的事情―<span class="GramE">――</span>抽 象概念。而STL就是通过把容器抽象为统一的接口，算法利用这个接口，通过迭代器来操纵容器。因为接口不变，实现的容器可以随意更改。这样，就为编程、调 试和扩展提供了便利。也许有一天，我们生产软件的时候也可以想DIY一台PC一样简单，只要拿来相应的实现模块，通过简单的拼装和调试就可以创造一个软 件。这是多么令人兴奋的一件事^_^.不过，到时候，可能会有很多程序员失业了。呵呵，毕竟编写<span class="GramE">类库不</span>需要很多的人员。</span>
				</font>
		</p>
		<p>
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">虽然STL不是面向对象的，但，我想，每个人都会为它的创造力和高性能而感到兴奋和折服。</span>
				</font>
		</p>
		<p>
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
								<strong>一、容器  </strong>
								<br />作为STL的最主要组成部分－－容器，分为向量（vector），双端队列(deque)，表(list)，队列（queue），堆栈(stack)，集合(set)，多重集合(multiset)，映射(map)，多重映射(multimap)。</span>
				</font>
		</p>
		<table class="MsoTableGrid" cellspacing="0" cellpadding="0" width="500" border="1">
				<tbody>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="green">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">容器<span lang="EN-US">     </span></span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="green">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">特性</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="green">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">所在头文件</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">向量vector</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">可以用常数时间访问和修改任意元素，在序列尾部进行插入和删除时，具有常数时间复杂度，对任意项的插入和删除就有的时间复杂度与到末尾的距离成正比，尤其对向量头的添加和删除的代价是惊人的高的</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;vector&gt;</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">双端队列deque</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">基本上与向量相同，唯一的不同是，其在序列头部插入和删除操作也具有常量时间复杂度</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;deque&gt;</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">表<span lang="EN-US">list</span></span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">对任意元素的访问与对两端的距离成正比，但对某个位置上插入和删除一个项的花费为常数时间。</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;list&gt;</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">队列queue</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">插入只可以在尾部进行，删除、检索和修改只允许从头部进行。按照先进先出的原则。</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;queue&gt;</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">堆栈stack</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">堆栈是项的有限序列，并满足序列中被删除、检索和修改的<span class="GramE">项只能</span>是最近插入序列的项。即按照后进先出的原则</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;stack&gt;</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">集合set</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 9pt; FONT-FAMILY: 宋体">由节点组成的红黑树，每个节点都包含着一个元素，节点之间以某种作用于元素对的谓词排列，没有两个不同的元素能够拥有相同的次序，具有快速查找的功能。但是它是以牺牲插入车删除操作的效率为代价的</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;set&gt;</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">多重集合multiset</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">和集合基本相同，但可以支持重复元素具有快速查找能力</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;set&gt;</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">映射map</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">由{键，值}对组成的集合，以某种作用<span class="GramE">于键对上</span>的谓词排列。具有快速查找能力</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#a6a6a6">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;map&gt;</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="119" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">多重集合multimap</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="324" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">比起映射，一个<span class="GramE">键可以</span>对应多了值。具有快速查找能力</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="147" bgcolor="#f3f3f3">
										<p class="5" style="TEXT-ALIGN: left" align="left">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">&lt;map&gt;</span>
												</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p style="TEXT-ALIGN: left" align="left">
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">考虑到不同的实际需要，更主要的是效率的需要，我们可以选择不同的容器来实现我们的程序，以此达到我们提高性能的目的。这也是用好STL的一个难点，但这也是关键。</span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
								<strong>二、算法</strong>
						</span>
						<br />
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">算 法部分主要由头文件&lt;algorithm&gt;，&lt;numeric&gt;和&lt;functional&gt;组成。&lt; algorithm&gt;是所有STL头文件中最大的一个，它是由一大堆模版函数组成的，可以认为每个函数在很大程度上都是独立的，其中常用到的功能范 围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。&lt;numeric&gt;体积很小，只包括几个在序列上面进行简单 数学运算的模板函数，包括加法和乘法在序列上的一些操作。&lt;functional&gt;中则定义了一些模板类，用以声明函数对象。</span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">STL的算法也是非常优秀的，它们大部分都是类属的，基本上都用到了C＋＋的模板来实现，这</span>
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">样，很多相似的函数就不用自己写了，只要用函数模板就OK了。</span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">我们使用算法的时候，要针对不同的容器，比如：对集合的查找，最好不要用通用函数find（<span class="GramE">）</span>，它对集合使用的时候，性能非常的差，最好用集合自带的find（<span class="GramE">）</span>函数，它针对了集合进行了优化，性能非常的高。</span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
								<strong>三、迭代器</strong>
						</span>
						<br />
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">它的具体实现在&lt;itertator&gt; 中，我们完全可以不管迭代器类是怎么实现的，大多数的时候，把它理解为指针是没有问题的（指针是迭代器的一个特例，它也属于迭代器），但是，决不能完全这么做。</span>
				</font>
		</p>
		<table class="5" cellspacing="0" cellpadding="0" width="500" border="1">
				<tbody>
						<tr>
								<td class="Normal" valign="top" bgcolor="green" colspan="3">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">迭代<span class="GramE">器功能</span></span>
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">（<span lang="EN-US">Abilities Of <span class="SpellE">Iterator</span><span class="SpellE">Gategories</span>）</span></span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="129" bgcolor="#b3b3b3">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">输入迭代器</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Input <span class="SpellE">iterator</span></span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="179" bgcolor="#d9d9d9">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">向前读</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Reads forward</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="184" bgcolor="#f3f3f3">
										<p>
												<font size="4">
														<span class="5">
																<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">istream</span>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="129" bgcolor="#b3b3b3">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">输出迭代器</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Output <span class="SpellE">iterator</span></span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="179" bgcolor="#d9d9d9">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">向前写</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Writes forward</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="184" bgcolor="#f3f3f3">
										<p>
												<font size="4">
														<span class="5">
																<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">ostream,inserter</span>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="129" bgcolor="#b3b3b3">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">前向迭代器</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Forward <span class="SpellE">iterator</span></span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="179" bgcolor="#d9d9d9">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">向前读写</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Read and Writes forward</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="184" bgcolor="#f3f3f3">
										<font size="4">  </font>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="129" bgcolor="#b3b3b3">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">双向迭代器</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Bidirectional <span class="SpellE">iterator</span></span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="179" bgcolor="#d9d9d9">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">向前向后读写</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Read and Writes forward and</span>
												</font>
										</p>
										<p>
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">backward</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="184" bgcolor="#f3f3f3">
										<p>
												<font size="4">
														<span class="5">
																<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">list,set,multiset,map,mul</span>
														</span>
												</font>
										</p>
										<p>
												<font size="4">
														<span class="SpellE">
																<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">timap</span>
														</span>
												</font>
										</p>
								</td>
						</tr>
						<tr>
								<td class="Normal" valign="top" width="129" bgcolor="#b3b3b3">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">随机迭代器</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Random access <span class="SpellE">iterator</span></span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="179" bgcolor="#d9d9d9">
										<p class="5">
												<font size="4">
														<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">随机读写</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">Read and Write with random</span>
												</font>
										</p>
										<p class="5">
												<font size="4">
														<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">access</span>
												</font>
										</p>
								</td>
								<td class="Normal" valign="top" width="184" bgcolor="#f3f3f3">
										<p>
												<font size="4">
														<span class="SpellE">
																<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">vector,deque,array,string</span>
														</span>
												</font>
										</p>
								</td>
						</tr>
				</tbody>
		</table>
		<p style="TEXT-ALIGN: left" align="left">
				<font size="4">
						<span style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">  每种容器不是万能的，不能一好百好。比如说，多集在查找方面的优势是其他序列容器不可比拟的。<span lang="EN-US">  还有，最好不要试图超越STL，因为：</span></span>
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">
								<br />1、STL实现使用的是最佳算法。它是几乎完美的。 <br />2、STL实现的设计者通常是相应领域的专家。 <br />3、各领域的专家致力于提供灵活的、强大和高效的库。这是他们的首要的任务。对于，我们这些其余的人，开发可重用的容器和算法顶多只算第二个目标。我们的首要任务是交付紧扣主题的应用程序。大多数情况下，我们没有时间和专门的技术去和那些专家相比。</span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font size="4">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">但 是，超越STL不是不可能的。但是一般情况下，你只能靠牺牲可移植性来提高性能，这对于很多情况来说是很不好的。为了，超越STL，我们要付出非常大的努 力。而且，最好我们知道一些STL专家们不知道的东西，尔后我们可以有针对性的进行优化，否则，我们的努力完全有可能白费。 </span>
				</font>
		</p>
		<p style="TEXT-ALIGN: left" align="left">
				<font size="4">
						<span lang="EN-US" style="FONT-SIZE: 10pt; FONT-FAMILY: 宋体">面对这样一个优秀的库，并且它是免费的。我们C++程序员没有理由拒绝它，甚至去自己开发一个库。</span>
				</font>
		</p> <br /><img src ="http://www.cppblog.com/mydriverc/aggbug/31588.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/mydriverc/" target="_blank">旅途</a> 2007-09-05 01:22 <a href="http://www.cppblog.com/mydriverc/articles/31588.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>