﻿<?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++博客-dead-horse-随笔分类-STL读书笔记</title><link>http://www.cppblog.com/dead-horse/category/17049.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 07 Jun 2011 17:31:24 GMT</lastBuildDate><pubDate>Tue, 07 Jun 2011 17:31:24 GMT</pubDate><ttl>60</ttl><item><title>STL算法（STL源码剖析）</title><link>http://www.cppblog.com/dead-horse/archive/2011/06/08/118017.html</link><dc:creator>dead_horse</dc:creator><author>dead_horse</author><pubDate>Tue, 07 Jun 2011 17:06:00 GMT</pubDate><guid>http://www.cppblog.com/dead-horse/archive/2011/06/08/118017.html</guid><wfw:comment>http://www.cppblog.com/dead-horse/comments/118017.html</wfw:comment><comments>http://www.cppblog.com/dead-horse/archive/2011/06/08/118017.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dead-horse/comments/commentRss/118017.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dead-horse/services/trackbacks/118017.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;lower_bound&amp;upper_bound是二分查找的一种版本，在已排序的区间中寻找可插入value的第一个位置和第一个不小于value的位置。<br />&nbsp;&nbsp;&nbsp;lower_bound的实现（forward_iteratror版本，其random_access_iterator版本不需要用distance函数，直接用+）：<br /></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ForwardIterator,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Distance</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />ForwardIterator&nbsp;__lower_bound(ForwardIterator&nbsp;first,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ForwardIterator&nbsp;last,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;value,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Distance</span><span style="color: #000000">*</span><span style="color: #000000">,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forward_iterator_tag)<br /><img id="Codehighlighter1_217_539_Open_Image" onclick="this.style.display='none'; Codehighlighter1_217_539_Open_Text.style.display='none'; Codehighlighter1_217_539_Closed_Image.style.display='inline'; Codehighlighter1_217_539_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_217_539_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_217_539_Closed_Text.style.display='none'; Codehighlighter1_217_539_Open_Image.style.display='inline'; Codehighlighter1_217_539_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_217_539_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_217_539_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Distance&nbsp;len</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;distance(first,&nbsp;last,&nbsp;len);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">求整个区间的长度</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Distance&nbsp;half;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ForwardIterator&nbsp;middle;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(len</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img id="Codehighlighter1_333_522_Open_Image" onclick="this.style.display='none'; Codehighlighter1_333_522_Open_Text.style.display='none'; Codehighlighter1_333_522_Closed_Image.style.display='inline'; Codehighlighter1_333_522_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_333_522_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_333_522_Closed_Text.style.display='none'; Codehighlighter1_333_522_Open_Image.style.display='inline'; Codehighlighter1_333_522_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_333_522_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_333_522_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;half</span><span style="color: #000000">=</span><span style="color: #000000">len</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">除以二</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;middle</span><span style="color: #000000">=</span><span style="color: #000000">first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;advance(middle,&nbsp;half);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">middle指向中间位置</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">*</span><span style="color: #000000">middle</span><span style="color: #000000">&lt;</span><span style="color: #000000">value)<br /><img id="Codehighlighter1_436_499_Open_Image" onclick="this.style.display='none'; Codehighlighter1_436_499_Open_Text.style.display='none'; Codehighlighter1_436_499_Closed_Image.style.display='inline'; Codehighlighter1_436_499_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_436_499_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_436_499_Closed_Text.style.display='none'; Codehighlighter1_436_499_Open_Image.style.display='inline'; Codehighlighter1_436_499_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_436_499_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_436_499_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;middle;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len</span><span style="color: #000000">=</span><span style="color: #000000">len</span><span style="color: #000000">-</span><span style="color: #000000">half</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">修正len</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len</span><span style="color: #000000">=</span><span style="color: #000000">half;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />upper_bound的实现（forward_iterator版本）：<br /><br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ForwardIterator,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Distance</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />ForwardIterator&nbsp;__lower_bound(ForwardIterator&nbsp;first,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ForwardIterator&nbsp;last,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;value,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Distance</span><span style="color: #000000">*</span><span style="color: #000000">,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;forward_iterator_tag)<br /><img id="Codehighlighter1_217_547_Open_Image" onclick="this.style.display='none'; Codehighlighter1_217_547_Open_Text.style.display='none'; Codehighlighter1_217_547_Closed_Image.style.display='inline'; Codehighlighter1_217_547_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_217_547_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_217_547_Closed_Text.style.display='none'; Codehighlighter1_217_547_Open_Image.style.display='inline'; Codehighlighter1_217_547_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_217_547_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_217_547_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Distance&nbsp;len</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;distance(first,&nbsp;last,&nbsp;len);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">求整个区间的长度</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Distance&nbsp;half;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;ForwardIterator&nbsp;middle;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(len</span><span style="color: #000000">&gt;</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img id="Codehighlighter1_333_530_Open_Image" onclick="this.style.display='none'; Codehighlighter1_333_530_Open_Text.style.display='none'; Codehighlighter1_333_530_Closed_Image.style.display='inline'; Codehighlighter1_333_530_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_333_530_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_333_530_Closed_Text.style.display='none'; Codehighlighter1_333_530_Open_Image.style.display='inline'; Codehighlighter1_333_530_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_333_530_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_333_530_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;half</span><span style="color: #000000">=</span><span style="color: #000000">len</span><span style="color: #000000">&gt;&gt;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">除以二</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;middle</span><span style="color: #000000">=</span><span style="color: #000000">first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;advance(middle,&nbsp;half);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">middle指向中间位置</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(value</span><span style="color: #000000">&lt;*</span><span style="color: #000000">middle)<br /><img id="Codehighlighter1_436_453_Open_Image" onclick="this.style.display='none'; Codehighlighter1_436_453_Open_Text.style.display='none'; Codehighlighter1_436_453_Closed_Image.style.display='inline'; Codehighlighter1_436_453_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_436_453_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_436_453_Closed_Text.style.display='none'; Codehighlighter1_436_453_Open_Image.style.display='inline'; Codehighlighter1_436_453_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_436_453_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_436_453_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len</span><span style="color: #000000">=</span><span style="color: #000000">half;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br /><img id="Codehighlighter1_464_527_Open_Image" onclick="this.style.display='none'; Codehighlighter1_464_527_Open_Text.style.display='none'; Codehighlighter1_464_527_Closed_Image.style.display='inline'; Codehighlighter1_464_527_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_464_527_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_464_527_Closed_Text.style.display='none'; Codehighlighter1_464_527_Open_Image.style.display='inline'; Codehighlighter1_464_527_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_464_527_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_464_527_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;middle;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;len</span><span style="color: #000000">=</span><span style="color: #000000">len</span><span style="color: #000000">-</span><span style="color: #000000">half</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">修正len</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />&nbsp;&nbsp;&nbsp;upper_bound和lower_bound的区别在于取等号时的做法。upper_bound将等号放在大于号一起处理，lower_bound则相反，因此两者最终得到的结果也不同。binary_search（）可以通过lower_bound得到。<br /><br />排序算法（重点）：<br />&nbsp;&nbsp;&nbsp;partial_sort：将一个区间内的前N个元素进行排序。<br />&nbsp;&nbsp;&nbsp;方法：堆排序：（从小到大排序）先将前N个元素make_heap，生成一个max_heap，然后对N+1~size的元素与max_heap的顶依次比较，如果比堆顶元素小，则交换两元素位置，再对堆进行重排。循环过后再对堆进行sort_heap。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">make_heap(first,&nbsp;middle);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">(RandomAccessIterator&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;middle;&nbsp;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">last;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">i)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">只能是随机迭代器</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">*</span><span style="color: #000000">i</span><span style="color: #000000">&lt;*</span><span style="color: #000000">first)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__pop_heap(first,&nbsp;middle,&nbsp;i&nbsp;,T(</span><span style="color: #000000">*</span><span style="color: #000000">i),&nbsp;dfistance_type(first));<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;sort_heap(first,&nbsp;middle);</span></div>
<br />&nbsp;&nbsp;&nbsp;sort：对所给区间进行排序。<br />&nbsp;&nbsp;&nbsp;方法：快速排序（改进版），改进方法：结合插入排序、采用三点中值法选区pivot，使用内省式排序（在结合插入排序、三点中值法的同时，检测如果递归次数达到限定次数时，改为使用堆排序，防止出现二次的时间效率。）<br />&nbsp;&nbsp;&nbsp;sort接受两个随机迭代器作为参数（只有随机迭代器能够使用sort）<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">inline&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;sort(RandomAccessIterator&nbsp;first,&nbsp;RandomAccessIterator&nbsp;last)<br /><img id="Codehighlighter1_72_241_Open_Image" onclick="this.style.display='none'; Codehighlighter1_72_241_Open_Text.style.display='none'; Codehighlighter1_72_241_Closed_Image.style.display='inline'; Codehighlighter1_72_241_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_72_241_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_72_241_Closed_Text.style.display='none'; Codehighlighter1_72_241_Open_Image.style.display='inline'; Codehighlighter1_72_241_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_72_241_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_72_241_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(first&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;last)<br /><img id="Codehighlighter1_94_239_Open_Image" onclick="this.style.display='none'; Codehighlighter1_94_239_Open_Text.style.display='none'; Codehighlighter1_94_239_Closed_Image.style.display='inline'; Codehighlighter1_94_239_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_94_239_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_94_239_Closed_Text.style.display='none'; Codehighlighter1_94_239_Open_Image.style.display='inline'; Codehighlighter1_94_239_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_94_239_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_94_239_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__introsort_loop(first,&nbsp;last,&nbsp;value_type(first)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">内省式排序</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__lg(last</span><span style="color: #000000">-</span><span style="color: #000000">first)</span><span style="color: #000000">*</span><span style="color: #000000">2</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__final_insertion_sort(first,&nbsp;last);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">最终进行一次插入排序</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />&nbsp;&nbsp;&nbsp;__lg()用来控制最多的递归次数,找出2^k&lt;n的最大K。当个数为40时，得到5。5*2=10为最多允许分割层数。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Size</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />inline&nbsp;Size&nbsp;__lg(size&nbsp;n)<br /><img id="Codehighlighter1_46_95_Open_Image" onclick="this.style.display='none'; Codehighlighter1_46_95_Open_Text.style.display='none'; Codehighlighter1_46_95_Closed_Image.style.display='inline'; Codehighlighter1_46_95_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_46_95_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_46_95_Closed_Text.style.display='none'; Codehighlighter1_46_95_Open_Image.style.display='inline'; Codehighlighter1_46_95_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_46_95_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_46_95_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Size&nbsp;k;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(k</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;n</span><span style="color: #000000">&gt;</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;n</span><span style="color: #000000">&gt;&gt;=</span><span style="color: #000000">1</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">k;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;k;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span></div>
<br />&nbsp;&nbsp;&nbsp;&nbsp;
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;__introsort_loop(RandomAccessIterator&nbsp;first,&nbsp;RandomAccessIterator&nbsp;last.<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T</span><span style="color: #000000">*</span><span style="color: #000000">,&nbsp;Size&nbsp;depth_limit)<br /><img id="Codehighlighter1_106_555_Open_Image" onclick="this.style.display='none'; Codehighlighter1_106_555_Open_Text.style.display='none'; Codehighlighter1_106_555_Closed_Image.style.display='inline'; Codehighlighter1_106_555_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_106_555_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_106_555_Closed_Text.style.display='none'; Codehighlighter1_106_555_Open_Image.style.display='inline'; Codehighlighter1_106_555_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_106_555_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_106_555_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(last</span><span style="color: #000000">-</span><span style="color: #000000">first</span><span style="color: #000000">&gt;</span><span style="color: #000000">__stl_threshold)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">__stl_threshold=const&nbsp;int&nbsp;16</span><span style="color: #008000"><br /><img id="Codehighlighter1_175_553_Open_Image" onclick="this.style.display='none'; Codehighlighter1_175_553_Open_Text.style.display='none'; Codehighlighter1_175_553_Closed_Image.style.display='inline'; Codehighlighter1_175_553_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_175_553_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_175_553_Closed_Text.style.display='none'; Codehighlighter1_175_553_Open_Image.style.display='inline'; Codehighlighter1_175_553_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top"></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_175_553_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_175_553_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(depth_limit</span><span style="color: #000000">==</span><span style="color: #000000">0</span><span style="color: #000000">)<br /><img id="Codehighlighter1_200_264_Open_Image" onclick="this.style.display='none'; Codehighlighter1_200_264_Open_Text.style.display='none'; Codehighlighter1_200_264_Closed_Image.style.display='inline'; Codehighlighter1_200_264_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_200_264_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_200_264_Closed_Text.style.display='none'; Codehighlighter1_200_264_Open_Image.style.display='inline'; Codehighlighter1_200_264_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_200_264_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_200_264_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;partial_sort(first,&nbsp;last,&nbsp;last);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">改用heapsort</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">depth_limit;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomAccessIterator&nbsp;cut&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;__unguarded_partition(first,&nbsp;last,&nbsp;T(__median(</span><span style="color: #000000">*</span><span style="color: #000000">first,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">(first</span><span style="color: #000000">+</span><span style="color: #000000">(last</span><span style="color: #000000">-</span><span style="color: #000000">first)</span><span style="color: #000000">/</span><span style="color: #000000">2</span><span style="color: #000000">,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">(last</span><span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">)))));<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">cur为三点中值法求出来的pivot<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">右半段递归</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__introsort_loop(cut,&nbsp;last,&nbsp;value_type(first),&nbsp;depth_limit);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;last</span><span style="color: #000000">=</span><span style="color: #000000">cut;</span><span style="color: #008000">//</span><span style="color: #008000">定位到左半段再递归处理(左右共用一个depth_limit)</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />&nbsp;&nbsp;&nbsp;分割方法：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">RandomAccessIterator&nbsp;__unguarded_partition(RandomAccessIterator&nbsp;first,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RandomAccessIterator&nbsp;last,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;pivot)<br /><img id="Codehighlighter1_133_299_Open_Image" onclick="this.style.display='none'; Codehighlighter1_133_299_Open_Text.style.display='none'; Codehighlighter1_133_299_Closed_Image.style.display='inline'; Codehighlighter1_133_299_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_133_299_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_133_299_Closed_Text.style.display='none'; Codehighlighter1_133_299_Open_Image.style.display='inline'; Codehighlighter1_133_299_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_133_299_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_133_299_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #0000ff">true</span><span style="color: #000000">)<br /><img id="Codehighlighter1_149_297_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_297_Open_Text.style.display='none'; Codehighlighter1_149_297_Closed_Image.style.display='inline'; Codehighlighter1_149_297_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_149_297_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_149_297_Closed_Text.style.display='none'; Codehighlighter1_149_297_Open_Image.style.display='inline'; Codehighlighter1_149_297_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_149_297_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_149_297_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">*</span><span style="color: #000000">first&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;pivot)&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">last;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(pivot&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">last)&nbsp;</span><span style="color: #000000">--</span><span style="color: #000000">last;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">(first</span><span style="color: #000000">&lt;</span><span style="color: #000000">last))&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iter_swap(first,&nbsp;last);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<br />&nbsp;&nbsp;&nbsp;在上述步骤做完以后，变将区间内元素分成了多个元素个数少于16的子序列，这个时候就进入到母函数，然后进行最后的插入排序。<br />&nbsp;&nbsp;&nbsp;SGI STL的最后插入排序是将其分成两部分：前一部分直接调用插入排序。后一部分再重写的一段插入排序（为什么这样做？）。<img src ="http://www.cppblog.com/dead-horse/aggbug/118017.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dead-horse/" target="_blank">dead_horse</a> 2011-06-08 01:06 <a href="http://www.cppblog.com/dead-horse/archive/2011/06/08/118017.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关联式容器（2）（STL源码剖析）</title><link>http://www.cppblog.com/dead-horse/archive/2010/06/08/117350.html</link><dc:creator>dead_horse</dc:creator><author>dead_horse</author><pubDate>Mon, 07 Jun 2010 18:50:00 GMT</pubDate><guid>http://www.cppblog.com/dead-horse/archive/2010/06/08/117350.html</guid><wfw:comment>http://www.cppblog.com/dead-horse/comments/117350.html</wfw:comment><comments>http://www.cppblog.com/dead-horse/archive/2010/06/08/117350.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dead-horse/comments/commentRss/117350.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dead-horse/services/trackbacks/117350.html</trackback:ping><description><![CDATA[hashtable：<br />&nbsp;&nbsp;&nbsp;SGI STL的hashtable是用的开链法完成的。用一个vector储存一系列的指针，指向一个节点元素链表的头（节点元素自身维护了一个list）。<br />&nbsp;&nbsp;&nbsp;节点定义：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Value</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__hashtable_node<br /><img id="Codehighlighter1_47_86_Open_Image" onclick="this.style.display='none'; Codehighlighter1_47_86_Open_Text.style.display='none'; Codehighlighter1_47_86_Closed_Image.style.display='inline'; Codehighlighter1_47_86_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_47_86_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_47_86_Closed_Text.style.display='none'; Codehighlighter1_47_86_Open_Image.style.display='inline'; Codehighlighter1_47_86_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_47_86_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_47_86_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;__hashtable_node&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">next;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Value&nbsp;val;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000">;</span></div>
<br />&nbsp;&nbsp;&nbsp;迭代器摘要（没有--操作，没有逆向迭代器）：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__hashtable_iterator<br /><img id="Codehighlighter1_28_380_Open_Image" onclick="this.style.display='none'; Codehighlighter1_28_380_Open_Text.style.display='none'; Codehighlighter1_28_380_Closed_Image.style.display='inline'; Codehighlighter1_28_380_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_28_380_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_28_380_Closed_Text.style.display='none'; Codehighlighter1_28_380_Open_Image.style.display='inline'; Codehighlighter1_28_380_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_28_380_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_28_380_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://www.cppblog.com/Images/dot.gif" alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cur;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">迭代器目前节点</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;hashtable&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">ht;</span><span style="color: #008000">//</span><span style="color: #008000">保持对容器的关联</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;iterator&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">++</span><span style="color: #000000">()<br /><img id="Codehighlighter1_109_378_Open_Image" onclick="this.style.display='none'; Codehighlighter1_109_378_Open_Text.style.display='none'; Codehighlighter1_109_378_Closed_Image.style.display='inline'; Codehighlighter1_109_378_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_109_378_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_109_378_Closed_Text.style.display='none'; Codehighlighter1_109_378_Open_Image.style.display='inline'; Codehighlighter1_109_378_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_109_378_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_109_378_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;node&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">old&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cur;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;cur</span><span style="color: #000000">-&gt;</span><span style="color: #000000">next;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果存在结果就是它</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">cur)<br /><img id="Codehighlighter1_180_359_Open_Image" onclick="this.style.display='none'; Codehighlighter1_180_359_Open_Text.style.display='none'; Codehighlighter1_180_359_Closed_Image.style.display='inline'; Codehighlighter1_180_359_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"><img id="Codehighlighter1_180_359_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_180_359_Closed_Text.style.display='none'; Codehighlighter1_180_359_Open_Image.style.display='inline'; Codehighlighter1_180_359_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_180_359_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_180_359_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_type&nbsp;bucket&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ht</span><span style="color: #000000">-&gt;</span><span style="color: #000000">bkt_num(old</span><span style="color: #000000">-&gt;</span><span style="color: #000000">value);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">bkt_num()函数计算得到应该放到第几个&#8220;桶&#8221;</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(</span><span style="color: #000000">!</span><span style="color: #000000">cur&nbsp;</span><span style="color: #000000">&amp;&amp;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">bucket&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;ht</span><span style="color: #000000">-&gt;</span><span style="color: #000000">buckets.size())&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">跳到下一个有元素的&#8220;桶&#8221;的第一个元素</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cur&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;ht</span><span style="color: #000000">-&gt;</span><span style="color: #000000">buckets[bucket];<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">*</span><span style="color: #0000ff">this</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000">;</span></div>
<p><br />&nbsp;&nbsp;&nbsp;hashtable以质数来设计表格大小，预先计算好了28个质数，大约都是两倍的关系递增，查询28个质数中，&#8220;最接近且大于元素数目&#8221;的数字作为vector的长度，如果需要重新分配，则分配下一个质数长度的vector。<br />&nbsp;&nbsp;&nbsp;hashtable设计的容量和buckets vector的大小一样。因此如果数目超过了，就需要重新建立：新建一个temp，将原来hashtable中的元素一个一个切割出来插入到新的temp的适当位置，全部插完后交换hashtable和temp。同时释放temp的内存。<br />&nbsp;&nbsp;&nbsp;同样，hashtable的插入操作也分为insert_unique和insert_equal,分别代表不允许重复和允许重复插入。下面是不允许重复插入操作的具体实现。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;V,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;K,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;HF,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Ex,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Eq,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" alt="" />pair</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;hashtable</span><span style="color: #000000">&lt;</span><span style="color: #000000">V,&nbsp;K,&nbsp;HF,&nbsp;Ex,&nbsp;Eq,&nbsp;A</span><span style="color: #000000">&gt;</span><span style="color: #000000">::iterator,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top" alt="" />hashtable</span><span style="color: #000000">&lt;</span><span style="color: #000000">V,&nbsp;K,&nbsp;HF,&nbsp;Ex,&nbsp;Eq,&nbsp;A</span><span style="color: #000000">&gt;</span><span style="color: #000000">::insert_unique_norssize(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;value_type</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;obj)<br /><img id="Codehighlighter1_207_652_Open_Image" onclick="this.style.display='none'; Codehighlighter1_207_652_Open_Text.style.display='none'; Codehighlighter1_207_652_Closed_Image.style.display='inline'; Codehighlighter1_207_652_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_207_652_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_207_652_Closed_Text.style.display='none'; Codehighlighter1_207_652_Open_Image.style.display='inline'; Codehighlighter1_207_652_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_207_652_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_207_652_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;size_type&nbsp;n&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;bkt_num(obj);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">决定其应该插入的"桶"</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">first&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;buckets[n];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">first指向那个"桶"</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(node&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">cur</span><span style="color: #000000">=</span><span style="color: #000000">first,&nbsp;cur,&nbsp;cur</span><span style="color: #000000">=</span><span style="color: #000000">cur</span><span style="color: #000000">-&gt;</span><span style="color: #000000">next)&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果已有元素，则进入循环，没有则不进入</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">(equals(get_key(cur</span><span style="color: #000000">-&gt;</span><span style="color: #000000">value),&nbsp;get_key(obj)))&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果已存在键值相同的</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;pair</span><span style="color: #000000">&lt;</span><span style="color: #000000">iterator,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&gt;</span><span style="color: #000000">(iterator(cur,&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">不插入直接返回<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">如果无重复，则插入</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">tmp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;new_node(obj);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;temp</span><span style="color: #000000">-&gt;</span><span style="color: #000000">next&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;first;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;buckets[n]&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;tmp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">num_elements;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;pair</span><span style="color: #000000">&lt;</span><span style="color: #000000">iterator,&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&gt;</span><span style="color: #000000">(iterator(tmp,&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">),&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span></div>
<br /><br />&nbsp;&nbsp;&nbsp;hashtable有一些无法处理的型别，除非用户为那些型别写了相应的hash function。<br /><br />hash_set/hash_map：<br />&nbsp;&nbsp;&nbsp;此两个跟set/map相比较，只是插入的元素不会自动排序。其他使用方式完全一致，而操作基本全部由hashtable完成。<br /><br />hash_mulitset/hash_multimap:<br />&nbsp;&nbsp;&nbsp;和multiset/multimap比较，也只是插入元素不会自动排序。<img src ="http://www.cppblog.com/dead-horse/aggbug/117350.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dead-horse/" target="_blank">dead_horse</a> 2010-06-08 02:50 <a href="http://www.cppblog.com/dead-horse/archive/2010/06/08/117350.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关联式容器（1） （STL源码剖析）</title><link>http://www.cppblog.com/dead-horse/archive/2010/06/06/117114.html</link><dc:creator>dead_horse</dc:creator><author>dead_horse</author><pubDate>Sun, 06 Jun 2010 08:49:00 GMT</pubDate><guid>http://www.cppblog.com/dead-horse/archive/2010/06/06/117114.html</guid><wfw:comment>http://www.cppblog.com/dead-horse/comments/117114.html</wfw:comment><comments>http://www.cppblog.com/dead-horse/archive/2010/06/06/117114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dead-horse/comments/commentRss/117114.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dead-horse/services/trackbacks/117114.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;关联式容器：观念上类似关联式数据库（实际上简单很多），每个元素都有一个键值和一个实值，当元素插入到关联容器中时，容器内部结构（RB-tree或者hash-table）依照键值将其插入到适当的位置。&nbsp;&nbsp;AVL tree：一种二叉搜索树。任何节点的左右子树高度最多相差1。如果插入后平衡被破坏，则分为以下情况：1、&nbsp;插入点...&nbsp;&nbsp;<a href='http://www.cppblog.com/dead-horse/archive/2010/06/06/117114.html'>阅读全文</a><img src ="http://www.cppblog.com/dead-horse/aggbug/117114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dead-horse/" target="_blank">dead_horse</a> 2010-06-06 16:49 <a href="http://www.cppblog.com/dead-horse/archive/2010/06/06/117114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>序列式容器（2） （STL源码剖析）</title><link>http://www.cppblog.com/dead-horse/archive/2010/05/30/116720.html</link><dc:creator>dead_horse</dc:creator><author>dead_horse</author><pubDate>Sat, 29 May 2010 19:32:00 GMT</pubDate><guid>http://www.cppblog.com/dead-horse/archive/2010/05/30/116720.html</guid><wfw:comment>http://www.cppblog.com/dead-horse/comments/116720.html</wfw:comment><comments>http://www.cppblog.com/dead-horse/archive/2010/05/30/116720.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dead-horse/comments/commentRss/116720.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dead-horse/services/trackbacks/116720.html</trackback:ping><description><![CDATA[4、stack<br />&nbsp;&nbsp;&nbsp;stack是一种先进先出的数据结构。只能在栈顶操作。它以底层容器完成所有的操作，因此是一个adapter（配接器）。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Sequence&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;deque</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;stack<br /><img id="Codehighlighter1_59_597_Open_Image" onclick="this.style.display='none'; Codehighlighter1_59_597_Open_Text.style.display='none'; Codehighlighter1_59_597_Closed_Image.style.display='inline'; Codehighlighter1_59_597_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_59_597_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_59_597_Closed_Text.style.display='none'; Codehighlighter1_59_597_Open_Image.style.display='inline'; Codehighlighter1_59_597_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_59_597_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_59_597_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">下面的__STL_NULL_TMPL_ARGS可以展开成为&lt;&gt;,这样写是为了让class&nbsp;template的<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">某个具体实现与friend&nbsp;function&nbsp;template&nbsp;的某个具体实现一对一关联（VC不支持？未验证）</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;__STL_NULL_TMPL_ARGS(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;stack</span><span style="color: #000000">&amp;</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;stack</span><span style="color: #000000">&amp;</span><span style="color: #000000">):<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;</span><span style="color: #0000ff">bool</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">operator</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;__STL_NULL_TMPL_ARGS(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;stack</span><span style="color: #000000">&amp;</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;stack</span><span style="color: #000000">&amp;</span><span style="color: #000000">):<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;Sequence::value_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;Sequence::size_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;Sequence::reference&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;typename&nbsp;Sequence::const_reference&nbsp;&nbsp;cosnt_reference;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;Sequence&nbsp;c;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">利用底层容器c进行操作<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;</span></div>
&nbsp;&nbsp;&nbsp;stack还有一个特性就是没有迭代器：因为只能在栈顶进行操作，所以不必要定义迭代器，也不能遍历。<br /><br />5、queue<br />&nbsp;&nbsp;&nbsp;和stack基本一致。<br /><br />6、Heap<br />&nbsp;&nbsp;&nbsp;Heap在STL中不是实际组件，只是priority的助手。<br />&nbsp;&nbsp;&nbsp;binary heap：一种完全二叉树。可以用数组表示。如果数组的第一个元素保留（设为无穷大或者无穷西欧啊），从第二个元素开始储存，则有：对于i处的节点，其子节点必定位于2i和2i+1处，其父节点位于i/2处。（SGI STL中没有用到这个方法，因此取值方法有所改变）<br />&nbsp;&nbsp;&nbsp;heap操作：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push_heap：在heap中插入一个新值的时候，先把它插入到最后面（树中最下面一排的最后一个）。然后将它和父节点进行比较，如果其键值大于父节点的，就交换位置，如此一直上溯。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pop_heap：在heap中删除最大值的时候(其实是将最大值元素交换到heap的尾部，然后--size)。先进行交换，然后对交换后的数组进行从上往下的调整：如果子节点中最大的键值大于父节点的键值，就将他们两个交换，然后继续往下进行。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ajust_heap：上述调整方法。<br />（SGI STL使用的方法：先不进行交换，而是将父节点设为空洞，然后将空洞下层到符合的底层，再将前堆尾元素在空洞位置进行一次push_heap）<br />&nbsp;&nbsp;&nbsp;sort_heap：进行N次pop_heap，就完成了一次堆排序。<br />&nbsp;&nbsp;&nbsp;make_heap：因为所有的叶子节点都不需要调整，所以从N/2处往上进行调整。<br /><br />7、priority_queue<br />&nbsp;&nbsp;&nbsp;priority_queue是一个带有权值观念的队列，因此取出元素的时候只能取出权值最大的元素。<br />&nbsp;&nbsp;&nbsp;priority_queue完全以底层容器为根据（缺省为vector），加上heap处理规则实现。<br /><br />8、slist<br />&nbsp;&nbsp;&nbsp;slist是一个单向链表。（SGI中有实现，但是并不在STL容器中）<br />&nbsp;&nbsp;&nbsp;因为slist是单向的，因此对于获得slist的链表尾端需要进行一次完整的遍历，因而push_back操作十分费时，没有提供。<br />&nbsp;&nbsp;&nbsp;slist特点：节点和迭代器设计运用了继承关系，比list要复杂。<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__slist_node_base<br /><img id="Codehighlighter1_25_53_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_53_Open_Text.style.display='none'; Codehighlighter1_25_53_Closed_Image.style.display='inline'; Codehighlighter1_25_53_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_25_53_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_53_Closed_Text.style.display='none'; Codehighlighter1_25_53_Open_Image.style.display='inline'; Codehighlighter1_25_53_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_25_53_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_25_53_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;__slist_node_base&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">next;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />template</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__slist_node:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;__slist_node_btose<br /><img id="Codehighlighter1_125_136_Open_Image" onclick="this.style.display='none'; Codehighlighter1_125_136_Open_Text.style.display='none'; Codehighlighter1_125_136_Closed_Image.style.display='inline'; Codehighlighter1_125_136_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_125_136_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_125_136_Closed_Text.style.display='none'; Codehighlighter1_125_136_Open_Image.style.display='inline'; Codehighlighter1_125_136_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_125_136_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_125_136_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;data;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__slist_iterator_base<br /><img id="Codehighlighter1_170_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_170_326_Open_Text.style.display='none'; Codehighlighter1_170_326_Closed_Image.style.display='inline'; Codehighlighter1_170_326_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_170_326_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_170_326_Closed_Text.style.display='none'; Codehighlighter1_170_326_Open_Image.style.display='inline'; Codehighlighter1_170_326_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_170_326_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_170_326_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;size_t&nbsp;size_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;ptrdiff_t&nbsp;difference_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;forward_iterator_tag&nbsp;iterator_category;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">单向</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;__slist_node_base&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">node;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">指向节点基本结构</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" /></span><span style="color: #000000">}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T,&nbsp;typename&nbsp;Ref,&nbsp;typename&nbsp;Ptr</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__slist_iterator:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;__slist_iterator_base<br /><img id="Codehighlighter1_434_713_Open_Image" onclick="this.style.display='none'; Codehighlighter1_434_713_Open_Text.style.display='none'; Codehighlighter1_434_713_Closed_Image.style.display='inline'; Codehighlighter1_434_713_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_434_713_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_434_713_Closed_Text.style.display='none'; Codehighlighter1_434_713_Open_Image.style.display='inline'; Codehighlighter1_434_713_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_434_713_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_434_713_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__slist_iterator</span><span style="color: #000000">&lt;</span><span style="color: #000000">T,&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">,&nbsp;T</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__slist_iterator</span><span style="color: #000000">&lt;</span><span style="color: #000000">T,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">*&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const_iterator;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__slist_iterator</span><span style="color: #000000">&lt;</span><span style="color: #000000">T,&nbsp;Ref,&nbsp;Ptr</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp;value_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;Ptr&nbsp;&nbsp;&nbsp;&nbsp;pointer;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;Ref&nbsp;reference;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__slist_node</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list_node;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;</span></div>
（为什么要用继承？）<img src ="http://www.cppblog.com/dead-horse/aggbug/116720.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dead-horse/" target="_blank">dead_horse</a> 2010-05-30 03:32 <a href="http://www.cppblog.com/dead-horse/archive/2010/05/30/116720.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>序列式容器（1） （STL源码剖析）</title><link>http://www.cppblog.com/dead-horse/archive/2010/05/29/116659.html</link><dc:creator>dead_horse</dc:creator><author>dead_horse</author><pubDate>Fri, 28 May 2010 18:45:00 GMT</pubDate><guid>http://www.cppblog.com/dead-horse/archive/2010/05/29/116659.html</guid><wfw:comment>http://www.cppblog.com/dead-horse/comments/116659.html</wfw:comment><comments>http://www.cppblog.com/dead-horse/archive/2010/05/29/116659.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dead-horse/comments/commentRss/116659.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dead-horse/services/trackbacks/116659.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;所谓序列式容器：其中的元素都可序但是不一定有序。&nbsp;&nbsp;&nbsp;1、vector&nbsp;&nbsp;&nbsp;vector的实现技术，关键在于对其大小的控制以及重新配置时的数据移动效率。&nbsp;&nbsp;&nbsp;vector的迭代器实际上是普通指针。vector内部有3个iterator：start，finish，end_of...&nbsp;&nbsp;<a href='http://www.cppblog.com/dead-horse/archive/2010/05/29/116659.html'>阅读全文</a><img src ="http://www.cppblog.com/dead-horse/aggbug/116659.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dead-horse/" target="_blank">dead_horse</a> 2010-05-29 02:45 <a href="http://www.cppblog.com/dead-horse/archive/2010/05/29/116659.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>迭代器与traits技法（STL源码剖析）</title><link>http://www.cppblog.com/dead-horse/archive/2010/05/29/116654.html</link><dc:creator>dead_horse</dc:creator><author>dead_horse</author><pubDate>Fri, 28 May 2010 16:09:00 GMT</pubDate><guid>http://www.cppblog.com/dead-horse/archive/2010/05/29/116654.html</guid><wfw:comment>http://www.cppblog.com/dead-horse/comments/116654.html</wfw:comment><comments>http://www.cppblog.com/dead-horse/archive/2010/05/29/116654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dead-horse/comments/commentRss/116654.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dead-horse/services/trackbacks/116654.html</trackback:ping><description><![CDATA[<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span mce_style="font-size: small;">&nbsp; 1.迭代器</span></span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span mce_style="font-size: small;">&nbsp; 迭代器提供了一种方法，使之能够依序巡访某个容器的各个元素，而无需暴露容器的内部。</span></span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;"><span><span mce_style="font-family: Times New Roman;"><span mce_style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>STL</span></span><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的中心思想是容器和算法分开，最后再用迭代器将两者完美的融合到一起。而迭代器是实现中最关键的部分。</span></span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;&nbsp;迭代器是一种行为类似指针的对象，因此它必不可少的就是对operator*和operator -&gt;的重载。可以参考auto_ptr。</span></span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;">&nbsp;</span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp; 2.traits技法（重点）</span></span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp; 在effective C++中，条款47介绍到了traits技术。它的思想是通过提取出来某些类型的特性，然后根据它的特性进行某些操作。</span></span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp; 一种方法是通过内嵌类来表示类型的特性，然后在进行操作的时候进行判断，然而这种方法却不能对内置类型使用。因为我们不可能向内置类型加入内嵌类以表示它的特性。</span></span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp; 另一种方法表示如下（在别人blog里面看到一个类似例子，自己写了一下）：</span></span></p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&nbsp;</span></span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">#include&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">iostream</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">using</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">namespace</span><span style="color: #000000">&nbsp;std;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_45_61_Open_Image" onclick="this.style.display='none'; Codehighlighter1_45_61_Open_Text.style.display='none'; Codehighlighter1_45_61_Closed_Image.style.display='inline'; Codehighlighter1_45_61_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_45_61_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_45_61_Closed_Text.style.display='none'; Codehighlighter1_45_61_Open_Image.style.display='inline'; Codehighlighter1_45_61_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_45_61_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_45_61_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;下面两个空结构用来表示&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_74_75_Open_Image" onclick="this.style.display='none'; Codehighlighter1_74_75_Open_Text.style.display='none'; Codehighlighter1_74_75_Closed_Image.style.display='inline'; Codehighlighter1_74_75_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_74_75_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_74_75_Closed_Text.style.display='none'; Codehighlighter1_74_75_Open_Image.style.display='inline'; Codehighlighter1_74_75_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;hot</span><span id="Codehighlighter1_74_75_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_74_75_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br /><img id="Codehighlighter1_92_93_Open_Image" onclick="this.style.display='none'; Codehighlighter1_92_93_Open_Text.style.display='none'; Codehighlighter1_92_93_Closed_Image.style.display='inline'; Codehighlighter1_92_93_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_92_93_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_92_93_Closed_Text.style.display='none'; Codehighlighter1_92_93_Open_Image.style.display='inline'; Codehighlighter1_92_93_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;not_hot</span><span id="Codehighlighter1_92_93_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_92_93_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_100_123_Open_Image" onclick="this.style.display='none'; Codehighlighter1_100_123_Open_Text.style.display='none'; Codehighlighter1_100_123_Closed_Image.style.display='inline'; Codehighlighter1_100_123_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_100_123_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_100_123_Closed_Text.style.display='none'; Codehighlighter1_100_123_Open_Image.style.display='inline'; Codehighlighter1_100_123_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_100_123_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_100_123_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;traits用来提取模版参数T的特性&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;traits_taste<br /><img id="Codehighlighter1_168_204_Open_Image" onclick="this.style.display='none'; Codehighlighter1_168_204_Open_Text.style.display='none'; Codehighlighter1_168_204_Closed_Image.style.display='inline'; Codehighlighter1_168_204_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_168_204_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_168_204_Closed_Text.style.display='none'; Codehighlighter1_168_204_Open_Image.style.display='inline'; Codehighlighter1_168_204_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_168_204_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_168_204_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;T::taste&nbsp;taste;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_211_228_Open_Image" onclick="this.style.display='none'; Codehighlighter1_211_228_Open_Text.style.display='none'; Codehighlighter1_211_228_Closed_Image.style.display='inline'; Codehighlighter1_211_228_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_211_228_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_211_228_Closed_Text.style.display='none'; Codehighlighter1_211_228_Open_Image.style.display='inline'; Codehighlighter1_211_228_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_211_228_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_211_228_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;在类里面要定义自身的特性&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Hunan<br /><img id="Codehighlighter1_243_273_Open_Image" onclick="this.style.display='none'; Codehighlighter1_243_273_Open_Text.style.display='none'; Codehighlighter1_243_273_Closed_Image.style.display='inline'; Codehighlighter1_243_273_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_243_273_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_243_273_Closed_Text.style.display='none'; Codehighlighter1_243_273_Open_Image.style.display='inline'; Codehighlighter1_243_273_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_243_273_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_243_273_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;hot&nbsp;taste;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Guangdong<br /><img id="Codehighlighter1_292_326_Open_Image" onclick="this.style.display='none'; Codehighlighter1_292_326_Open_Text.style.display='none'; Codehighlighter1_292_326_Closed_Image.style.display='inline'; Codehighlighter1_292_326_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_292_326_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_292_326_Closed_Text.style.display='none'; Codehighlighter1_292_326_Open_Image.style.display='inline'; Codehighlighter1_292_326_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_292_326_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_292_326_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;not_hot&nbsp;taste;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_334_388_Open_Image" onclick="this.style.display='none'; Codehighlighter1_334_388_Open_Text.style.display='none'; Codehighlighter1_334_388_Closed_Image.style.display='inline'; Codehighlighter1_334_388_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_334_388_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_334_388_Closed_Text.style.display='none'; Codehighlighter1_334_388_Open_Image.style.display='inline'; Codehighlighter1_334_388_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_334_388_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_334_388_Open_Text"><span style="color: #008000">/*</span><span style="color: #008000">&nbsp;food函数用traits_taste将模板参数T的特征提取出来，交由food_aux根据特征执行&nbsp;</span><span style="color: #008000">*/</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">typename&nbsp;T</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;food_aux(T&nbsp;pro,&nbsp;not_hot)<br /><img id="Codehighlighter1_447_501_Open_Image" onclick="this.style.display='none'; Codehighlighter1_447_501_Open_Text.style.display='none'; Codehighlighter1_447_501_Closed_Image.style.display='inline'; Codehighlighter1_447_501_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_447_501_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_447_501_Closed_Text.style.display='none'; Codehighlighter1_447_501_Open_Image.style.display='inline'; Codehighlighter1_447_501_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_447_501_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_447_501_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Food&nbsp;in&nbsp;this&nbsp;province&nbsp;is&nbsp;not_hot!</span><span style="color: #000000">"</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">endl;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br /><img id="Codehighlighter1_518_609_Open_Image" onclick="this.style.display='none'; Codehighlighter1_518_609_Open_Text.style.display='none'; Codehighlighter1_518_609_Closed_Image.style.display='inline'; Codehighlighter1_518_609_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_518_609_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_518_609_Closed_Text.style.display='none'; Codehighlighter1_518_609_Open_Image.style.display='inline'; Codehighlighter1_518_609_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_518_609_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_518_609_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Hunan:</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;food(Hunan());<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">Guangdong:</span><span style="color: #000000">"</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;food(Guangdong());<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p mce_style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p mce_style="MARGIN: 0cm 0cm 0pt"><span mce_style="font-size: small;"><span mce_style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这种方式通过把类的traits信息放到类的外部，从而可以通过偏特化将内置类型的traits融入进去。</span></span><span mce_style="font-size: small;">
</span></p><p mce_style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p mce_style="MARGIN: 0cm 0cm 0pt">&nbsp;在STL中，迭代器对应的traits类为iterator_traits</p>
<p mce_style="MARGIN: 0cm 0cm 0pt"></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;I</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;iterator_traits<br /><img id="Codehighlighter1_42_283_Open_Image" onclick="this.style.display='none'; Codehighlighter1_42_283_Open_Text.style.display='none'; Codehighlighter1_42_283_Closed_Image.style.display='inline'; Codehighlighter1_42_283_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_42_283_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_42_283_Closed_Text.style.display='none'; Codehighlighter1_42_283_Open_Image.style.display='inline'; Codehighlighter1_42_283_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_42_283_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_42_283_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;I::iterator_category&nbsp;iterator_category;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;I::value_type&nbsp;&nbsp;value_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;I::difference_type&nbsp;difference_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;I::pointer&nbsp;&nbsp;pointer;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;I::reference&nbsp;&nbsp;reference;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;&nbsp;</span></div>
<p mce_style="MARGIN: 0cm 0cm 0pt">为了能够表示内置类型如int *, const int *等的特性，所以要设计相应的特化版本。下例是I*的特化。</p>

