﻿<?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++博客-Zero Lee的专栏</title><link>http://www.cppblog.com/zerolee/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 23 Apr 2026 04:08:33 GMT</lastBuildDate><pubDate>Thu, 23 Apr 2026 04:08:33 GMT</pubDate><ttl>60</ttl><item><title>关于STL allocator</title><link>http://www.cppblog.com/zerolee/archive/2012/06/17/179150.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sun, 17 Jun 2012 02:37:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2012/06/17/179150.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/179150.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2012/06/17/179150.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/179150.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/179150.html</trackback:ping><description><![CDATA[关于STL 中allocator的接口与实现，C++标准有比较清楚的定义：<br />
<span style="border-collapse: separate; font-family: Tahoma; line-height: normal; border-spacing: 0px; font-size: medium; ">http://en.wikipedia.org/wiki/Allocator_(C%2B%2B)</span>&nbsp;<br />
<br />
1. 在GNU C++中，STL allocator严格遵守C++的标准：<br />
看一下的代码：（定义在bits/allocator.h文件中）<br />
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;std<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;{<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp&gt;<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;allocator;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;template&lt;&gt;<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;allocator&lt;<span style="color: #0000FF; ">void</span>&gt;<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />
<span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;size_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_type;<br />
<span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;ptrdiff_t&nbsp;&nbsp;&nbsp;difference_type;<br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;const_pointer;<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;<br />
<span style="color: #008080; ">15</span>&nbsp;<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp1&gt;<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;rebind<br />
<span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;typedef&nbsp;allocator&lt;_Tp1&gt;&nbsp;other;&nbsp;};<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
<span style="color: #008080; ">20</span>&nbsp;<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br />
</span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;The&nbsp;"standard"&nbsp;allocator,&nbsp;as&nbsp;per&nbsp;[20.4].<br />
</span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*<br />
</span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;(See&nbsp;@link&nbsp;Allocators&nbsp;allocators&nbsp;info&nbsp;@endlink&nbsp;for&nbsp;more.)<br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp&gt;<br />
<span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;allocator:&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;___glibcxx_base_allocator&lt;_Tp&gt;<br />
<span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">29</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;size_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_type;<br />
<span style="color: #008080; ">31</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;ptrdiff_t&nbsp;&nbsp;difference_type;<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;_Tp*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;_Tp*&nbsp;const_pointer;<br />
<span style="color: #008080; ">34</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;_Tp&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;<br />
<span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;_Tp&amp;&nbsp;const_reference;<br />
<span style="color: #008080; ">36</span>&nbsp;<br />
<span style="color: #008080; ">37</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;_Tp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;<br />
<span style="color: #008080; ">38</span>&nbsp;<br />
<span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp1&gt;<br />
<span style="color: #008080; ">40</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;rebind<br />
<span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;typedef&nbsp;allocator&lt;_Tp1&gt;&nbsp;other;&nbsp;};<br />
<span style="color: #008080; ">42</span>&nbsp;<br />
<span style="color: #008080; ">43</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allocator()&nbsp;<span style="color: #0000FF; ">throw</span>()&nbsp;{&nbsp;}<br />
<span style="color: #008080; ">44</span>&nbsp;<br />
<span style="color: #008080; ">45</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allocator(<span style="color: #0000FF; ">const</span>&nbsp;allocator&amp;&nbsp;a)&nbsp;<span style="color: #0000FF; ">throw</span>()<br />
<span style="color: #008080; ">46</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;___glibcxx_base_allocator&lt;_Tp&gt;(a)&nbsp;{&nbsp;}<br />
<span style="color: #008080; ">47</span>&nbsp;<br />
<span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp1&gt;<br />
<span style="color: #008080; ">49</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allocator(<span style="color: #0000FF; ">const</span>&nbsp;allocator&lt;_Tp1&gt;&amp;)&nbsp;<span style="color: #0000FF; ">throw</span>()&nbsp;{&nbsp;}<br />
<span style="color: #008080; ">50</span>&nbsp;<br />
<span style="color: #008080; ">51</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~allocator()&nbsp;<span style="color: #0000FF; ">throw</span>()&nbsp;{&nbsp;}<br />
<span style="color: #008080; ">52</span>&nbsp;<br />
<span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Inherit&nbsp;everything&nbsp;else.</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;};<br />
<span style="color: #008080; ">55</span>&nbsp;<br />
<span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_T1,&nbsp;typename&nbsp;_T2&gt;<br />
<span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;<span style="color: #0000FF; ">bool</span><br />
<span style="color: #008080; ">58</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>==(<span style="color: #0000FF; ">const</span>&nbsp;allocator&lt;_T1&gt;&amp;,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;allocator&lt;_T2&gt;&amp;)<br />
<span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;&nbsp;}<br />
<span style="color: #008080; ">60</span>&nbsp;<br />
<span style="color: #008080; ">61</span>&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_T1,&nbsp;typename&nbsp;_T2&gt;<br />
<span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;<span style="color: #0000FF; ">bool</span><br />
<span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>!=(<span style="color: #0000FF; ">const</span>&nbsp;allocator&lt;_T1&gt;&amp;,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;allocator&lt;_T2&gt;&amp;)<br />
<span style="color: #008080; ">64</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;}<br />
<span style="color: #008080; ">65</span>&nbsp;<br />
<span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Inhibit&nbsp;implicit&nbsp;instantiations&nbsp;for&nbsp;required&nbsp;instantiations,<br />
</span><span style="color: #008080; ">67</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;which&nbsp;are&nbsp;defined&nbsp;via&nbsp;explicit&nbsp;instantiations&nbsp;elsewhere.<br />
</span><span style="color: #008080; ">68</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;NB:&nbsp;This&nbsp;syntax&nbsp;is&nbsp;a&nbsp;GNU&nbsp;extension.</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">69</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">#if</span>&nbsp;_GLIBCXX_EXTERN_TEMPLATE<br />
<span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">extern</span>&nbsp;template&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;allocator&lt;<span style="color: #0000FF; ">char</span>&gt;;<br />
<span style="color: #008080; ">71</span>&nbsp;<br />
<span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">extern</span>&nbsp;template&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;allocator&lt;wchar_t&gt;;<br />
<span style="color: #008080; ">73</span>&nbsp;<span style="color: #0000FF; ">#endif</span><br />
<span style="color: #008080; ">74</span>&nbsp;<br />
<span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Undefine.</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">76</span>&nbsp;<span style="color: #008000; "></span><span style="color: #0000FF; ">#undef</span>&nbsp;___glibcxx_base_allocator<br />
<span style="color: #008080; ">77</span>&nbsp;}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;namespace&nbsp;std<br />
</span><span style="color: #008080; ">78</span>&nbsp;<span style="color: #008000; "></span></div>
<br />
template&nbsp;___glibcxx_base_allocator 定义在具体的平台相关的头文件中，例如i386-redhat-linux/bits/c++allocator.h:<br />
可以看出GNU c++的allocator其实采用的是new/delete-based allocation.<br />
<br />
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">namespace</span>&nbsp;__gnu_cxx<br />
<span style="color: #008080; ">&nbsp;2</span>&nbsp;{<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">*<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;@brief&nbsp;&nbsp;An&nbsp;allocator&nbsp;that&nbsp;uses&nbsp;global&nbsp;new,&nbsp;as&nbsp;per&nbsp;[20.4].<br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;This&nbsp;is&nbsp;precisely&nbsp;the&nbsp;allocator&nbsp;defined&nbsp;in&nbsp;the&nbsp;C++&nbsp;Standard.<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;all&nbsp;allocation&nbsp;calls&nbsp;operator&nbsp;new<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;-&nbsp;all&nbsp;deallocation&nbsp;calls&nbsp;operator&nbsp;delete<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*<br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;(See&nbsp;@link&nbsp;Allocators&nbsp;allocators&nbsp;info&nbsp;@endlink&nbsp;for&nbsp;more.)<br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
<span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp&gt;<br />
<span style="color: #008080; ">13</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;new_allocator<br />
<span style="color: #008080; ">14</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />
<span style="color: #008080; ">15</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>:<br />
<span style="color: #008080; ">16</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;size_t&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_type;<br />
<span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;ptrdiff_t&nbsp;&nbsp;difference_type;<br />
<span style="color: #008080; ">18</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;_Tp*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;<br />
<span style="color: #008080; ">19</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;_Tp*&nbsp;const_pointer;<br />
<span style="color: #008080; ">20</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;_Tp&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;<br />
<span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;_Tp&amp;&nbsp;const_reference;<br />
<span style="color: #008080; ">22</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;_Tp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;<br />
<span style="color: #008080; ">23</span>&nbsp;<br />
<span style="color: #008080; ">24</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp1&gt;<br />
<span style="color: #008080; ">25</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">struct</span>&nbsp;rebind<br />
<span style="color: #008080; ">26</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;typedef&nbsp;new_allocator&lt;_Tp1&gt;&nbsp;other;&nbsp;};<br />
<span style="color: #008080; ">27</span>&nbsp;<br />
<span style="color: #008080; ">28</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_allocator()&nbsp;<span style="color: #0000FF; ">throw</span>()&nbsp;{&nbsp;}<br />
<span style="color: #008080; ">29</span>&nbsp;<br />
<span style="color: #008080; ">30</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_allocator(<span style="color: #0000FF; ">const</span>&nbsp;new_allocator&amp;)&nbsp;<span style="color: #0000FF; ">throw</span>()&nbsp;{&nbsp;}<br />
<span style="color: #008080; ">31</span>&nbsp;<br />
<span style="color: #008080; ">32</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp1&gt;<br />
<span style="color: #008080; ">33</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_allocator(<span style="color: #0000FF; ">const</span>&nbsp;new_allocator&lt;_Tp1&gt;&amp;)&nbsp;<span style="color: #0000FF; ">throw</span>()&nbsp;{&nbsp;}<br />
<span style="color: #008080; ">34</span>&nbsp;<br />
<span style="color: #008080; ">35</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~new_allocator()&nbsp;<span style="color: #0000FF; ">throw</span>()&nbsp;{&nbsp;}<br />
<span style="color: #008080; ">36</span>&nbsp;<br />
<span style="color: #008080; ">37</span>&nbsp;<br />
<span style="color: #008080; ">38</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer<br />
<span style="color: #008080; ">39</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address(reference&nbsp;__x)&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&amp;__x;&nbsp;}<br />
<span style="color: #008080; ">40</span>&nbsp;<br />
<span style="color: #008080; ">41</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const_pointer<br />
<span style="color: #008080; ">42</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;address(const_reference&nbsp;__x)&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&amp;__x;&nbsp;}<br />
<span style="color: #008080; ">43</span>&nbsp;<br />
<span style="color: #008080; ">44</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;NB:&nbsp;__n&nbsp;is&nbsp;permitted&nbsp;to&nbsp;be&nbsp;0.&nbsp;&nbsp;The&nbsp;C++&nbsp;standard&nbsp;says&nbsp;nothing<br />
</span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;about&nbsp;what&nbsp;the&nbsp;return&nbsp;value&nbsp;is&nbsp;when&nbsp;__n&nbsp;==&nbsp;0.</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer<br />
<span style="color: #008080; ">47</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;allocate(size_type&nbsp;__n,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">void</span>*&nbsp;=&nbsp;0)<br />
<span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;static_cast&lt;_Tp*&gt;(::<span style="color: #0000FF; ">operator</span>&nbsp;<span style="color: #0000FF; ">new</span>(__n&nbsp;*&nbsp;<span style="color: #0000FF; ">sizeof</span>(_Tp)));&nbsp;}<br />
<span style="color: #008080; ">49</span>&nbsp;<br />
<span style="color: #008080; ">50</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;__p&nbsp;is&nbsp;not&nbsp;permitted&nbsp;to&nbsp;be&nbsp;a&nbsp;null&nbsp;pointer.</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span><br />
<span style="color: #008080; ">52</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;deallocate(pointer&nbsp;__p,&nbsp;size_type)<br />
<span style="color: #008080; ">53</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;::<span style="color: #0000FF; ">operator</span>&nbsp;delete(__p);&nbsp;}<br />
<span style="color: #008080; ">54</span>&nbsp;<br />
<span style="color: #008080; ">55</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;size_type<br />
<span style="color: #008080; ">56</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max_size()&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;<span style="color: #0000FF; ">throw</span>()<br />
<span style="color: #008080; ">57</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;size_t(-1)&nbsp;/&nbsp;<span style="color: #0000FF; ">sizeof</span>(_Tp);&nbsp;}<br />
<span style="color: #008080; ">58</span>&nbsp;<br />
<span style="color: #008080; ">59</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;_GLIBCXX_RESOLVE_LIB_DEFECTS<br />
</span><span style="color: #008080; ">60</span>&nbsp;<span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;402.&nbsp;wrong&nbsp;new&nbsp;expression&nbsp;in&nbsp;[some_]&nbsp;allocator::construct</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">61</span>&nbsp;<span style="color: #008000; "></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span><br />
<span style="color: #008080; ">62</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;construct(pointer&nbsp;__p,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;_Tp&amp;&nbsp;__val)<br />
<span style="color: #008080; ">63</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;::<span style="color: #0000FF; ">new</span>(__p)&nbsp;_Tp(__val);&nbsp;}<br />
<span style="color: #008080; ">64</span>&nbsp;<br />
<span style="color: #008080; ">65</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span><br />
<span style="color: #008080; ">66</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destroy(pointer&nbsp;__p)&nbsp;{&nbsp;__p-&gt;~_Tp();&nbsp;}<br />
<span style="color: #008080; ">67</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
<span style="color: #008080; ">68</span>&nbsp;<br />
<span style="color: #008080; ">69</span>&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp&gt;<br />
<span style="color: #008080; ">70</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;<span style="color: #0000FF; ">bool</span><br />
<span style="color: #008080; ">71</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>==(<span style="color: #0000FF; ">const</span>&nbsp;new_allocator&lt;_Tp&gt;&amp;,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;new_allocator&lt;_Tp&gt;&amp;)<br />
<span style="color: #008080; ">72</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">true</span>;&nbsp;}<br />
<span style="color: #008080; ">73</span>&nbsp;<br />
<span style="color: #008080; ">74</span>&nbsp;<br />
<span style="color: #008080; ">75</span>&nbsp;&nbsp;&nbsp;template&lt;typename&nbsp;_Tp&gt;<br />
<span style="color: #008080; ">76</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;<span style="color: #0000FF; ">bool</span><br />
<span style="color: #008080; ">77</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">operator</span>!=(<span style="color: #0000FF; ">const</span>&nbsp;new_allocator&lt;_Tp&gt;&amp;,&nbsp;<span style="color: #0000FF; ">const</span>&nbsp;new_allocator&lt;_Tp&gt;&amp;)<br />
<span style="color: #008080; ">78</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">false</span>;&nbsp;}<br />
<span style="color: #008080; ">79</span>&nbsp;}&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;namespace&nbsp;__gnu_cxx<br />
</span><span style="color: #008080; ">80</span>&nbsp;<br />
<span style="color: #008000; "></span></div><img src ="http://www.cppblog.com/zerolee/aggbug/179150.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2012-06-17 10:37 <a href="http://www.cppblog.com/zerolee/archive/2012/06/17/179150.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何将一片内存链接成链表</title><link>http://www.cppblog.com/zerolee/archive/2012/06/16/179073.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sat, 16 Jun 2012 10:38:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2012/06/16/179073.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/179073.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2012/06/16/179073.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/179073.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/179073.html</trackback:ping><description><![CDATA[假设有一片内存，大小为m*n, m是每个单元的大小，而且&gt;=8，共有n个这样的单元，如何将它们链接成n个节点的链表，要求不再使用任何其它内存空间。<br />
<br />
这里给出SGI STL内存分配器的一个简单实现：<br />
首先定义一个union数据结构：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">1</span>&nbsp;union&nbsp;obj&nbsp;{<br />
<span style="color: #008080; ">2</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;union&nbsp;obj*&nbsp;free_list_link;<br />
<span style="color: #008080; ">3</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">char</span>&nbsp;client_data[1];<br />
<span style="color: #008080; ">4</span>&nbsp;};</div>
<br />
这个union结构体的最大大小为4bytes （在32bits 平台上），8bytes （在64bits平台上）。<br />
<br />
假设那片内存的地址为chunk，那么我们可以这样做：
<span style="font-size: 13px; color: #008080; ">&nbsp;<br /></span><br />
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><span style="color: #008080; ">&nbsp;1 obj* current_obj, *next_obj;<br />&nbsp;2</span>&nbsp;next_obj&nbsp;=&nbsp;(obj*)chunk;<br />
<span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">int</span>&nbsp;i&nbsp;=&nbsp;0;&nbsp;;&nbsp;i++)&nbsp;{<br />
<span style="color: #008080; ">&nbsp;4</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_obj&nbsp;=&nbsp;next_obj;<br />
<span style="color: #008080; ">&nbsp;5</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;next_obj&nbsp;=&nbsp;(obj*)((<span style="color: #0000FF; ">char</span>*)next_obj&nbsp;+&nbsp;m);<br />
<span style="color: #008080; ">&nbsp;6</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(n&nbsp;-&nbsp;1&nbsp;==&nbsp;i)&nbsp;{<br />
<span style="color: #008080; ">&nbsp;7</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_obj&nbsp;-&gt;&nbsp;free_list_link&nbsp;=&nbsp;0;<br />
<span style="color: #008080; ">&nbsp;8</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</span>;<br />
<span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />
<span style="color: #008080; ">10</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;current_obj&nbsp;-&gt;&nbsp;free_list_link&nbsp;=&nbsp;next_obj;<br />
<span style="color: #008080; ">11</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<span style="color: #008080; ">12</span>&nbsp;}<br />
<span style="color: #008080; ">13</span>&nbsp;<font color="#008080"><br />
</font></div><img src ="http://www.cppblog.com/zerolee/aggbug/179073.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2012-06-16 18:38 <a href="http://www.cppblog.com/zerolee/archive/2012/06/16/179073.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转载] STL allocator的介绍和一个基于malloc/free的allocator的简单实现</title><link>http://www.cppblog.com/zerolee/archive/2012/06/16/179042.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sat, 16 Jun 2012 04:13:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2012/06/16/179042.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/179042.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2012/06/16/179042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/179042.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/179042.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Allocators are one of the most mysterious parts of the C++ Standard library. Allocators are rarely used explicitly; the Standard doesn't make it clear when they should ever be used. Today's allocators...&nbsp;&nbsp;<a href='http://www.cppblog.com/zerolee/archive/2012/06/16/179042.html'>阅读全文</a><img src ="http://www.cppblog.com/zerolee/aggbug/179042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2012-06-16 12:13 <a href="http://www.cppblog.com/zerolee/archive/2012/06/16/179042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Memory Pool</title><link>http://www.cppblog.com/zerolee/archive/2012/06/16/179032.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Sat, 16 Jun 2012 02:40:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2012/06/16/179032.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/179032.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2012/06/16/179032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/179032.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/179032.html</trackback:ping><description><![CDATA[这里将包含内存池的一些讨论和总结。<img src ="http://www.cppblog.com/zerolee/aggbug/179032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2012-06-16 10:40 <a href="http://www.cppblog.com/zerolee/archive/2012/06/16/179032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]多线程队列的算法优化</title><link>http://www.cppblog.com/zerolee/archive/2012/06/05/177651.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Tue, 05 Jun 2012 06:26:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2012/06/05/177651.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/177651.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2012/06/05/177651.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/177651.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/177651.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 原文来自于：&nbsp;http://www.parallellabs.com/2010/10/25/practical-concurrent-queue-algorithm/&nbsp;多线程队列（Concurrent Queue）的使用场合非常多，高性能服务器中的消息队列，并行算法中的Work Stealing等都离不开它。对于一个队列来说有两个最主要的动作：添加（enqueue）和删除（de...&nbsp;&nbsp;<a href='http://www.cppblog.com/zerolee/archive/2012/06/05/177651.html'>阅读全文</a><img src ="http://www.cppblog.com/zerolee/aggbug/177651.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2012-06-05 14:26 <a href="http://www.cppblog.com/zerolee/archive/2012/06/05/177651.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求一个正整数的平方根程序实现</title><link>http://www.cppblog.com/zerolee/archive/2011/10/19/158661.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Wed, 19 Oct 2011 01:37:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2011/10/19/158661.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/158661.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2011/10/19/158661.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/158661.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/158661.html</trackback:ping><description><![CDATA[求一个正整数的平方根的程序实现：<br />采用加法递增的方式来代替乘法与N进行比较，递增是按照等差数列的方式。<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;square(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n)<br /></span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">{<br /></span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;n;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br /></span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">+=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">2</span><span style="color: #000000; ">*</span><span style="color: #000000; ">(i</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">)</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(tmp&nbsp;</span><span style="color: #000000; ">==</span><span style="color: #000000; ">&nbsp;n)<br /></span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<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;i;<br /></span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">continue</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(n</span><span style="color: #000000; ">!=</span><span style="color: #000000; ">0</span><span style="color: #000000; ">)&nbsp;{<br /></span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">no&nbsp;integer&nbsp;sqare&nbsp;found!\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br /></span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br /></span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;tmp;<br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">}<br /></span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; "></span></div><img src ="http://www.cppblog.com/zerolee/aggbug/158661.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2011-10-19 09:37 <a href="http://www.cppblog.com/zerolee/archive/2011/10/19/158661.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一组数的全排列和组合程序实现</title><link>http://www.cppblog.com/zerolee/archive/2011/10/19/158660.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Wed, 19 Oct 2011 01:34:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2011/10/19/158660.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/158660.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2011/10/19/158660.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/158660.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/158660.html</trackback:ping><description><![CDATA[显示一组数的全排列和组合程序：
<div style="font-size: 13px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #cccccc; border-right-color: #cccccc; border-bottom-color: #cccccc; border-left-color: #cccccc; padding-right: 5px; padding-bottom: 4px; padding-left: 4px; padding-top: 4px; width: 98%; word-break: break-all; background-color: #eeeeee; "><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008080; ">&nbsp;1</span>&nbsp;<span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;print(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;s)<br />
</span><span style="color: #008080; ">&nbsp;2</span>&nbsp;<span style="color: #000000; ">{<br />
</span><span style="color: #008080; ">&nbsp;3</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">&nbsp;4</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;n</span><span style="color: #000000; ">++</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">&nbsp;5</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">&nbsp;6</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;s.size();&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)<br />
</span><span style="color: #008080; ">&nbsp;7</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;%d&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;s[i]);<br />
</span><span style="color: #008080; ">&nbsp;8</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">&nbsp;9</span>&nbsp;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">10</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">11</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;permutation(std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;v,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;beg,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;end)<br />
</span><span style="color: #008080; ">12</span>&nbsp;<span style="color: #000000; ">{<br />
</span><span style="color: #008080; ">13</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">if</span><span style="color: #000000; ">&nbsp;(beg&nbsp;</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;end)&nbsp;{<br />
</span><span style="color: #008080; ">14</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(v);<br />
</span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">16</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">17</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;beg;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;=</span><span style="color: #000000; ">&nbsp;end;&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">18</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::swap(v[i],&nbsp;v[beg]);<br />
</span><span style="color: #008080; ">19</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;permutation(v,&nbsp;beg</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;end);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;pleate&nbsp;note,&nbsp;here&nbsp;always&nbsp;beg+1,&nbsp;not&nbsp;i+1</span><span style="color: #008000; "><br />
</span><span style="color: #008080; ">20</span>&nbsp;<span style="color: #008000; "></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::swap(v[i],&nbsp;v[beg]);<br />
</span><span style="color: #008080; ">21</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">22</span>&nbsp;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">23</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">24</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;pm(std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;v)<br />
</span><span style="color: #008080; ">25</span>&nbsp;<span style="color: #000000; ">{<br />
</span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;std::copy(v.begin(),&nbsp;v.end(),&nbsp;std::ostream_iterator</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(std::cout,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />
</span><span style="color: #008080; ">27</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">\nfull&nbsp;permulation&nbsp;are:\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">28</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;permutation(v,&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">,&nbsp;v.size()</span><span style="color: #000000; ">-</span><span style="color: #000000; ">1</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">29</span>&nbsp;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">30</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">31</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;print(</span><span style="color: #0000FF; ">const</span><span style="color: #000000; ">&nbsp;std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;v,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;beg,&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;end)<br />
</span><span style="color: #008080; ">32</span>&nbsp;<span style="color: #000000; ">{<br />
</span><span style="color: #008080; ">33</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;n&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;<br />
</span><span style="color: #008080; ">34</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">%d:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">,&nbsp;n</span><span style="color: #000000; ">++</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">35</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">[</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">36</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;std::copy(v.begin()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">beg,&nbsp;v.begin()</span><span style="color: #000000; ">+</span><span style="color: #000000; ">end</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">,&nbsp;std::ostream_iterator</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">(std::cout,&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">));<br />
</span><span style="color: #008080; ">37</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">]\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">38</span>&nbsp;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">39</span>&nbsp;<span style="color: #000000; "><br />
</span><span style="color: #008080; ">40</span>&nbsp;<span style="color: #000000; "></span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;fullcombination(std::vector</span><span style="color: #000000; ">&lt;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&gt;&amp;</span><span style="color: #000000; ">&nbsp;v)<br />
</span><span style="color: #008080; ">41</span>&nbsp;<span style="color: #000000; ">{<br />
</span><span style="color: #008080; ">42</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000; ">"</span><div style="display: inline-block; "></div>full combination<span style="color: #000000; ">&nbsp;are:\n</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />
</span><span style="color: #008080; ">43</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;i&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;i&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;v.size();&nbsp;i</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">44</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(v,&nbsp;i,&nbsp;i);<br />
</span><span style="color: #008080; ">45</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(unsigned&nbsp;</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;j&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;i</span><span style="color: #000000; ">+</span><span style="color: #000000; ">1</span><span style="color: #000000; ">;&nbsp;j&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;v.size();&nbsp;j</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">46</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">for</span><span style="color: #000000; ">&nbsp;(</span><span style="color: #0000FF; ">int</span><span style="color: #000000; ">&nbsp;k&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">0</span><span style="color: #000000; ">;&nbsp;k&nbsp;</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">&nbsp;v.size()</span><span style="color: #000000; ">-</span><span style="color: #000000; ">j;&nbsp;k</span><span style="color: #000000; ">++</span><span style="color: #000000; ">)&nbsp;{<br />
</span><span style="color: #008080; ">47</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::swap(v[j</span><span style="color: #000000; ">+</span><span style="color: #000000; ">k],&nbsp;v[j]);<br />
</span><span style="color: #008080; ">48</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print(v,&nbsp;i,&nbsp;j);<br />
</span><span style="color: #008080; ">49</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::swap(v[j</span><span style="color: #000000; ">+</span><span style="color: #000000; ">k],&nbsp;v[j]);<br />
</span><span style="color: #008080; ">50</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">51</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">52</span>&nbsp;<span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;}<br />
</span><span style="color: #008080; ">53</span>&nbsp;<span style="color: #000000; ">}<br />
</span><span style="color: #008080; ">54</span>&nbsp;<span style="color: #000000; "></span></div><img src ="http://www.cppblog.com/zerolee/aggbug/158660.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2011-10-19 09:34 <a href="http://www.cppblog.com/zerolee/archive/2011/10/19/158660.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Generating Permutations</title><link>http://www.cppblog.com/zerolee/archive/2011/09/21/156428.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Wed, 21 Sep 2011 07:22:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2011/09/21/156428.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/156428.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2011/09/21/156428.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/156428.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/156428.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: Arial; line-height: normal; font-size: 10pt; ">A permutation can be obtained by selecting an element in the given set and recursively permuting the remaining elements.<br />
<br />
<div><img src="http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680350x.gif" alt=" { ai,P(a1,...,ai-1,ai+1,...,aN) if N &gt; 1 P(a1,...,aN) = aN if N = 1" /></div>
</span><span class="Apple-style-span" style="font-family: Arial; line-height: normal; background-color: #ffffff; font-size: medium; "><br />
<br />
</span><font class="Apple-style-span" face="Arial" size="3"><span class="Apple-style-span" style="line-height: normal; ">
<div><img src="http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680351x.gif" alt=" --|--|--|-| |a|b-|c-d-| a|------------b------------c-------------d --|--|--|-| ---|-|--|--| ---|--|-|--| --|--|--|-| |-|b-|c-d-| |a-|-|c-|d-| |a-|b-|-|d-| |a|b-|c-|-|" /><br />
<br />
</div>
</span></font><span class="Apple-style-span" style="font-family: Arial; line-height: normal; font-size: 10pt; ">At each stage of the permutation process, the given set of elements consists of two parts: a subset of values that already have been processed, and a subset that still needs to be processed. This logical seperation can be physically realized by exchanging, in the i&#8217;th step, the i&#8217;th value with the value being chosen at that stage. That approaches leaves the first subset in the first i locations of the outcome.</span><font class="Apple-style-span" face="Arial" size="3"><span class="Apple-style-span" style="line-height: normal; ">
<div><br />
<div><img src="http://www.cse.ohio-state.edu/~gurari/course/cis680/cis680352x.gif" alt=" --|--|--|-| |a|b-|c-d-| --|--|------------|--------------------------|--|-| a||b |c d | |b a |c |d | |c||b |a|d | |d|b |c |a| -----|--------------------------|---- ----------- --|--|--|-| ---|-|--|--| ---|--|-|--| b-|a-|c-d-| |b-|c|a-|d-| |b-|d-|c|a-| ---|--|------------|--|-| |b-|c-a-|d-| b-|c-|d-|a| | b-|c-|d-|a| |-|--|--|-|" /></div>
</div>
</span></font><span class="Apple-style-span" style="font-family: Arial; line-height: normal; font-size: medium; ">
<pre class="Verbatim"><span class="cmtt-10" style="font-family: monospace; ">permute(i)</span>&nbsp;
&nbsp;&nbsp;&nbsp;<span class="cmtt-10" style="font-family: monospace; ">if</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">i</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">==</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">N</span>&nbsp;&nbsp;<span class="cmtt-10" style="font-family: monospace; ">output</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">A[N]</span>&nbsp;
&nbsp;&nbsp;&nbsp;<span class="cmtt-10" style="font-family: monospace; ">else</span>&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cmtt-10" style="font-family: monospace; ">for</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">j</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">=</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">i</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">to</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">N</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">do</span>&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cmtt-10" style="font-family: monospace; ">swap(A[i],</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">A[j])</span>&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cmtt-10" style="font-family: monospace; ">permute(i+1)</span>&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="cmtt-10" style="font-family: monospace; ">swap(A[i],</span>&nbsp;<span class="cmtt-10" style="font-family: monospace; ">A[j])</span>&nbsp;</pre>
</span><font class="Apple-style-span" face="Arial" size="3"><span class="Apple-style-span" style="line-height: normal; ">
<div>
<div></div>
</div>
</span></font>
<img src ="http://www.cppblog.com/zerolee/aggbug/156428.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2011-09-21 15:22 <a href="http://www.cppblog.com/zerolee/archive/2011/09/21/156428.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Inside The C++ Object Model 阅读笔记</title><link>http://www.cppblog.com/zerolee/archive/2011/09/19/156212.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Mon, 19 Sep 2011 05:18:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2011/09/19/156212.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/156212.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2011/09/19/156212.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/156212.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/156212.html</trackback:ping><description><![CDATA[1. The semantics of constructor<br />有4种情况会导致&#8220;编译器必须为未声明constructor之classes合成一个default constructor&#8220;。C++ 标准把那些合成物称为implicit nontrivial default constructors。被合成出来的constructor只能满足编译器(而非程序)的需要。它之所以能够完成任务，是借着&#8220;调用member object 或 base class 的default constructor&#8220; 或是 &#8221;为每一个object初始化其virtual function 机制或virtual base class机制&#8220;而完成。至于没有存在那四种情况而又没有声明任何constructor的classes，我们说它们拥有的是implicit trivial default constructors，它们实际上并不会被合成出来。<br />在合成出来的default constructor中，只有base class subobjects 和member class objects会被初始化。所有其它的nonstatic data memeber，如整数、整数指针、整数数组等等都不会被初始化。这些初始化操作对程序而言或许有需要，但对编译器则并非必要。<br />2. The semantics of copy constructor<br />有4种情况，一个class不展现出"bitwise copy semantics"：<br />1) 当class内含一个member object而后者的class声明有一个copy constructor时(不论是被class 设计者明确的声明，还是被编译器合成);<br />2) 当class继承自一个base class而后者存在一个copy constructor时(再次强调，不论是被明确声明还是被合成而得);<br />3) 当class声明了一个或多个virtual functions时；<br />4) 当class派生自一个继承串链，其中有一个或多个virtual base classes时。<br />前2种情况中，编译器必须将member或base class的"copy constructors 调用操作"安插到被合成的copy constructor中。<br /><br /><br /><br /><img src ="http://www.cppblog.com/zerolee/aggbug/156212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2011-09-19 13:18 <a href="http://www.cppblog.com/zerolee/archive/2011/09/19/156212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Inside The C++ Object Model 阅读笔记</title><link>http://www.cppblog.com/zerolee/archive/2011/09/19/156211.html</link><dc:creator>Zero Lee</dc:creator><author>Zero Lee</author><pubDate>Mon, 19 Sep 2011 05:18:00 GMT</pubDate><guid>http://www.cppblog.com/zerolee/archive/2011/09/19/156211.html</guid><wfw:comment>http://www.cppblog.com/zerolee/comments/156211.html</wfw:comment><comments>http://www.cppblog.com/zerolee/archive/2011/09/19/156211.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zerolee/comments/commentRss/156211.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zerolee/services/trackbacks/156211.html</trackback:ping><description><![CDATA[1. The semantics of construction<br />有4种情况会导致&#8220;编译器必须为未声明constructor之classes合成一个default constructor&#8220;。C++ 标准把那些合成物称为implicit nontrivial default constructors。被合成出来的constructor只能满足编译器(而非程序)的需要。它之所以能够完成任务，是借着&#8220;调用member object 或 base class 的default constructor&#8220; 或是 &#8221;为每一个object初始化其virtual function 机制或virtual base class机制&#8220;而完成。至于没有存在那四种情况而又没有声明任何constructor的classes，我们说它们拥有的是implicit trivial default constructors，它们实际上并不会被合成出来。<br />在合成出来的default constructor中，只有base class subobjects 和member class objects会被初始化。所有其它的nonstatic data memeber，如整数、整数指针、整数数组等等都不会被初始化。这些初始化操作对程序而言或许有需要，但对编译器则并非必要。<br /><br /><br /><br /><br /><br /><img src ="http://www.cppblog.com/zerolee/aggbug/156211.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zerolee/" target="_blank">Zero Lee</a> 2011-09-19 13:18 <a href="http://www.cppblog.com/zerolee/archive/2011/09/19/156211.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>