<p>&nbsp;</p>
<p mce_style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;I</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;iterator_traits</span><span style="color: #000000">&lt;</span><span style="color: #000000">I</span><span style="color: #000000">*&gt;</span><span style="color: #000000"><br /><img id="Codehighlighter1_46_249_Open_Image" onclick="this.style.display='none'; Codehighlighter1_46_249_Open_Text.style.display='none'; Codehighlighter1_46_249_Closed_Image.style.display='inline'; Codehighlighter1_46_249_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_46_249_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_46_249_Closed_Text.style.display='none'; Codehighlighter1_46_249_Open_Image.style.display='inline'; Codehighlighter1_46_249_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_46_249_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_46_249_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;random_access_iterator_tag&nbsp;iterator_category;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;I&nbsp;&nbsp;&nbsp;value_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;ptrdiff_t&nbsp;&nbsp;difference_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;I</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;pointer;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;I</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;&nbsp;&nbsp;reference;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;</span></div>
<p mce_style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<p mce_style="MARGIN: 0cm 0cm 0pt">从此可以看出，在设计迭代器的时候一定要提供五个内嵌的相应型别。以利于traits萃取。STL提供了一个iterators class供人继承，可以保证其符合规范。</p>
<p mce_style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Category,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Distance</span><span style="color: #000000">=</span><span style="color: #000000">ptrdiff_t,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Pointer</span><span style="color: #000000">=</span><span style="color: #000000">T</span><span style="color: #000000">*</span><span style="color: #000000">,<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Referance</span><span style="color: #000000">=</span><span style="color: #000000">T</span><span style="color: #000000">&amp;&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;iterator<br /><img id="Codehighlighter1_127_323_Open_Image" onclick="this.style.display='none'; Codehighlighter1_127_323_Open_Text.style.display='none'; Codehighlighter1_127_323_Closed_Image.style.display='inline'; Codehighlighter1_127_323_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_127_323_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_127_323_Closed_Text.style.display='none'; Codehighlighter1_127_323_Open_Image.style.display='inline'; Codehighlighter1_127_323_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_127_323_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_127_323_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;Category&nbsp;&nbsp;&nbsp;iterator_category;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;T&nbsp;&nbsp;&nbsp;value_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;Distance&nbsp;&nbsp;difference_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;Pointer&nbsp;&nbsp;pointer;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;typedef&nbsp;typename&nbsp;Referance&nbsp;&nbsp;reference;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Item</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;ListIter:&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;std::iterator</span><span style="color: #000000">&lt;</span><span style="color: #000000">std::forward_iterator_tag,&nbsp;Item</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img id="Codehighlighter1_423_433_Open_Image" onclick="this.style.display='none'; Codehighlighter1_423_433_Open_Text.style.display='none'; Codehighlighter1_423_433_Closed_Image.style.display='inline'; Codehighlighter1_423_433_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_423_433_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_423_433_Closed_Text.style.display='none'; Codehighlighter1_423_433_Open_Image.style.display='inline'; Codehighlighter1_423_433_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_423_433_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_423_433_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p mce_style="MARGIN: 0cm 0cm 0pt">&nbsp;</p>
3. __type_traits<br />
<p mce_style="MARGIN: 0cm 0cm 0pt">这个是SGI内部的，不在STL标准内。用来萃取性别的特性。<br />先定义两个空结构体，用来标识true和false。</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Codehighlighter1_18_19_Open_Image" onclick="this.style.display='none'; Codehighlighter1_18_19_Open_Text.style.display='none'; Codehighlighter1_18_19_Closed_Image.style.display='inline'; Codehighlighter1_18_19_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_18_19_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_18_19_Closed_Text.style.display='none'; Codehighlighter1_18_19_Open_Image.style.display='inline'; Codehighlighter1_18_19_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__true_type</span><span id="Codehighlighter1_18_19_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_18_19_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;<br /><img id="Codehighlighter1_41_42_Open_Image" onclick="this.style.display='none'; Codehighlighter1_41_42_Open_Text.style.display='none'; Codehighlighter1_41_42_Closed_Image.style.display='inline'; Codehighlighter1_41_42_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_41_42_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_41_42_Closed_Text.style.display='none'; Codehighlighter1_41_42_Open_Image.style.display='inline'; Codehighlighter1_41_42_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__false_type</span><span id="Codehighlighter1_41_42_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_41_42_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000">;</span></div>
<p mce_style="MARGIN: 0cm 0cm 0pt">__type_traits内则定义一些typedefs，其值为__true_type或者__false_type<br /></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;type</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">struct</span><span style="color: #000000">&nbsp;__type_traits<br /><img id="Codehighlighter1_42_290_Open_Image" onclick="this.style.display='none'; Codehighlighter1_42_290_Open_Text.style.display='none'; Codehighlighter1_42_290_Closed_Image.style.display='inline'; Codehighlighter1_42_290_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_42_290_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_42_290_Closed_Text.style.display='none'; Codehighlighter1_42_290_Open_Image.style.display='inline'; Codehighlighter1_42_290_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_42_290_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_42_290_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__false_type&nbsp;has_trivial_default_constructor;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__false_type&nbsp;has_trivial_copy_constructor;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__false_type&nbsp;has_trivial_assignment_constructor;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__false_type&nbsp;has_trivial_destructor;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;__false_type&nbsp;is_POD_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;</span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/dead-horse/aggbug/116654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dead-horse/" target="_blank">dead_horse</a> 2010-05-29 00:09 <a href="http://www.cppblog.com/dead-horse/archive/2010/05/29/116654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SGI STL空间配置器（STL源码剖析）</title><link>http://www.cppblog.com/dead-horse/archive/2010/05/28/116649.html</link><dc:creator>dead_horse</dc:creator><author>dead_horse</author><pubDate>Fri, 28 May 2010 15:04:00 GMT</pubDate><guid>http://www.cppblog.com/dead-horse/archive/2010/05/28/116649.html</guid><wfw:comment>http://www.cppblog.com/dead-horse/comments/116649.html</wfw:comment><comments>http://www.cppblog.com/dead-horse/archive/2010/05/28/116649.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/dead-horse/comments/commentRss/116649.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/dead-horse/services/trackbacks/116649.html</trackback:ping><description><![CDATA[<p>空间配置器的标准接口(根据STL规范)</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">allocator::value_type<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::pointer<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::const_pointer<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::reference<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::const_reference<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::size_type<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::difference_type<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::rebind&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">一个嵌套的类模板</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::allocator()<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />allocator::allocator(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;allocator</span><span style="color: #000000">&amp;</span><span style="color: #000000">)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;U</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;allocator::allocator(</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;allocator</span><span style="color: #000000">&lt;</span><span style="color: #000000">U</span><span style="color: #000000">&gt;&amp;</span><span style="color: #000000">)&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">泛化的拷贝构造函数&nbsp;</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000">allocator::</span><span style="color: #000000">~</span><span style="color: #000000">allocator()<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />pointer&nbsp;allocator::address(reference&nbsp;x)&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">返回某个对象的地址.&nbsp;&nbsp;a.address(x)&nbsp;等于&nbsp;&amp;x</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />const_pointer&nbsp;allocator::address(const_reference&nbsp;x)&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">同上.&nbsp;返回一个const对象的地址</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />pointer&nbsp;allocator::allocate(size_type&nbsp;n,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">分配空间,&nbsp;足以存储n个T对象</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;allocator::deallocate(pointer&nbsp;p,&nbsp;size_type&nbsp;n)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">释放空间</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />size_type&nbsp;allocator::max_size()&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">返回可成功分配的最大量</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;allocator::construct(pointer&nbsp;p&nbsp;,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;x)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">负责构造&nbsp;相当于&nbsp;new&nbsp;((const&nbsp;void*)p)&nbsp;T(x)</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;allocator::destroy(pointer&nbsp;p)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #008000">//</span><span style="color: #008000">负责析构&nbsp;相当于&nbsp;p-&gt;~T()<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>SGI STL 的配置器与众不同， 名称是alloc而不是allocator， 而且不接受任何参数。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;,&nbsp;std::allocator</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iv;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">in&nbsp;VC&nbsp;or&nbsp;CB</span><span style="color: #008000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />vector</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;,&nbsp;std::alloc&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;iv;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">in&nbsp;GCC<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>但是通常都是使用默认的空间配置器，而SGI STL已经为每一个容器都指定了缺省的空间配置器。所以使用的时候无太大区别。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Alloc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;alloc</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_52_60_Open_Image" onclick="this.style.display='none'; Codehighlighter1_52_60_Open_Text.style.display='none'; Codehighlighter1_52_60_Closed_Image.style.display='inline'; Codehighlighter1_52_60_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_52_60_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_52_60_Closed_Text.style.display='none'; Codehighlighter1_52_60_Open_Image.style.display='inline'; Codehighlighter1_52_60_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;vector</span><span id="Codehighlighter1_52_60_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_52_60_Open_Text"><span style="color: #000000">{<img style="width: 15px; height: 20px" height="20" src="http://www.cppblog.com/Images/dot.gif" width="15"  alt="" />&nbsp;<img src="http://www.cppblog.com/Images/dot.gif"  alt="" />}</span></span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">缺省使用alloc<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</p>
<p>SGI空间配置器分析：</p>
<p>C++的new操作符和delete操作符进行内存配置时，new：先配置内存，然后构造对象。delete：先析构对象，然后释放内存。SGI STL将内存配置、释放内存与构造、析构分开。前者由&lt;stl_alloc.h&gt;中的allocate()和deallocate()负责，后者由&lt;stl_construct.h&gt;中的construct()和destroy()负责。 这两个头文件包含于&lt;memory&gt;中（STL标准规定，配置器定义在memory中）。同时&lt;memory&gt;还包含了一个文件&lt;stl_unitialized.h&gt;，定义了一些全局函数用来填充、复制大块内存数据。</p>
<p>&nbsp;</p>
<p>1.构造和析构。</p>
<p>构造：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T1,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T2</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_75_139_Open_Image" onclick="this.style.display='none'; Codehighlighter1_75_139_Open_Text.style.display='none'; Codehighlighter1_75_139_Closed_Image.style.display='inline'; Codehighlighter1_75_139_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_75_139_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_75_139_Closed_Text.style.display='none'; Codehighlighter1_75_139_Open_Image.style.display='inline'; Codehighlighter1_75_139_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top">inline&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;construct(T1&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">p,&nbsp;</span><span style="color: #0000ff">const</span><span style="color: #000000">&nbsp;T2</span><span style="color: #000000">&amp;</span><span style="color: #000000">&nbsp;value)</span><span id="Codehighlighter1_75_139_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_75_139_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;(p)&nbsp;T1(value);&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">此处用到placement&nbsp;new&nbsp;运算，将初始值设定到指针P所指的地方&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span></span></div>
<p><br />PS：placement new运算，并不分配内存，而是将已分配的内存调用构造函数来进行初始化。</p>
<p>析构：</p>
<p>析构函数第一个版本接受一个指针，将指针所指之物删除，可以直接调用析构函数。而第二个版本，接受两个迭代器，将其之间的所有对象全部析构。由于我们不知道这个范围的大小，有时候范围很大而每个对象的析构不是必要的，就会造成浪费。因此需要进行一个判断，根据得到的结果来判断是否需要析构它（判断用到了traits方法）。</p>
<p>下面是最终的析构调用情况，其中__false_type和__ture_type是两个空的struct，只用于标识，使其通过函数重载在编译的时候确定调用哪一个版本。</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ForwardIterator</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />__destroy_aux(ForwardIterator&nbsp;first,&nbsp;ForwardIterator&nbsp;last,&nbsp;__false_type)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_107_157_Open_Image" onclick="this.style.display='none'; Codehighlighter1_107_157_Open_Text.style.display='none'; Codehighlighter1_107_157_Closed_Image.style.display='inline'; Codehighlighter1_107_157_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_107_157_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_107_157_Closed_Text.style.display='none'; Codehighlighter1_107_157_Open_Image.style.display='inline'; Codehighlighter1_107_157_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_107_157_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_107_157_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">for</span><span style="color: #000000">(;&nbsp;first</span><span style="color: #000000">&lt;</span><span style="color: #000000">last;&nbsp;</span><span style="color: #000000">++</span><span style="color: #000000">first)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />destroy(</span><span style="color: #000000">&amp;*</span><span style="color: #000000">first);<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />template</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ForwardIterator</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />__destroy_aux(ForwardIterator&nbsp;first,&nbsp;ForwardIterator&nbsp;last,&nbsp;__ture_type)<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img id="Codehighlighter1_267_268_Open_Image" onclick="this.style.display='none'; Codehighlighter1_267_268_Open_Text.style.display='none'; Codehighlighter1_267_268_Closed_Image.style.display='inline'; Codehighlighter1_267_268_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_267_268_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_267_268_Closed_Text.style.display='none'; Codehighlighter1_267_268_Open_Image.style.display='inline'; Codehighlighter1_267_268_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_267_268_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_267_268_Open_Text"><span style="color: #000000">{}</span></span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>&nbsp;同时这个析构函数对char*和wchar_t*有特化版本:将不调用他们的析构函数。（这是没有必要调用析构函数的例子么？）</p>
<p>2. 空间的配置和释放： std::alloc</p>
<p>std::alloc为了效率，设计了双层级配置器，第一级直接使用C的malloc()和free()。第二级则视配置区块的大小选择配置器，如果区块大，则直接调用第一级，如果区块过小，则采用memory pool 整理的方法。</p>
<p>SGI将其简单的包装了一个接口，simple_alloc类。使其符合STL规格。而在使用的时候全部使用的simple_alloc接口（缺省使用）。</p>
<p>&nbsp;</p>
<p>第一级配置器：</p>
<p>调用malloc()和realloc()，如果配置不成功，则调用oom_malloc(), oom_realloc()（PS：oom= out of memory）。在oom_XXX的处理时，通过不断调用&#8220;内存不足处理例程&#8221;，期望在某次调用之后能够分配到。设计&#8220;内存不足处理例程&#8221;是客户端的责任。（effective C++ 对new-handler的行为有一个条款，还没认真看）</p>
<p>第二级配置器：</p>
<p>由于太多小额的区块会造成内存的碎片，同时也会带来额外的负担，因此通过第二级配置器的分配，适当的将小额内存分配出去。当区块小（&lt;128bytes）的时候，采用内存池管理。第二级配置器维护了16个free-lists，各自管理从8~128bytes的小额区块，每一个区块以8bytes递增（将每一个小额的区块需求上调至8的倍数，以便管理）。每一次需要时候就将适当的内存从free-lists中间拔出来。客户释放后就回收到free-lists中。当需要的free-lists中没有可用的区块的时候，调用refill()函数为free-lists填充新的空间（取自内存池，用chunk_alloc()函数）。内存池的处理十分复杂，看的一头雾水。</p>
<p>&nbsp;</p>
<p>SGI配置器使用方法：</p>
<p>&nbsp;</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #000000">template&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;T,&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Alloc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;alloc</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" />Class&nbsp;vector<br /><img id="Codehighlighter1_54_191_Open_Image" onclick="this.style.display='none'; Codehighlighter1_54_191_Open_Text.style.display='none'; Codehighlighter1_54_191_Closed_Image.style.display='inline'; Codehighlighter1_54_191_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top"><img id="Codehighlighter1_54_191_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_54_191_Closed_Text.style.display='none'; Codehighlighter1_54_191_Open_Image.style.display='inline'; Codehighlighter1_54_191_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align="top"></span><span id="Codehighlighter1_54_191_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_54_191_Open_Text"><span style="color: #000000">{<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;T&nbsp;value_type;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /></span><span style="color: #0000ff">protected</span><span style="color: #000000">:<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;siple_alloc</span><span style="color: #000000">&lt;</span><span style="color: #000000">value_type,&nbsp;Alloc</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;data_allocator;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br /><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />}</span></span><span style="color: #000000">;<br /><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;</p>
<p>其中第二个template参数接受缺省的alloc，可以是第一级配置器也可以是第二级配置器。SGI STL已经把它设定为第二级配置器。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>3. 内存基本处理工具</p>
<p>在头文件&lt;stl_uninitialized&gt;中，定义了3个全局函数，uninitialized_copy(),uninitialized_fill(),uninitialized_fill_n(). 看到这些名字应该就知道它们是什么作用了，它们负责在已分配好的空间进行构造。这三个函数都具有&#8221;commit or rollback&#8221;语意。要么构造出所有元素，要么不构造任何东西。</p>
<p>在具体的实现中，这三个函数也用到了traits技法，通过traits萃取出元素的特性，如果是POD（Plain Old Data）型别，说明其拥有trivial ctor/ dtor/ copy/ assignment函数，因此可以使用copy()、fill()、fill_n()等算法，如果不是POD型别就只能够循环调用construct()函数了。这里用到的也是函数重载的方法，和上面destroy用到的方法是一样的。</p>
<p>注意：在unitialized_copy()实现的时候，针对char*和wchar_t*两种型别，可以采用最有效率的memmove()来复制，因此需要两份特化版本。</p><img src ="http://www.cppblog.com/dead-horse/aggbug/116649.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/dead-horse/" target="_blank">dead_horse</a> 2010-05-28 23:04 <a href="http://www.cppblog.com/dead-horse/archive/2010/05/28/116649.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>