﻿<?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++博客-勤能补拙，Expter-随笔分类-算法与数据结构</title><link>http://www.cppblog.com/expter/category/8558.html</link><description>成都游戏Coder，记录游戏开发过程的笔记和心得！</description><language>zh-cn</language><lastBuildDate>Sat, 09 Apr 2011 06:08:41 GMT</lastBuildDate><pubDate>Sat, 09 Apr 2011 06:08:41 GMT</pubDate><ttl>60</ttl><item><title>关于 warning C4715问题。</title><link>http://www.cppblog.com/expter/archive/2011/04/09/143795.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sat, 09 Apr 2011 04:52:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2011/04/09/143795.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/143795.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2011/04/09/143795.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/143795.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/143795.html</trackback:ping><description><![CDATA[<p>介绍:<br>&nbsp; <span class=question-title><br>&nbsp;&nbsp;&nbsp;关于warning C4715:not all control paths return a value</span>&nbsp;&nbsp;(不是所有的控件路径都返回值).<br><br>问题:<br>&nbsp;&nbsp;&nbsp; 一个函数，不是所有路径都有返回值，如下:<br><br>&nbsp;&nbsp;&nbsp; 1)&nbsp;基本数据类型<br>&nbsp;&nbsp;&nbsp; 对于函数的并不是每个分支都有返回值，那么这样警告会提示不是所有路径都有返回值。</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;test(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;value&nbsp;)<br><img id=Codehighlighter1_24_59_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_59_Open_Text.style.display='none'; Codehighlighter1_24_59_Closed_Image.style.display='inline'; Codehighlighter1_24_59_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_24_59_Closed_Image onclick="this.style.display='none'; Codehighlighter1_24_59_Closed_Text.style.display='none'; Codehighlighter1_24_59_Open_Image.style.display='inline'; Codehighlighter1_24_59_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_24_59_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_24_59_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;value&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;value;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p><br>&nbsp;&nbsp;&nbsp;调用 int value = test( -1 );<br><br>&nbsp;&nbsp;&nbsp;看下test的汇编代码.<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">关于8个程序寄存器一般只有esp寄存器作为入栈，出栈，调用和返回指令作为栈指针，其余<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">比如eax,exc等寄存器都没有固定的含义和固定值.<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">看下面test汇编代码.<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;test(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;value&nbsp;)<br><img id=Codehighlighter1_108_845_Open_Image onclick="this.style.display='none'; Codehighlighter1_108_845_Open_Text.style.display='none'; Codehighlighter1_108_845_Closed_Image.style.display='inline'; Codehighlighter1_108_845_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_108_845_Closed_Image onclick="this.style.display='none'; Codehighlighter1_108_845_Closed_Text.style.display='none'; Codehighlighter1_108_845_Open_Image.style.display='inline'; Codehighlighter1_108_845_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_108_845_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_108_845_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">;&nbsp;4个寄存器入栈<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">;&nbsp;ebp&nbsp;用于存放函数栈的栈顶指针<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">;&nbsp;esp&nbsp;用于存放函数栈的栈底指针<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113A0&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;将寄存器ebp的内容压入程序栈<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113A1&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp,esp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;保留esp寄存器<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113A3&nbsp;&nbsp;sub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esp,0C0h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;为该函数留出临时存储区<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113A9&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebx&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113AA&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113AB&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">;&nbsp;用0CCCCCCCCh初始化堆栈&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113AC&nbsp;&nbsp;lea&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi,[ebp</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">0C0h]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;lea直接寻址<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113B2&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ecx,30h&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;利用编译器的offset立即寻址<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113B7&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,0CCCCCCCCh&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;eax</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0CCCCCCCCh<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113BC&nbsp;&nbsp;rep&nbsp;stos&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;es:[edi]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;根据edi的大小来重复指令执行次数<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">;&nbsp;如果&nbsp;cmp为真则把value的值保存到eax寄存器中<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">;&nbsp;否则跳转到地址4113C7h,并没有对eax做处理<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;value&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;value;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113BE&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[value],</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113C2&nbsp;&nbsp;jle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">27h&nbsp;(4113C7h)&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">004113C4&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[value]&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">;各指针出栈，对应前面3条push<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113C7&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;edi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;弹出edi<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113C8&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;弹出esi<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113C9&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;弹出ebx<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113CA&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esp,ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;把esp重新指向ebp(函数栈的栈顶指<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">针，test函数栈顶)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113CC&nbsp;&nbsp;pop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;ebp重新指向test调用函数返回地址<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113CD&nbsp;&nbsp;ret</span></div>
<p><br>调用汇编代码<br></p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;value&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;test&nbsp;(&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113FE&nbsp;&nbsp;push&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">00411400</span><span style="COLOR: #000000">&nbsp;&nbsp;call&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test&nbsp;(4110AFh)&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">00411405</span><span style="COLOR: #000000">&nbsp;&nbsp;add&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;esp,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;Call&nbsp;test&nbsp;函数时将压入栈数据，<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">由于只有一个参数，所以只有4字节<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">00411408</span><span style="COLOR: #000000">&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[value],eax&nbsp;</span></div>
<p>当test 调用小于0时最后value指向的eax是一个0CCCCCCCCh，而对于基本数据类型大多value得到的是0CCCCCCCCh值.<br>如果我们的test函数:</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;test(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;value&nbsp;)<br><img id=Codehighlighter1_24_77_Open_Image onclick="this.style.display='none'; Codehighlighter1_24_77_Open_Text.style.display='none'; Codehighlighter1_24_77_Closed_Image.style.display='inline'; Codehighlighter1_24_77_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_24_77_Closed_Image onclick="this.style.display='none'; Codehighlighter1_24_77_Closed_Text.style.display='none'; Codehighlighter1_24_77_Open_Image.style.display='inline'; Codehighlighter1_24_77_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_24_77_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_24_77_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;value&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;value;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&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 align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<p>那么汇编代码会如下:</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;value&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;value;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113EE&nbsp;&nbsp;cmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword&nbsp;ptr&nbsp;[value],</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113F2&nbsp;&nbsp;jle&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">29h&nbsp;(4113F9h)&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113F4&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,dword&nbsp;ptr&nbsp;[value]&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113F7&nbsp;&nbsp;jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;test</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">2Bh&nbsp;(4113FBh)&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&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 align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">004113F9&nbsp;&nbsp;xor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eax,eax&nbsp;&nbsp;&nbsp;;将eax清零,作为返回值</span></div>
<p><br><br>&nbsp;&nbsp; 2 )如果返回的是一个引用对象<br>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">obj&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;&nbsp;test(&nbsp;type&nbsp;value&nbsp;)<br><img id=Codehighlighter1_26_53_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_53_Open_Text.style.display='none'; Codehighlighter1_26_53_Closed_Image.style.display='inline'; Codehighlighter1_26_53_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_26_53_Closed_Image onclick="this.style.display='none'; Codehighlighter1_26_53_Closed_Text.style.display='none'; Codehighlighter1_26_53_Open_Image.style.display='inline'; Codehighlighter1_26_53_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_26_53_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_26_53_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;type2&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;obj;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">obj&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;ob&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;test(&nbsp;type1&nbsp;);</span></div>
<br>
<p>&nbsp;&nbsp;&nbsp;如果ob是个空引用的话，就出出错，关于这种出错是否可以通过什么方式避免呢？<br><br>&nbsp;&nbsp; 我觉得warning C4715就应该是error C4715.让开发者从最开始就避免这种错误的发生。<br>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/expter/aggbug/143795.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2011-04-09 12:52 <a href="http://www.cppblog.com/expter/archive/2011/04/09/143795.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用Win32消息来解决MyGui中文完整输入</title><link>http://www.cppblog.com/expter/archive/2011/03/23/142577.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Wed, 23 Mar 2011 07:20:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2011/03/23/142577.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/142577.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2011/03/23/142577.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/142577.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/142577.html</trackback:ping><description><![CDATA[date:&nbsp; 3/23/2011<br><br>介绍:<br>&nbsp;&nbsp;&nbsp; 利用Win32 来处理MyGui 3.0.1的中文输入。<br><br>实现:<br>&nbsp;&nbsp;&nbsp; 配置还是参考网上的配置，主要再加中文字体.<br>&nbsp;&nbsp; 如下:<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">□&nbsp;更改配置文件MyGUI3.</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">\Media\MyGUI_Media下<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">☆&nbsp;core_font.xml添加<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Resource&nbsp;type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ResourceTrueTypeFont</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;name</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">font_Simhei</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Source</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">simhei.ttf</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Size</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">19</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Resolution</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">50</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Antialias</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">false</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">SpaceWidth</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">TabWidth</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">CursorWidth</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Distance</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">OffsetHeight</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Codes</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Code&nbsp;range</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">33&nbsp;126</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Code&nbsp;range</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">19969&nbsp;40869</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Code&nbsp;hide</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">128</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Code&nbsp;hide</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1026&nbsp;1039</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Code&nbsp;hide</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">1104</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Codes</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">Resource</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">☆&nbsp;simhei.ttf要从系统目录下的Fonts拷贝到当前目录。<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">☆&nbsp;core_settings.xml中将默认字体改成<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">MyGUI&nbsp;type</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Font</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Property&nbsp;key</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Default</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;value</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">font_Simhei</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">/&gt;</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">&lt;/</span><span style="COLOR: #000000">MyGUI</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"></span></div>
<br>&nbsp;&nbsp;&nbsp;&nbsp; 运行Demo解决方案:&nbsp;&nbsp; solution_directx。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给BaseManager添加Win32消息响应函数void ProcIO(UINT messgae, WPARAM wParam, LPARAM lParam ).<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_CHAR:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_KEYDOWN:<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_KEYUP:<br><img id=Codehighlighter1_53_240_Open_Image onclick="this.style.display='none'; Codehighlighter1_53_240_Open_Text.style.display='none'; Codehighlighter1_53_240_Closed_Image.style.display='inline'; Codehighlighter1_53_240_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_53_240_Closed_Image onclick="this.style.display='none'; Codehighlighter1_53_240_Closed_Text.style.display='none'; Codehighlighter1_53_240_Open_Image.style.display='inline'; Codehighlighter1_53_240_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_53_240_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_53_240_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">::BaseManager&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">baseManager&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">::BaseManager</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">)GetWindowLongPtr(hWnd,&nbsp;GWL_USERDATA);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;baseManager&nbsp;)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;baseManager</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">ProcIO(&nbsp;uMsg&nbsp;,&nbsp;wParam&nbsp;,&nbsp;lParam&nbsp;);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>&nbsp;&nbsp; ProcIO主要是对<br>&nbsp;&nbsp; WM_CHAR&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;字符响应<br>&nbsp;&nbsp; WM_KEYDOWN/WM_KEYUP&nbsp; 按键响应<br><br>&nbsp;&nbsp; 在处理字符响应的时候需要区分输入法状态和非输入法状态的字符响应。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">case</span><span style="COLOR: #000000">&nbsp;WM_CHAR:<br><img id=Codehighlighter1_17_228_Open_Image onclick="this.style.display='none'; Codehighlighter1_17_228_Open_Text.style.display='none'; Codehighlighter1_17_228_Closed_Image.style.display='inline'; Codehighlighter1_17_228_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_17_228_Closed_Image onclick="this.style.display='none'; Codehighlighter1_17_228_Closed_Text.style.display='none'; Codehighlighter1_17_228_Open_Image.style.display='inline'; Codehighlighter1_17_228_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_17_228_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_17_228_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;ImmIsIME(&nbsp;GetKeyboardLayout(</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)&nbsp;))<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ProcChar(&nbsp;wParam&nbsp;,&nbsp;lParam&nbsp;);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_109_222_Open_Image onclick="this.style.display='none'; Codehighlighter1_109_222_Open_Text.style.display='none'; Codehighlighter1_109_222_Closed_Image.style.display='inline'; Codehighlighter1_109_222_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_109_222_Closed_Image onclick="this.style.display='none'; Codehighlighter1_109_222_Closed_Text.style.display='none'; Codehighlighter1_109_222_Open_Image.style.display='inline'; Codehighlighter1_109_222_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_109_222_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_109_222_Open_Text><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;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyGUI::InputManager::getInstance().injectKeyPress(MyGUI::KeyCode::Enum(scan_code),&nbsp;code_point);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;</span></div>
<br>ProcChar函数主要处理中文。因为汉字为8个字节会响应WM_CHAR2次。需要进行组合一次。<br>WM_KEYDOWN：主要处理一些Widget字符输入。同时还可以做全局键盘信息监控（快捷键）.<br><br>判断一个Widget是否可以进行字符输入:<br>\MyGUIEngine\include\MyGUI_InputManager.cpp<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputManager::isKeyInputCapture()<br><img id=Codehighlighter1_44_289_Open_Image onclick="this.style.display='none'; Codehighlighter1_44_289_Open_Text.style.display='none'; Codehighlighter1_44_289_Closed_Image.style.display='inline'; Codehighlighter1_44_289_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_44_289_Closed_Image onclick="this.style.display='none'; Codehighlighter1_44_289_Closed_Text.style.display='none'; Codehighlighter1_44_289_Open_Image.style.display='inline'; Codehighlighter1_44_289_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_44_289_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_44_289_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">mWidgetKeyFocus&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&nbsp;&nbsp;strName&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mWidgetKeyFocus</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">getTypeName();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;strName&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ComboBox</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strName&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Edit</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strName&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Message</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strName&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">List</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_250_270_Open_Image onclick="this.style.display='none'; Codehighlighter1_250_270_Open_Text.style.display='none'; Codehighlighter1_250_270_Closed_Image.style.display='inline'; Codehighlighter1_250_270_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_250_270_Closed_Image onclick="this.style.display='none'; Codehighlighter1_250_270_Closed_Text.style.display='none'; Codehighlighter1_250_270_Open_Image.style.display='inline'; Codehighlighter1_250_270_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_250_270_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_250_270_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br>由于采用Win32键盘消息，应该屏蔽自带OIS的。<br>Input\OIS\InputManager.cpp<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;InputManager::captureInput()<br><img id=Codehighlighter1_35_97_Open_Image onclick="this.style.display='none'; Codehighlighter1_35_97_Open_Text.style.display='none'; Codehighlighter1_35_97_Closed_Image.style.display='inline'; Codehighlighter1_35_97_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_35_97_Closed_Image onclick="this.style.display='none'; Codehighlighter1_35_97_Closed_Text.style.display='none'; Codehighlighter1_35_97_Open_Image.style.display='inline'; Codehighlighter1_35_97_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_35_97_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_35_97_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(mMouse)&nbsp;mMouse</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">capture();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">mKeyboard-&gt;capture();</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif"></span><span style="COLOR: #000000">&nbsp;}</span></span></div>
<br>在Demo中监控按键消息( DemoKeeper功能是UIManager )。<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;DemoKeeper::injectKeyPress(MyGUI::KeyCode&nbsp;_key,&nbsp;MyGUI::Char&nbsp;_text)<br><img id=Codehighlighter1_73_616_Open_Image onclick="this.style.display='none'; Codehighlighter1_73_616_Open_Text.style.display='none'; Codehighlighter1_73_616_Closed_Image.style.display='inline'; Codehighlighter1_73_616_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_73_616_Closed_Image onclick="this.style.display='none'; Codehighlighter1_73_616_Closed_Text.style.display='none'; Codehighlighter1_73_616_Open_Image.style.display='inline'; Codehighlighter1_73_616_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_73_616_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_73_616_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(_key&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;MyGUI::KeyCode::Grave)<br><img id=Codehighlighter1_114_178_Open_Image onclick="this.style.display='none'; Codehighlighter1_114_178_Open_Text.style.display='none'; Codehighlighter1_114_178_Closed_Image.style.display='inline'; Codehighlighter1_114_178_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_114_178_Closed_Image onclick="this.style.display='none'; Codehighlighter1_114_178_Closed_Text.style.display='none'; Codehighlighter1_114_178_Open_Image.style.display='inline'; Codehighlighter1_114_178_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_114_178_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_114_178_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mConsole</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">setVisible(</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">mConsole</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">isVisible());<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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 align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(_key&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;MyGUI::KeyCode::F2&nbsp;)<br><img id=Codehighlighter1_224_371_Open_Image onclick="this.style.display='none'; Codehighlighter1_224_371_Open_Text.style.display='none'; Codehighlighter1_224_371_Closed_Image.style.display='inline'; Codehighlighter1_224_371_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_224_371_Closed_Image onclick="this.style.display='none'; Codehighlighter1_224_371_Closed_Text.style.display='none'; Codehighlighter1_224_371_Open_Image.style.display='inline'; Codehighlighter1_224_371_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_224_371_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_224_371_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyGUI::Message::createMessageBox(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Message</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Info</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Press&nbsp;F2&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MyGUI::MessageBoxStyle::Ok&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MyGUI::MessageBoxStyle::IconInfo);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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 align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(_key&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;MyGUI::KeyCode::F3&nbsp;)<br><img id=Codehighlighter1_415_562_Open_Image onclick="this.style.display='none'; Codehighlighter1_415_562_Open_Text.style.display='none'; Codehighlighter1_415_562_Closed_Image.style.display='inline'; Codehighlighter1_415_562_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_415_562_Closed_Image onclick="this.style.display='none'; Codehighlighter1_415_562_Closed_Text.style.display='none'; Codehighlighter1_415_562_Open_Image.style.display='inline'; Codehighlighter1_415_562_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_415_562_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_415_562_Open_Text><span style="COLOR: #000000">{<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyGUI::Message::createMessageBox(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Message</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Info</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">Press&nbsp;F3&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;MyGUI::MessageBoxStyle::Ok&nbsp;</span><span style="COLOR: #000000">|</span><span style="COLOR: #000000">&nbsp;MyGUI::MessageBoxStyle::IconInfo);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&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 align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">base</span><span style="COLOR: #000000">::BaseManager::injectKeyPress(_key,&nbsp;_text);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<br><br>最后附上源码解决方案:<br><a href="http://www.cppblog.com/Files/expter/MyGuiDemo.rar">/Files/expter/MyGuiDemo.rar<br></a><br>图片：<img border=0 alt="" src="http://www.cppblog.com/images/cppblog_com/expter/mygui.jpg" width=417 height=317><br>
<img src ="http://www.cppblog.com/expter/aggbug/142577.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2011-03-23 15:20 <a href="http://www.cppblog.com/expter/archive/2011/03/23/142577.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>根据子类类型访问其特有操作 </title><link>http://www.cppblog.com/expter/archive/2011/02/24/140616.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Thu, 24 Feb 2011 15:23:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2011/02/24/140616.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/140616.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2011/02/24/140616.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/140616.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/140616.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 描述:&nbsp;&nbsp;&nbsp;一个常见遇到的解决方案，下面记录下来。&nbsp;&nbsp; 1个功能模块，有一个简单的继承体系，基类假设为Base.&nbsp;&nbsp; 然后通过一个接口，如何访问子类的特有操作？&nbsp;&nbsp;&nbsp;&nbsp; /// 外部提供一个下面接口:&nbsp;&nbsp; virutal&nbsp;&nbsp; Base*&nbsp; ...&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2011/02/24/140616.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/140616.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2011-02-24 23:23 <a href="http://www.cppblog.com/expter/archive/2011/02/24/140616.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>针对一个内存池测试相关介绍</title><link>http://www.cppblog.com/expter/archive/2011/01/18/138787.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Tue, 18 Jan 2011 13:20:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2011/01/18/138787.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/138787.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2011/01/18/138787.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/138787.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/138787.html</trackback:ping><description><![CDATA[<p>目的:<br>针对自己的一个内存池如何测试其性能.<br><br>介绍：<br>1.内存池测试用例的选取.<br>1.单线程的分配和释放.<br>2.内存回收.<br>3.性能关注.</p>
<p>关于内存池的设计和实现网上遍地都是，本文不具体介绍关于内存池的具体实现和方式，主要是介绍设计一个内存池怎样去测试其性能和安全处理，有一个开源的内存池项目tcmalloc也有介绍很多，但是为了满足多种需求，代码过于庞大，最后我用来测试分配性能测试。</p>
<p>1个内存池的测试用例应该包含：<br>1）该项目内存分配概率随机性.<br>2）同时保证释放的随机性.<br>3）可以支持多种分配方式（不同大小，不同对象参数等）.</p>
<p><br>要达到上面要求则可以设计<br>1.一个数组来设定需要分配的大小。<br>&nbsp;&nbsp;&nbsp;long&nbsp; arr[ ] = { 16,32,64,128,256,512,1024,2048,5120,5130,7000,6000,10240,15000,20000};<br><br>2.根据需求来指定各个大小的分配几率，这好比有多少概率选中某个数（需特定的分配）:<br>&nbsp;&nbsp;&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><span style="COLOR: #000000">&nbsp;A.针对这个需求可以设定定一个概率数组Odds,数组值arrArr的索引。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;B.针对Odds指定数组数据，使其数据分配达到arr需要分配概率。<br><img id=Codehighlighter1_84_96_Open_Image onclick="this.style.display='none'; Codehighlighter1_84_96_Open_Text.style.display='none'; Codehighlighter1_84_96_Closed_Image.style.display='inline'; Codehighlighter1_84_96_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_84_96_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_84_96_Closed_Text.style.display='none'; Codehighlighter1_84_96_Open_Image.style.display='inline'; Codehighlighter1_84_96_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_84_96_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_84_96_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;被分配的概率</span><span style="COLOR: #808080"></span></span><br><img id=Codehighlighter1_120_197_Open_Image onclick="this.style.display='none'; Codehighlighter1_120_197_Open_Text.style.display='none'; Codehighlighter1_120_197_Closed_Image.style.display='inline'; Codehighlighter1_120_197_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_120_197_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_120_197_Closed_Text.style.display='none'; Codehighlighter1_120_197_Open_Image.style.display='inline'; Codehighlighter1_120_197_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;&nbsp;Odds[&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span id=Codehighlighter1_120_197_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"></span><span id=Codehighlighter1_120_197_Open_Text><span style="COLOR: #000000">{&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">,,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">}</span></span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;C.随机Odds数组，然后得到其值分配，其值则为Arr的索引。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;&nbsp;Asize</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;arr[&nbsp;Odds[&nbsp;rand()</span><span style="COLOR: #000000">%</span><span style="COLOR: #000000">size&nbsp;]&nbsp;]&nbsp;;</span></div>
<p><br><br>3.释放保证随机性。<br>&nbsp;&nbsp;&nbsp;&nbsp; 什么时候释放，以及分配了做什么用，都是又应用层决定的，所以需要把分配出来的内存通过一个容器来存储.<br>&nbsp;&nbsp;&nbsp;&nbsp; 由于分配是随机性，那么释放的时候也保证了随机性。<br><br>4.支持多种分配方式。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A. 对象分配:&nbsp;&nbsp;&nbsp;&nbsp;&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><span style="COLOR: #000000">MemFactory&nbsp;&nbsp;Memory;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;A</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Memory.Alloc</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">A</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>&nbsp;&nbsp;&nbsp;&nbsp;B</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Memory.Alloc</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">B,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Memory.FreeObj(&nbsp;a&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Memory.FreeObj(&nbsp;b&nbsp;);</span></div>
<p>&nbsp;&nbsp;&nbsp; B.直接分配</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><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Memory.Alloc(&nbsp;Asize&nbsp;);</span></div>
<p><br>5.性能测试<br>&nbsp;&nbsp; 为了测试性能，我选择了分配1000W次，其中用一个容器保存分配的数据，然后当容器到达100W的时候释放60W数据(保证数据正在使用，随机释放)。<br>&nbsp;&nbsp; 下面的Alloc time 只是统计的Alloc时间累加，Free time只是统计的Free 时间累加，Total time记录这次测试总共花费时间。</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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">测试结果如下:<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>MemPool&nbsp;Alloc&nbsp;time&nbsp;</span><span style="COLOR: #000000">3242</span><span style="COLOR: #000000">&nbsp;ms&nbsp;&nbsp;Free&nbsp;time:&nbsp;</span><span style="COLOR: #000000">2412</span><span style="COLOR: #000000">&nbsp;ms&nbsp;Total&nbsp;time&nbsp;</span><span style="COLOR: #000000">22535</span><span style="COLOR: #000000">&nbsp;ms<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>System&nbsp;&nbsp;&nbsp;&nbsp;Alloc&nbsp;time&nbsp;</span><span style="COLOR: #000000">33616</span><span style="COLOR: #000000">&nbsp;ms&nbsp;Free&nbsp;time:&nbsp;</span><span style="COLOR: #000000">6676</span><span style="COLOR: #000000">&nbsp;ms&nbsp;Total&nbsp;time&nbsp;</span><span style="COLOR: #000000">55013</span><span style="COLOR: #000000">&nbsp;ms<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>TCMalloc&nbsp;Alloc&nbsp;time&nbsp;</span><span style="COLOR: #000000">3451</span><span style="COLOR: #000000">&nbsp;ms&nbsp;&nbsp;&nbsp;Free&nbsp;time&nbsp;</span><span style="COLOR: #000000">1896</span><span style="COLOR: #000000">&nbsp;ms&nbsp;&nbsp;Toal&nbsp;&nbsp;time&nbsp;</span><span style="COLOR: #000000">21078</span><span style="COLOR: #000000">&nbsp;ms<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>可以看到TCMalloc的分配和释放都比较快。。<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>其中arr每个分配的大小命中概率。<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2436395</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1281728</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">3</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1026009</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">769123</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">768911</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">769335</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">7</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">640757</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">8</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">640974</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">9</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">512378</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">384841</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">11</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">256135</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">12</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">257367</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>Count[&nbsp;</span><span style="COLOR: #000000">13</span><span style="COLOR: #000000">&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">256047</span></div>
<p><br><br>PS：<br>1.内存池的使用：<br>&nbsp;&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><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;一般情况下内存池，是整理一整块内存，然后通过一个list串连起来，然后分配的时候从链表中获取，释放也是插入到链表中。<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;为了方便多对象的多参数以及无参数的分配，可以一些列宏和模板来实现:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;具体的可以参考后面附带的内存池实现的代码:<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;DEFINE_CALL_CON(&nbsp;paramcount&nbsp;)&nbsp;template&nbsp;&lt;class&nbsp;T,&nbsp;DP_STMP_##paramcount(&nbsp;typename,&nbsp;tp&nbsp;)&nbsp;&gt;\</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_287_455_Open_Image onclick="this.style.display='none'; Codehighlighter1_287_455_Open_Text.style.display='none'; Codehighlighter1_287_455_Closed_Image.style.display='inline'; Codehighlighter1_287_455_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_287_455_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_287_455_Closed_Text.style.display='none'; Codehighlighter1_287_455_Open_Image.style.display='inline'; Codehighlighter1_287_455_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;inline&nbsp;T&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;Alloc(DP_MTMP_##paramcount(&nbsp;tp,&nbsp;p&nbsp;)&nbsp;)</span><span id=Codehighlighter1_287_455_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"></span><span id=Codehighlighter1_287_455_Open_Text><span style="COLOR: #000000">{\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;unsigned&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;lSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(T);\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;ptMem&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Alloc(lSize);\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #000000">!</span><span style="COLOR: #000000">ptMem)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;NULL;&nbsp;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; T&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pt&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">(ptMem)T(&nbsp;LP_SNMP_##paramcount(&nbsp;p&nbsp;)&nbsp;);\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;pt;\<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;A.&nbsp;对象分配:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;MemFactory&nbsp;&nbsp;Memory;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;A</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Memory.Alloc</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">A</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>&nbsp;&nbsp;&nbsp;&nbsp;B</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Memory.Alloc</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">B,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">&nbsp;); <br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp; C* c = Memory.Alloc&lt;C,int,const char*&gt;(1,"dd");<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Memory.FreeObj(&nbsp;a&nbsp;);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Memory.FreeObj(&nbsp;b&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Memory.FreeObj(&nbsp;c&nbsp;);<br><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;B.直接分配<img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;p1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Memory.Alloc(&nbsp;Asize&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; memset(p1,0,ASize);<br></span></div>
<p><br>2.内存池的代码：<br>&nbsp;&nbsp; 1)&nbsp;&nbsp; 实现全是利用的freelist,减少内存开销，分配速度，直接定位。<br>&nbsp;&nbsp; 2)&nbsp;&nbsp; 管理都是通过工厂类来同一的管理。<br>&nbsp;&nbsp; 3)&nbsp;&nbsp; 指定分配策略.<br><br>&nbsp;&nbsp; 源码为Vs2008版本...<br><br>&nbsp;&nbsp; <a href="http://www.cppblog.com/Files/expter/Pool.rar">/Files/expter/Pool.rar</a><br><br>关于实现有疑问和建议，可以提出宝贵的意见。。</p>
<img src ="http://www.cppblog.com/expter/aggbug/138787.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2011-01-18 21:20 <a href="http://www.cppblog.com/expter/archive/2011/01/18/138787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个关于容器选取的删除问题。</title><link>http://www.cppblog.com/expter/archive/2011/01/14/138532.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Fri, 14 Jan 2011 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2011/01/14/138532.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/138532.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2011/01/14/138532.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/138532.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/138532.html</trackback:ping><description><![CDATA[<p><br>问题描述: <br>1个容器有大量元素，需要进行erase大部分数据的时候，需要遍历这些元素，然后释放item的空间，还要erase删除其item。<br><br>一个库，为了测试其性能的时候，需要保存所有外部使用者的数据，这里选取了map,vector和list.<br><br>为了简化问题，我写了下面测试代码来测试各个操作:<br>数据节点:</p>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;node<br><img id=Codehighlighter1_12_49_Open_Image onclick="this.style.display='none'; Codehighlighter1_12_49_Open_Text.style.display='none'; Codehighlighter1_12_49_Closed_Image.style.display='inline'; Codehighlighter1_12_49_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_12_49_Closed_Image onclick="this.style.display='none'; Codehighlighter1_12_49_Closed_Text.style.display='none'; Codehighlighter1_12_49_Open_Image.style.display='inline'; Codehighlighter1_12_49_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_12_49_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_12_49_Open_Text><span style="COLOR: #000000">{<br><img id=Codehighlighter1_26_36_Open_Image onclick="this.style.display='none'; Codehighlighter1_26_36_Open_Text.style.display='none'; Codehighlighter1_26_36_Closed_Image.style.display='inline'; Codehighlighter1_26_36_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_26_36_Closed_Image onclick="this.style.display='none'; Codehighlighter1_26_36_Closed_Text.style.display='none'; Codehighlighter1_26_36_Open_Image.style.display='inline'; Codehighlighter1_26_36_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;node(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i)</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_26_36_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_26_36_Open_Text><span style="COLOR: #000000">{data&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;i;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;data;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><span style="COLOR: #008080">&nbsp;1</span><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;_tmain(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;argc,&nbsp;_TCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;argv[])<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_37_1089_Open_Image onclick="this.style.display='none'; Codehighlighter1_37_1089_Open_Text.style.display='none'; Codehighlighter1_37_1089_Closed_Image.style.display='inline'; Codehighlighter1_37_1089_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_37_1089_Closed_Image onclick="this.style.display='none'; Codehighlighter1_37_1089_Closed_Text.style.display='none'; Codehighlighter1_37_1089_Open_Image.style.display='inline'; Codehighlighter1_37_1089_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif"></span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_37_1089_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_37_1089_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">,node</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">&nbsp;Mptable;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::vector</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">node</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;Vec;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;std::list</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">node</span><span style="COLOR: #000000">*&gt;</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Mptable&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapnode;<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;Vec&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vecnode;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;List&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listnode;<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</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;;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100000</span><span style="COLOR: #000000">&nbsp;;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_242_350_Open_Image onclick="this.style.display='none'; Codehighlighter1_242_350_Open_Text.style.display='none'; Codehighlighter1_242_350_Closed_Image.style.display='inline'; Codehighlighter1_242_350_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_242_350_Closed_Image onclick="this.style.display='none'; Codehighlighter1_242_350_Closed_Text.style.display='none'; Codehighlighter1_242_350_Open_Image.style.display='inline'; Codehighlighter1_242_350_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_242_350_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_242_350_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapnode&nbsp;[&nbsp;i&nbsp;]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;node(i);<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vecnode.push_back(&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;node(i)&nbsp;);<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;listnode.push_back(&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;node(i));<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">long</span><span style="COLOR: #000000">&nbsp;time&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;timeGetTime(&nbsp;);<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;Mptable::iterator&nbsp;itr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;mapnode.begin()&nbsp;;&nbsp;itr&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;mapnode.end()&nbsp;;&nbsp;&nbsp;)<br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img id=Codehighlighter1_459_515_Open_Image onclick="this.style.display='none'; Codehighlighter1_459_515_Open_Text.style.display='none'; Codehighlighter1_459_515_Closed_Image.style.display='inline'; Codehighlighter1_459_515_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_459_515_Closed_Image onclick="this.style.display='none'; Codehighlighter1_459_515_Closed_Text.style.display='none'; Codehighlighter1_459_515_Open_Image.style.display='inline'; Codehighlighter1_459_515_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_459_515_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_459_515_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;itr</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">second;<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapnode.erase(&nbsp;itr</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;);<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">map&nbsp;:&nbsp;spend&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;timeGetTime()&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;time&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;msec </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;timeGetTime(&nbsp;);<br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;Vec::iterator&nbsp;itr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;vecnode.begin()&nbsp;;&nbsp;itr&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;vecnode.end()&nbsp;;&nbsp;&nbsp;)<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img id=Codehighlighter1_697_750_Open_Image onclick="this.style.display='none'; Codehighlighter1_697_750_Open_Text.style.display='none'; Codehighlighter1_697_750_Closed_Image.style.display='inline'; Codehighlighter1_697_750_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_697_750_Closed_Image onclick="this.style.display='none'; Codehighlighter1_697_750_Closed_Text.style.display='none'; Codehighlighter1_697_750_Open_Image.style.display='inline'; Codehighlighter1_697_750_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_697_750_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_697_750_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">itr;<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;vecnode.erase(&nbsp;itr&nbsp;);<br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">vector&nbsp;:&nbsp;spend&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;timeGetTime()&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;time&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;msec </span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;time&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;timeGetTime(&nbsp;);<br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;List::iterator&nbsp;itr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;listnode.begin()&nbsp;;&nbsp;itr&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;listnode.end()&nbsp;;&nbsp;&nbsp;)<br></span><span style="COLOR: #008080">43</span><span style="COLOR: #000000"><img id=Codehighlighter1_938_992_Open_Image onclick="this.style.display='none'; Codehighlighter1_938_992_Open_Text.style.display='none'; Codehighlighter1_938_992_Closed_Image.style.display='inline'; Codehighlighter1_938_992_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_938_992_Closed_Image onclick="this.style.display='none'; Codehighlighter1_938_992_Closed_Text.style.display='none'; Codehighlighter1_938_992_Open_Image.style.display='inline'; Codehighlighter1_938_992_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_938_992_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_938_992_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">44</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">itr;<br></span><span style="COLOR: #008080">45</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;itr&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;listnode.erase(&nbsp;itr&nbsp;);<br></span><span style="COLOR: #008080">46</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">47</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">48</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list&nbsp;:&nbsp;spend&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;timeGetTime()&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;time&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;msec</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">49</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">50</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br></span><span style="COLOR: #008080">51</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&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></span><span style="COLOR: #008080">52</span><span style="COLOR: #000000"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">}</span></span></div>
Release下运行结果:<br>map : spend 31 msec<br>vector : spend 3734 msec<br>list : spend 35 msec<br><br><br>发现map的速度最快，vector最慢，list相当。<br><br>其实vector就是一个Array,只是Array是静态大小，vector可以扩展，然后查看vector的erase的源码：<br>
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">iterator&nbsp;erase(const_iterator&nbsp;_Where)<br><img id=Codehighlighter1_40_229_Open_Image onclick="this.style.display='none'; Codehighlighter1_40_229_Open_Text.style.display='none'; Codehighlighter1_40_229_Closed_Image.style.display='inline'; Codehighlighter1_40_229_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_40_229_Closed_Image onclick="this.style.display='none'; Codehighlighter1_40_229_Closed_Text.style.display='none'; Codehighlighter1_40_229_Open_Image.style.display='inline'; Codehighlighter1_40_229_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_40_229_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_40_229_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;erase&nbsp;element&nbsp;at&nbsp;where</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Move(_VIPTR(_Where)&nbsp;</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Mylast,<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_VIPTR(_Where));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Destroy(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Mylast&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Mylast);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Mylast;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(_Make_iter(_Where));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
有一个move操作，原来把当前iterator+1的往前移了，这样的话会遍历iterator后面所有的元素。<br><br><br>关于map的erase原理可以查看map的实现源码:<br>由于map的erase后有一个维护过程，其实map是一个RB-Tree，删除算法相对比较麻烦，删除某个item会查找下一个item替换删除的节点，同时还要考虑红和黑的节点处理。同时还要保证map的erase后，平衡且有序。<br>所以map的erase主要做:<br>1.刪除item.<br>2.让树平衡，且有序。<br><br>list其实是一个双向链表:<br>关于删除其实是0(1)的操作，我们查看list的erase的操作:
<div style="BORDER-BOTTOM: #cccccc 1px solid; BORDER-LEFT: #cccccc 1px solid; PADDING-BOTTOM: 4px; BACKGROUND-COLOR: #eeeeee; PADDING-LEFT: 4px; WIDTH: 98%; PADDING-RIGHT: 5px; FONT-SIZE: 13px; WORD-BREAK: break-all; BORDER-TOP: #cccccc 1px solid; BORDER-RIGHT: #cccccc 1px solid; PADDING-TOP: 4px"><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/None.gif"><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;iterator&nbsp;erase(const_iterator&nbsp;_Where)<br><img id=Codehighlighter1_41_771_Open_Image onclick="this.style.display='none'; Codehighlighter1_41_771_Open_Text.style.display='none'; Codehighlighter1_41_771_Closed_Image.style.display='inline'; Codehighlighter1_41_771_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_41_771_Closed_Image onclick="this.style.display='none'; Codehighlighter1_41_771_Closed_Text.style.display='none'; Codehighlighter1_41_771_Open_Image.style.display='inline'; Codehighlighter1_41_771_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_41_771_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_41_771_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;erase&nbsp;element&nbsp;at&nbsp;_Where</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">#if</span><span style="COLOR: #000000">&nbsp;_ITERATOR_DEBUG_LEVEL&nbsp;==&nbsp;2</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(_Where._Getcont()&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">&nbsp;_Where._Ptr&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Myhead)<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_DEBUG_ERROR(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">list&nbsp;erase&nbsp;iterator&nbsp;outside&nbsp;range</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Nodeptr&nbsp;_Pnode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(_Where</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)._Mynode();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Orphan_ptr(</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">,&nbsp;_Pnode);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #0000ff">#else</span><span style="COLOR: #000000">&nbsp;/*&nbsp;_ITERATOR_DEBUG_LEVEL&nbsp;==&nbsp;2&nbsp;*/</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Nodeptr&nbsp;_Pnode&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(_Where</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)._Mynode();<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;</span><span style="COLOR: #0000ff">#endif</span><span style="COLOR: #000000">&nbsp;/*&nbsp;_ITERATOR_DEBUG_LEVEL&nbsp;==&nbsp;2&nbsp;*/</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(_Pnode&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Myhead)<br><img id=Codehighlighter1_452_736_Open_Image onclick="this.style.display='none'; Codehighlighter1_452_736_Open_Text.style.display='none'; Codehighlighter1_452_736_Closed_Image.style.display='inline'; Codehighlighter1_452_736_Closed_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"><img style="DISPLAY: none" id=Codehighlighter1_452_736_Closed_Image onclick="this.style.display='none'; Codehighlighter1_452_736_Closed_Text.style.display='none'; Codehighlighter1_452_736_Open_Image.style.display='inline'; Codehighlighter1_452_736_Open_Text.style.display='inline';" align=top src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="BORDER-BOTTOM: #808080 1px solid; BORDER-LEFT: #808080 1px solid; BACKGROUND-COLOR: #ffffff; DISPLAY: none; BORDER-TOP: #808080 1px solid; BORDER-RIGHT: #808080 1px solid" id=Codehighlighter1_452_736_Closed_Text><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_452_736_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;not&nbsp;list&nbsp;head,&nbsp;safe&nbsp;to&nbsp;erase</span><span style="COLOR: #008000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Nextnode(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Prevnode(_Pnode))&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Nextnode(_Pnode);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Prevnode(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Nextnode(_Pnode))&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Prevnode(_Pnode);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_Dest_val(</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Alnod,&nbsp;_Pnode);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Alnod.deallocate(_Pnode,&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #0000ff">this</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">_Mysize;<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;(_Make_iter(_Where));<br><img align=top src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
主要代码删除就是下面删除部分:<br>对prev和next节点进行处理即可。<br><br>关于list的移除竟然比map还要慢.<br><br>PS：测试为单线程。<br><br>当为100W数据的时候:<br>map : spend 300 msec<br>list :&nbsp;&nbsp; spend 385 msec<br><br>咋list比map容器还要慢？<br>还是上面的代码不能说明问题。<br>
<img src ="http://www.cppblog.com/expter/aggbug/138532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2011-01-14 14:58 <a href="http://www.cppblog.com/expter/archive/2011/01/14/138532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于CEGUI的StaticText的超级链接实现</title><link>http://www.cppblog.com/expter/archive/2010/07/22/121064.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Thu, 22 Jul 2010 14:12:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2010/07/22/121064.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/121064.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2010/07/22/121064.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/121064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/121064.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; &nbsp;基本上实现一个基于静态文本多任务的过程.<br><br>注：主要针对当前CEGUI的最新库0.7.1。<br><br>目的：游戏制作过程中一般打开NPC会弹出一个对话框，一般对话框就是显示一段话，有图片，超链接，文字，同时文本分别有不同的颜色！<br>那么只要我们输入一段文本，对话框的控件解析文本定义好的标签然后显示所有文本内容和图片即可。<br><br>实现方式:&nbsp;<br>1.超链接控件既要响应点击消息，又要有超级链接标记的下划线。实现方式主要参考了Button的Clicked事件，StaticText的render渲染过程，重新写的一个基于超级链接组件。<br>2.文本解析利用了当前CEGUI的版本的BasicRenderedStringParser类，我们只需要继承此类，然后设置系统默认的文本解析类为我们当前的类。<br>3.写超级链接组件的渲染过程主要方便支持CELayoutEditor的可视化编辑。<br><br>实现结果:<br>1.文本显示颜色。<br>2.换行操作。<br>3.支持超级链接的显示，以及事件响应和事件处理，事件响应为CEGUI::HyperText::EventClicked。<br>4.超链接的下划线绘制。<br>5.支持图片显示和支持图片事件响应。<br><br><br>假设我们的解析文本如下:<br>标签定义如下<br>[N]则是换行字符<br>[C]字体颜色<br>[A]超级链接<br>[M]图片<br><br>相对来说编写此文本比较简单.<br><br>具体用法<br>xxx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显示文本xxx<br>[C&nbsp; XX]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xx表示32位的字体颜色<br>[A 1: XX]&nbsp;&nbsp;&nbsp;xx 超级链接显示内容。<br>[M&nbsp; xx]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; xx表示图片名字<br><br>colorTest:[N]<br>StaticTxt test1![N]<br>[C FFFF0000]StaticTxt test2!&nbsp; &nbsp; [N]<br>[C FFFFFF00]StaticTxt test3!&nbsp;&nbsp; [N] [N] [N] <br><br>[C FFFF0000]HyperLink Test:&nbsp; [N] <br>[A 1:this is the Hyperlink!this is the&nbsp; Hyperlink!][N]<br>[A 2:this is the second Hyperlink! this is hyperlink!!!][N]<br>[A 3:this is the third hyperlink!this is hyperlink!this is hyperlink!this is hyperlink!]<br>[N] [N] [N] <br>Image Text:[M 381] [M 286] [M 669]<br><br><br>具体过程：<br><img height=490 alt="" src="http://www.cppblog.com/images/cppblog_com/expter/dddd.jpg" width=417 border=0><br><br>后期目标支持动画的显示，比如GIF格式图片.<br><br>实现过程相对繁琐，而且涉及datafiles配置一些处理。<br><br>可能真正游戏界面上的实现可能会更丰富，其实也就是增加几个标签然后解析即可。<br><br><br>注：上次听盖老板说有本书专门介绍足球AI，然后专门去买了，看其介绍他实现上足球仿真AI专门实现比较智能，先学习学习他的在继续写我的了。。<br>
<img src ="http://www.cppblog.com/expter/aggbug/121064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2010-07-22 22:12 <a href="http://www.cppblog.com/expter/archive/2010/07/22/121064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个基于足球AI仿真机的模拟实现</title><link>http://www.cppblog.com/expter/archive/2010/06/30/119019.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Wed, 30 Jun 2010 15:36:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2010/06/30/119019.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/119019.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2010/06/30/119019.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/119019.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/119019.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; author:expter<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date&nbsp;&nbsp; 2010/06/30<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 介绍:&nbsp; 世界杯现在如此的备受瞩目和关注，本文介绍如何实现一个基于足球AI的实现，而作为程序员我们关注的不是目标用其赢得世界杯，而是创造一个把球踢好的智能体，加上最近上班轻松，晚上较闲，加上去年实现的一个AI模型与平时写的游戏智能算法，想组织起来完成一个足球模拟玩玩。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 本文会首先介绍一种基于AI仿真机的实现流程图，后面我将会用大量的篇幅详细介绍各个实现细节，与具体足球战术，此足球AI主要是主动攻击性AI，所以还需要具体完善加强防御性的AI,所以具体代码现在将不会现在放出。以后实现完整过后会完整公开，现在主要设计描述如下。<br>&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 足球的游戏规则不是很复杂，就是2个球队，然后每个球队一个守门员与几名球员，目的就是踢进对方的球门。简单的足球是没有傻子的，也就没有犯规，越位，头球，点球以及乌龙球。以后可能会增加上面几种。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一个简单的游戏的具体环境如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.一个足球场(FootBallPitch)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.一个足球&nbsp;&nbsp;&nbsp;&nbsp; FootBall<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.二个球门&nbsp;&nbsp;&nbsp;&nbsp; Goal<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.二个球队&nbsp;&nbsp;&nbsp;&nbsp; FootBallTeam<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.场上12名足球队员（每队6名，期中5名为球员2名后卫3名前锋，还有1名守门员）<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.球员&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FootBaller&nbsp;&nbsp;&nbsp; 守门员&nbsp; GoalKeeper<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; 然后只要理清上面的描述然后把具体的实现封装到每个类中，就实现了1个简单的足球仿真模拟，实现上面的功能代码还是简单，但是如何组织强大攻击性强大，防御性强的AI还是挺复杂的。<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面将给出具体ＵＭＬ实现类图：&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height=612 alt="" src="http://www.cppblog.com/images/cppblog_com/expter/ball.JPG" width=665 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于是基于智能体的足球ＡＩ所以还是借鉴了ＦＳＭ模型，我们可以把每个Player处于不同的状态进行不同的操作，具体把操作类型和事件处理都放在具体的状态中。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于球场上运球的FootBaller有下列状态ChaseBall 追球状态，Dribble运球&nbsp; Gohome 归位&nbsp;&nbsp; KickBall 踢球&nbsp; ReceviveBall传球&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基于守门员GoalKeeper有InterceptBall 拦截&nbsp; PutBallBackInPlay发球.<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里为了区分队员是前锋还是后卫，我们给队员增加一个行为Behaviors，让其根据自己的行为做相应的事情.。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其中所有的图像处理都是用的GDI的绘制，程序采用的Win32编写方式。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上面的设计基本是现在程序的设计方案和流程图。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 后期完善部分：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.引入基于事件响应，FootBaller&nbsp;可以通知同队FootBaller&nbsp;的接收响应的消息处理，比如A发现B的位置很好，A可以通知B我要传球到一个坐标点。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.加强防御和攻击AI。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.完成具体方案后，公布所有的方案设计和具体算法，后期引入脚本机制，通过外部编写脚本实现不同队伍AI模拟。&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.cppblog.com/expter/aggbug/119019.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2010-06-30 23:36 <a href="http://www.cppblog.com/expter/archive/2010/06/30/119019.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于策略的一种高效内存池的实现</title><link>http://www.cppblog.com/expter/archive/2010/04/14/112594.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Wed, 14 Apr 2010 15:23:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2010/04/14/112594.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/112594.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2010/04/14/112594.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/112594.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/112594.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一.XXX&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1)概念说明&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这里不再具体描述内存池的概念和作用,需要了解请看http://baike.baidu.com/view/2659852.htm?fr=ala0_1_1。&nbsp;&nbsp;&nbsp;&nbs...&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2010/04/14/112594.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/112594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2010-04-14 23:23 <a href="http://www.cppblog.com/expter/archive/2010/04/14/112594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个高效的定时器分析及设计</title><link>http://www.cppblog.com/expter/archive/2010/03/05/108977.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Fri, 05 Mar 2010 08:28:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2010/03/05/108977.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/108977.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2010/03/05/108977.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/108977.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/108977.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于一个游戏而言，定时器是必须的，而它一般作为一个游戏基本公共组件，而定时器在游戏逻辑中运用是非常明显的(比如吃药回血，每几秒回血多少)，而对于游戏逻辑而言需要开发一个高效率高精度(毫秒级别)的定时器。&nbsp;&nbsp;&nbsp;&nbsp; 一：分析Ace库定时器实现方式&nbsp;&nbsp; 1.Ace种定...&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2010/03/05/108977.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/108977.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2010-03-05 16:28 <a href="http://www.cppblog.com/expter/archive/2010/03/05/108977.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个小型的IOCP网络库</title><link>http://www.cppblog.com/expter/archive/2009/12/20/103566.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 20 Dec 2009 06:21:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/12/20/103566.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/103566.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/12/20/103566.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/103566.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/103566.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;基本网络框架基于IOCP模型，这次主要在以前写的IPC通信的基础上修改，参考了当前项目网络库的设计思路。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 先介绍几个主要的类:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.CSocket重新套接字，CConnection继承CSocket表示一个连接对象主要重写Recv和Send接口，以及组包过程。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.CAccept处理客户端的链接，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.Cpacket一个消息数据包头，CMessage继承CPacket带数据消息包。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.CConnectManger保存一个连接CConnection的内存池对象，CAcceptManager一个接收客户端Accept的线程，CPacketManager参考了Loki的小对象管理做的一个缓冲区数据包内存池。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.CLibObject包含上面3个Manager(Singleton)，CNetWork网络初始化。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.CIOCP类主要IO的线程类，接收处理所有的客户端连接CConnection。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.CServer类包括一个IOCP初始化和网络库管理类，IOCP会把接收到的数据重组成数据包后保存到CServer的一个CMsgQueue中.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.我们的重写一个Server只需要继承CServer，然后实现run和AccedeProcess即可。run从CMsgQueue缓冲区提取一个消息包，AccedeProcess处理消息。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一些细节设计:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.为了节约带宽Connection这里采用了Negles算法，这里采用Negle的并没有马上把每一个需要发送MSG采用缓存队列的方式保存起来，而是每一个Connection自身都保存数据，CServer通过一个线程把每一个存在的Connection是否有消息缓存，然后发送。因而让IOCP只处理接收的消息，发送消息通过CServer来处理。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;出网络库基本框架如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br><img height=619 alt="" src="http://www.cppblog.com/images/cppblog_com/expter/NetLib.jpg" width=812 border=0>&nbsp; <br><br>网络库代码的代码<a href="http://code.google.com/p/tpgame/source/browse/#svn/trunk/GServerEngine/NetLibrary">http://code.google.com/p/tpgame/source/browse/#svn/trunk/GServerEngine/NetLibrary</a></p>
<p>问题肯定较多，希望多多指教。<br><br><br>最近一直在构思与写一套游戏AI系统，主要是通过状态机响应事件，更多是想运用自己学习到的一些优秀的算法，以及一些高级</p>
<p>的AI以此来锻炼对一些复杂的数据结构的编写和设计思维的提升。</p>
<p>算法和数据结构方面:<br>1.2D和3D寻路(主要包括2D寻路的初始化条件优化 ，3D的空间划分以及多叉树的划分，以及堆维护)。<br>2.带有更多思维的角色系统(附带更多的数据信息)判断。<br>3.查询线段树和树状数数组的运用。<br>4.一个线性的字符串过滤程序。<br>5.一个动态基于角色的最优二叉查找树的动态维护。(主要解决不同的角色AI触发频率建立一颗最优二叉查找树)<br>6.追踪算法以及游戏的群集算法都会整合到现在的AI系统中。<br><br>设计方面：<br>1.尽量让类之间耦合性更小，复杂度更低，浅显明确。<br><br>注：Ai系统写完会把代码和网络库的最新代码更新都会上传，希望大家多多指教。<br><br><br><br><br></p>
<img src ="http://www.cppblog.com/expter/aggbug/103566.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-12-20 14:21 <a href="http://www.cppblog.com/expter/archive/2009/12/20/103566.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个字典生成算法几种解法:</title><link>http://www.cppblog.com/expter/archive/2009/11/08/100386.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sat, 07 Nov 2009 16:56:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/11/08/100386.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/100386.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/11/08/100386.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/100386.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/100386.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 最近做一个东西正好需要生成字典的算法，类似一些密码字典生成器(主要运用在暴力破解)。生成的密码会根据密码长度与字典集合的长度成指数关系。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以用一个函数来表示<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f(&nbsp;x , y &nbsp;)&nbsp; = x ^y ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x表示我们要生产的密码长度，y表示我们要生成的密码字典字符集合。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当时想到就有3个算法。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; 1.循环<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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"><span style="COLOR: #008080">&nbsp;1</span><img id=Codehighlighter1_0_29_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_29_Open_Text.style.display='none'; Codehighlighter1_0_29_Closed_Image.style.display='inline'; Codehighlighter1_0_29_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_29_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_29_Closed_Text.style.display='none'; Codehighlighter1_0_29_Open_Image.style.display='inline'; Codehighlighter1_0_29_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_29_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_0_29_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;Dict&nbsp;为生成的密码&nbsp;，&nbsp;g_Dict为字典集合</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">&nbsp;2</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&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;;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;Len&nbsp;&nbsp;;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img id=Codehighlighter1_65_253_Open_Image onclick="this.style.display='none'; Codehighlighter1_65_253_Open_Text.style.display='none'; Codehighlighter1_65_253_Closed_Image.style.display='inline'; Codehighlighter1_65_253_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_65_253_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_65_253_Closed_Text.style.display='none'; Codehighlighter1_65_253_Open_Image.style.display='inline'; Codehighlighter1_65_253_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_65_253_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"></span><span id=Codehighlighter1_65_253_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Dict[</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_Dict[i];<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&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;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;Len&nbsp;;&nbsp;j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_125_251_Open_Image onclick="this.style.display='none'; Codehighlighter1_125_251_Open_Text.style.display='none'; Codehighlighter1_125_251_Closed_Image.style.display='inline'; Codehighlighter1_125_251_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_125_251_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_125_251_Closed_Text.style.display='none'; Codehighlighter1_125_251_Open_Image.style.display='inline'; Codehighlighter1_125_251_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_125_251_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"></span><span id=Codehighlighter1_125_251_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dict[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_Dict[j];<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&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;;&nbsp;k&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;Len&nbsp;;&nbsp;k</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img id=Codehighlighter1_189_248_Open_Image onclick="this.style.display='none'; Codehighlighter1_189_248_Open_Text.style.display='none'; Codehighlighter1_189_248_Closed_Image.style.display='inline'; Codehighlighter1_189_248_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_189_248_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_189_248_Closed_Text.style.display='none'; Codehighlighter1_189_248_Open_Image.style.display='inline'; Codehighlighter1_189_248_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_189_248_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"></span><span id=Codehighlighter1_189_248_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dict[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_Dict[k];<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id=Codehighlighter1_219_243_Open_Image onclick="this.style.display='none'; Codehighlighter1_219_243_Open_Text.style.display='none'; Codehighlighter1_219_243_Closed_Image.style.display='inline'; Codehighlighter1_219_243_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_219_243_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_219_243_Closed_Text.style.display='none'; Codehighlighter1_219_243_Open_Image.style.display='inline'; Codehighlighter1_219_243_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_219_243_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_219_243_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;几位密码就嵌套几层循环<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这种方式移植不好，而且代码臃肿。<br>&nbsp;&nbsp;&nbsp; 2.递归<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;做过字符串的全排列的都明白这个算法，这种也是基于这种方式：但是由于随着字典集合或者密码长度的增加，很容易会出现堆栈的内存溢出。<br>&nbsp;&nbsp;&nbsp;&nbsp;&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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;solve(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;p&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;s,</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_40_207_Open_Image onclick="this.style.display='none'; Codehighlighter1_40_207_Open_Text.style.display='none'; Codehighlighter1_40_207_Closed_Image.style.display='inline'; Codehighlighter1_40_207_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_40_207_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_40_207_Closed_Text.style.display='none'; Codehighlighter1_40_207_Open_Image.style.display='inline'; Codehighlighter1_40_207_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_40_207_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"></span><span id=Codehighlighter1_40_207_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;i;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;s&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;n&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img id=Codehighlighter1_66_118_Open_Image onclick="this.style.display='none'; Codehighlighter1_66_118_Open_Text.style.display='none'; Codehighlighter1_66_118_Closed_Image.style.display='inline'; Codehighlighter1_66_118_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_66_118_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_66_118_Closed_Text.style.display='none'; Codehighlighter1_66_118_Open_Image.style.display='inline'; Codehighlighter1_66_118_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_66_118_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"></span><span id=Codehighlighter1_66_118_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_71_116_Open_Image onclick="this.style.display='none'; Codehighlighter1_71_116_Open_Text.style.display='none'; Codehighlighter1_71_116_Closed_Image.style.display='inline'; Codehighlighter1_71_116_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_71_116_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_116_Closed_Text.style.display='none'; Codehighlighter1_71_116_Open_Image.style.display='inline'; Codehighlighter1_71_116_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_71_116_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_71_116_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">std::cout&nbsp;</span><span style="COLOR: #808080">&lt;&lt;&nbsp;Dict&nbsp;&lt;&lt;&nbsp;std::endl;<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #808080"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;;</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">&nbsp;8</span><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(s</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">n</span><span style="COLOR: #000000">||</span><span style="COLOR: #000000">p</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">n)<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(&nbsp;i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">p&nbsp;;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;len&nbsp;;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img id=Codehighlighter1_176_205_Open_Image onclick="this.style.display='none'; Codehighlighter1_176_205_Open_Text.style.display='none'; Codehighlighter1_176_205_Closed_Image.style.display='inline'; Codehighlighter1_176_205_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_176_205_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_176_205_Closed_Text.style.display='none'; Codehighlighter1_176_205_Open_Image.style.display='inline'; Codehighlighter1_176_205_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_176_205_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"></span><span id=Codehighlighter1_176_205_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;solve(len,i</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,s</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,n);&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br>&nbsp;&nbsp;&nbsp; 3.BFS<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有了前2种方法的不错，然后写了一个非递归的算法<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要借用横向扫描的方式，借鉴一个数组来进行记录当前应该生成的密码。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 主要算法如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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"><span style="COLOR: #008080">&nbsp;1</span><img id=Codehighlighter1_0_52_Open_Image onclick="this.style.display='none'; Codehighlighter1_0_52_Open_Text.style.display='none'; Codehighlighter1_0_52_Closed_Image.style.display='inline'; Codehighlighter1_0_52_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_0_52_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_0_52_Closed_Text.style.display='none'; Codehighlighter1_0_52_Open_Image.style.display='inline'; Codehighlighter1_0_52_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top><span id=Codehighlighter1_0_52_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_0_52_Open_Text><span style="COLOR: #008000">/*</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;生成字典的函数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@parm&nbsp;&nbsp;需要生成的长度&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top></span><span style="COLOR: #008000">*/</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;MakeDict(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;Len&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_79_642_Open_Image onclick="this.style.display='none'; Codehighlighter1_79_642_Open_Text.style.display='none'; Codehighlighter1_79_642_Closed_Image.style.display='inline'; Codehighlighter1_79_642_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_79_642_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_79_642_Closed_Text.style.display='none'; Codehighlighter1_79_642_Open_Image.style.display='inline'; Codehighlighter1_79_642_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_79_642_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"></span><span id=Codehighlighter1_79_642_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;Dict[MaxDictLen</span><span style="COLOR: #000000">+</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">&nbsp;生成的字典字符串</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array[MaxDictLen];&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;记录当前应该生成字典数组</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;memset(&nbsp;Array&nbsp;,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(Array)&nbsp;);<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;bStop&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #0000ff">true</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i,j;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&nbsp;;&nbsp;bStop&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: #008000">//</span><span style="COLOR: #008000">&nbsp;是否生成完毕</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #008000"><img id=Codehighlighter1_275_640_Open_Image onclick="this.style.display='none'; Codehighlighter1_275_640_Open_Text.style.display='none'; Codehighlighter1_275_640_Closed_Image.style.display='inline'; Codehighlighter1_275_640_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_275_640_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_275_640_Closed_Text.style.display='none'; Codehighlighter1_275_640_Open_Image.style.display='inline'; Codehighlighter1_275_640_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_275_640_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"></span><span id=Codehighlighter1_275_640_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&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;;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;Len&nbsp;;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;)<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img id=Codehighlighter1_311_346_Open_Image onclick="this.style.display='none'; Codehighlighter1_311_346_Open_Text.style.display='none'; Codehighlighter1_311_346_Closed_Image.style.display='inline'; Codehighlighter1_311_346_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_311_346_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_311_346_Closed_Text.style.display='none'; Codehighlighter1_311_346_Open_Image.style.display='inline'; Codehighlighter1_311_346_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_311_346_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"></span><span id=Codehighlighter1_311_346_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dict[i]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;g_Dict[Array[i]];<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dict[Len]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;Dict&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img id=Codehighlighter1_407_419_Open_Image onclick="this.style.display='none'; Codehighlighter1_407_419_Open_Text.style.display='none'; Codehighlighter1_407_419_Closed_Image.style.display='inline'; Codehighlighter1_407_419_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_407_419_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_407_419_Closed_Text.style.display='none'; Codehighlighter1_407_419_Open_Image.style.display='inline'; Codehighlighter1_407_419_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_407_419_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_407_419_Open_Text><span style="COLOR: #808080">///</span><span style="COLOR: #008000">&nbsp;字典数组坐标更新</span><span style="COLOR: #808080"></span></span><br><span style="COLOR: #008080">26</span><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(&nbsp;j&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;Len&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;&nbsp;;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;;&nbsp;&nbsp;j&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id=Codehighlighter1_465_637_Open_Image onclick="this.style.display='none'; Codehighlighter1_465_637_Open_Text.style.display='none'; Codehighlighter1_465_637_Closed_Image.style.display='inline'; Codehighlighter1_465_637_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_465_637_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_465_637_Closed_Text.style.display='none'; Codehighlighter1_465_637_Open_Image.style.display='inline'; Codehighlighter1_465_637_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_465_637_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"></span><span id=Codehighlighter1_465_637_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array[j]&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">&nbsp;;<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;Array[j]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;((</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">)g_Dict.length())&nbsp;)<br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img id=Codehighlighter1_531_548_Open_Image onclick="this.style.display='none'; Codehighlighter1_531_548_Open_Text.style.display='none'; Codehighlighter1_531_548_Closed_Image.style.display='inline'; Codehighlighter1_531_548_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_531_548_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_531_548_Closed_Text.style.display='none'; Codehighlighter1_531_548_Open_Image.style.display='inline'; Codehighlighter1_531_548_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_531_548_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"></span><span id=Codehighlighter1_531_548_Open_Text><span style="COLOR: #000000">{&nbsp;<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">break</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img id=Codehighlighter1_561_633_Open_Image onclick="this.style.display='none'; Codehighlighter1_561_633_Open_Text.style.display='none'; Codehighlighter1_561_633_Closed_Image.style.display='inline'; Codehighlighter1_561_633_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_561_633_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_561_633_Closed_Text.style.display='none'; Codehighlighter1_561_633_Open_Image.style.display='inline'; Codehighlighter1_561_633_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_561_633_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"></span><span id=Codehighlighter1_561_633_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Array&nbsp;[j]&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">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;j&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;生成完毕</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">38</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></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;bStop&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">false</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;<br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">40</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">41</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">42</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<br>附上第三个生成算法源码:<br><a href="http://www.cppblog.com/Files/expter/MakeDict.rar">link</a> 
<img src ="http://www.cppblog.com/expter/aggbug/100386.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-11-08 00:56 <a href="http://www.cppblog.com/expter/archive/2009/11/08/100386.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个问题，如何优化？ 是否有高效的算法</title><link>http://www.cppblog.com/expter/archive/2009/10/18/98903.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 18 Oct 2009 14:27:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/10/18/98903.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/98903.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/10/18/98903.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/98903.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/98903.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问题描述如下:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2个整数(int32)，我需要对这2个数的第n位进行二进制数交换值。是否有一个高效的算法，或者高效的运算。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子如下:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2个整数10，7，把第1位的数值交换。</p>
<p>&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; 交换后的值</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x1010&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x1011&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0x0110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我的思路如下:</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.如果要对第n位数值交换，先求出第n位的值(1或者0),如果相等则不交换。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.交换第n位，通过通过原理发现只需通过加减法运算即可，如果1-&gt;0 则减&nbsp;&nbsp; 1&lt;&lt;(n-1)&nbsp; ，否则加1&lt;&lt;(n-1)。 </p>
<p>代码如下：</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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;prjfun(&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;des&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;src&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;n)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_46_279_Open_Image onclick="this.style.display='none'; Codehighlighter1_46_279_Open_Text.style.display='none'; Codehighlighter1_46_279_Closed_Image.style.display='inline'; Codehighlighter1_46_279_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_46_279_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_46_279_Closed_Text.style.display='none'; Codehighlighter1_46_279_Open_Image.style.display='inline'; Codehighlighter1_46_279_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_46_279_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"></span><span id=Codehighlighter1_46_279_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;n&nbsp;</span><span style="COLOR: #000000">&lt;=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">&nbsp;)&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(des&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)))&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;求出第n位的数值</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;y&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;(src&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)))&nbsp;</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;求出第n位的数值</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(&nbsp;x&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;y&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img id=Codehighlighter1_190_277_Open_Image onclick="this.style.display='none'; Codehighlighter1_190_277_Open_Text.style.display='none'; Codehighlighter1_190_277_Closed_Image.style.display='inline'; Codehighlighter1_190_277_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_190_277_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_190_277_Closed_Text.style.display='none'; Codehighlighter1_190_277_Open_Image.style.display='inline'; Codehighlighter1_190_277_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_190_277_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"></span><span id=Codehighlighter1_190_277_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;des&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(y</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">x)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;交换</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stc&nbsp;</span><span style="COLOR: #000000">+=</span><span style="COLOR: #000000">&nbsp;(x</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">y)</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">(n</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;交换</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否有一种高效的算法，只是进行一，两步位与或运算即可。。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.cppblog.com/expter/aggbug/98903.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-10-18 22:27 <a href="http://www.cppblog.com/expter/archive/2009/10/18/98903.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>3D游戏寻路算法(A*) </title><link>http://www.cppblog.com/expter/archive/2009/10/10/98282.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sat, 10 Oct 2009 14:50:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/10/10/98282.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/98282.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/10/10/98282.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/98282.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/98282.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;关于游戏寻路，网络上也有很多相关的文章，一般都是已A*为主，他只是一种启发式搜索，最开始写A*是在大三，主要还是做一个路径搜索的算法。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于游戏中A*的算法优化，由于在搜索的过程中会通过open表和close保存一些结点，为了加快查找效率一般采用对维护的方式，利用map的最小堆(按照估价值的大小排序)来构架数据结构。其实还可以利用线性的hash_map来创建维护。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 而3D中游戏寻路也是采用同样的方法，只是在不同于2D的8个方向搜索而是3*8个方向的搜索。所以他的复杂度之高，在对于一个3维的N*N*N的空间，他的搜索运算为n^3*24，就需要考虑算法中的优化。<br>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 总之一句3D寻路费时又费空间！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是我总结的优化&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.总体还是利用a*和堆维护。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.由于点是实心，可以直接进行对角线的行走，也就是对角线行走一步后x,y,z的坐标都会改变，从而降低通过2次二维变换的过程。二步变一步！<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.利用凸包的方式来优化。<br></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.把一个场景的3D地图全部细分，利用多叉树进行管理。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 关于凸包的优化可以通过这样一个例子说明(因为在2D中更好的描述通过2维的地图)：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A、假设1要到2的，通过A*的搜索，他会先到0然后发现不能通过在回溯，重新寻找新的路径，这样可能浪费一些搜索时间。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height=202 alt="" src="http://www.cppblog.com/images/cppblog_com/expter/1.GIF" width=241 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; B.&nbsp;&nbsp; 可以通过多边形的最小矩形凸包的方式，这样就可以减少不必要的搜索，如图所示。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img height=202 alt="" src="http://www.cppblog.com/images/cppblog_com/expter/2.GIF" width=241 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;那么1到2就不会经过0点。。因为次区域设置为不可通过。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; C.&nbsp;&nbsp; 如果我们要查找的点在我们凸包内，所以我们在寻路最开始应该验证点是否在凸包内，如果在此区域内，在行走时不能过滤这个矩形空间。</p>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：游戏中地图一般是不变的，所以这些都是不变，凸包已知，验证点在凸包中也是线性的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于在计算3D的凸包的时候计算量大，最开始采用静态的方式来记录数据。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 简单的3D寻路算法源码(不包含凸包优化)： </p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a href="http://www.cppblog.com/Files/expter/3DAStar.rar"><u><font color=#0000ff>/Files/expter/3DAStar.rar</font></u></a> 
<img src ="http://www.cppblog.com/expter/aggbug/98282.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-10-10 22:50 <a href="http://www.cppblog.com/expter/archive/2009/10/10/98282.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>游戏中常见的几种追踪算法</title><link>http://www.cppblog.com/expter/archive/2009/10/09/98210.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Fri, 09 Oct 2009 15:57:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/10/09/98210.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/98210.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/10/09/98210.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/98210.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/98210.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; 所谓追踪，相对于另外一个角色来说是逃跑，首先需要做出追和逃跑的决策判断。<br><br>1.坐标追踪<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也是最基本追逐方式，他根据要追踪对象的坐标来修改追踪者的坐标，使两者的距离逐渐缩短。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个简单的例子:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;&nbsp; m_pPrey;&nbsp;&nbsp; /// 被追踪者<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Point&nbsp;&nbsp; m_pAtta;&nbsp;&nbsp; ///&nbsp; 追踪者<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 对于追踪者来说： &nbsp; 新位置 =&nbsp; 旧位置 +&nbsp; XY速度 ;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;m_pAtta.x&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m_pPrey.x&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pAtta.x&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;m_pAtta.x&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;m_pPrey.x&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pAtta.x&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;m_pAtta.y&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;m_pPrey.y&nbsp;)<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pAtta.y&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(&nbsp;m_pAtta.y&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;m_pPrey.y&nbsp;)<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;m_pAtta.y&nbsp;</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;</span></div>
<p>&nbsp;<br>2.视线追踪<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 视线追踪方式，主要是描述每一时刻都追踪者会沿着被追逐者之间的直线方向运动。如图所示：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img style="WIDTH: 423px; HEIGHT: 363px" height=363 alt="" src="http://www.cppblog.com/images/cppblog_com/expter/sightat.JPG" width=423 border=0><br>&nbsp;&nbsp;&nbsp;&nbsp; 通过图可以更好描述此问题，此问题的求解关键在于求出连接追踪者与猎物之间的直线，可以通过向量知道：2个向量想减即可得到。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以分别用追踪者与猎物的位置坐标构造出两个向量,假设b 代表追踪者位置向量,a 代表猎物位置向量。做向量减法a-b 便得到了向量c，将c 的起点置于追踪者的位置上,就得到了一条指向猎物的向量c. 此时，令： </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;追踪者X 方向速度&nbsp;/ 追踪者Y 方向速度&nbsp;&nbsp;&nbsp;&nbsp;＝&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c 向量x 轴分量/ &nbsp; c 向量y 轴分量 .即可求解。<br><br>3.<span style="FONT-SIZE: 10.5pt; FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-bidi-font-size: 12.0pt; mso-hansi-font-family: 'Times New Roman'; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">拦截追踪<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 所谓拦截追踪，如果考虑的是被追逐的目标太远，如果2者速度一样，或者相差不大，有可能很难追上，玩过实况足球的都知道，如果采用上面的2中追逐方式，可能错过最佳的防守位置。下面是拦截追踪的一个示例图:<br><br>&nbsp;&nbsp;&nbsp; <img height=230 alt="" src="http://www.cppblog.com/images/cppblog_com/expter/pred.GIF" width=288 border=0><br>&nbsp;&nbsp;&nbsp; 对于追踪者来说，他只需要知道被追踪者的位置，方向与速度，讲会计算一个最佳的拦截位置。然后你会发现这只是一个简单的追踪问题。且需要的时间t最少。<br><br><br>整个3种追踪的源码代码 以及 demo都共享：<br><a href="http://www.cppblog.com/Files/expter/chase.rar">/Files/expter/chase.rar</a><br><br>下一篇通过实例demo来记录学习的聚类算法：</span> </p>
<img src ="http://www.cppblog.com/expter/aggbug/98210.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-10-09 23:57 <a href="http://www.cppblog.com/expter/archive/2009/10/09/98210.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>定制自己的new 和 delete，让对象在静态块上进行分配。</title><link>http://www.cppblog.com/expter/archive/2009/08/16/93511.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 16 Aug 2009 11:47:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/08/16/93511.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/93511.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/08/16/93511.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/93511.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/93511.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要:       定制自己的new 和 delete，让对象在静态块上进行分配。<br>      一般常见的new和delete操作符，就意味着使用堆进行内存分配，使用new操作符是名为operator new的函数调用，且函数返回返回一个指向某块内存分配器分配内存指针。<br>      对于内存的分配到底从哪儿来没有任何限制，它可能来自一个特殊的堆，也可能来自一个静态分配的块，也可能来自一个标准容器内部，也可能来自某个函数范围的局部存储区。而对于现在的各自软件中主流内存管理方式，一般通过内存池的管理方式，它可能即包含静态分配也同时包含动态分配。&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2009/08/16/93511.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/93511.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-08-16 19:47 <a href="http://www.cppblog.com/expter/archive/2009/08/16/93511.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最新学习笔记</title><link>http://www.cppblog.com/expter/archive/2009/07/13/89975.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Mon, 13 Jul 2009 15:16:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/07/13/89975.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/89975.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/07/13/89975.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/89975.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/89975.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 最新学习笔记&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2009/07/13/89975.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/89975.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-07-13 23:16 <a href="http://www.cppblog.com/expter/archive/2009/07/13/89975.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个关键字过滤算法</title><link>http://www.cppblog.com/expter/archive/2009/07/12/89895.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 12 Jul 2009 14:07:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/07/12/89895.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/89895.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/07/12/89895.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/89895.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/89895.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一个关键字过滤算法&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2009/07/12/89895.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/89895.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-07-12 22:07 <a href="http://www.cppblog.com/expter/archive/2009/07/12/89895.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>稳住心态，继续前进。。</title><link>http://www.cppblog.com/expter/archive/2009/04/26/81106.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 26 Apr 2009 03:05:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/04/26/81106.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/81106.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/04/26/81106.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/81106.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/81106.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 稳住心态，继续前进。。&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2009/04/26/81106.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/81106.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-04-26 11:05 <a href="http://www.cppblog.com/expter/archive/2009/04/26/81106.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些代码总结(特化类的友元模板重载，常见内存泄漏)</title><link>http://www.cppblog.com/expter/archive/2009/04/22/80782.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Wed, 22 Apr 2009 14:21:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/04/22/80782.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/80782.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/04/22/80782.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/80782.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/80782.html</trackback:ping><description><![CDATA[A.特化类的友元模板函数的操作符重载<br><br>最近写一测试代码关于特化类的友元模板函数的操作符重载遇到一问题。<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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">#pragma&nbsp;region&nbsp;类DTest信息<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;声明一个类</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;DTest<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img id=Codehighlighter1_77_329_Open_Image onclick="this.style.display='none'; Codehighlighter1_77_329_Open_Text.style.display='none'; Codehighlighter1_77_329_Closed_Image.style.display='inline'; Codehighlighter1_77_329_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_77_329_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_77_329_Closed_Text.style.display='none'; Codehighlighter1_77_329_Open_Image.style.display='inline'; Codehighlighter1_77_329_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_77_329_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"></span><span id=Codehighlighter1_77_329_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;构造函数</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DTest()<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img id=Codehighlighter1_106_144_Open_Image onclick="this.style.display='none'; Codehighlighter1_106_144_Open_Text.style.display='none'; Codehighlighter1_106_144_Closed_Image.style.display='inline'; Codehighlighter1_106_144_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_106_144_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_106_144_Closed_Text.style.display='none'; Codehighlighter1_106_144_Open_Image.style.display='inline'; Codehighlighter1_106_144_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_106_144_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"></span><span id=Codehighlighter1_106_144_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(_cords,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(_cords));<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DTest(Type&nbsp;cord[dim])<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id=Codehighlighter1_170_209_Open_Image onclick="this.style.display='none'; Codehighlighter1_170_209_Open_Text.style.display='none'; Codehighlighter1_170_209_Closed_Image.style.display='inline'; Codehighlighter1_170_209_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_170_209_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_170_209_Closed_Text.style.display='none'; Codehighlighter1_170_209_Open_Image.style.display='inline'; Codehighlighter1_170_209_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_170_209_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"></span><span id=Codehighlighter1_170_209_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(_cords,cord,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(cord));<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;友元模板</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">19</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;(ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;DTest</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type,dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;data);<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Type&nbsp;_cords[dim];<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;友元模板的实现</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;(ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;DTest</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type,dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;data)<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img id=Codehighlighter1_442_536_Open_Image onclick="this.style.display='none'; Codehighlighter1_442_536_Open_Text.style.display='none'; Codehighlighter1_442_536_Closed_Image.style.display='inline'; Codehighlighter1_442_536_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_442_536_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_442_536_Closed_Text.style.display='none'; Codehighlighter1_442_536_Open_Image.style.display='inline'; Codehighlighter1_442_536_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_442_536_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"></span><span id=Codehighlighter1_442_536_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</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;;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;dim</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;data._cords[i]&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</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">30</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#pragma&nbsp;endregion</span></div>
<p><br>用devc++，Vs2005,vc2008都不能编译通过，报连接错误，或者报模板函数是一个普通非模板类，或者非模板函数。<br><br>于是翻开C++&nbsp; Primer，在16.4节有详细的说明，<br>1.对于一个特化的类，声明一个友元模板必须对友元模板授予类的一个实例。<br>2.对特定实例化的友元关系时，必须在可以用于友元声明之前声明类或函数。<br><br>所以下面是修改后的代码<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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;DTest;<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;(ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;,</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;DTest</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type,dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">sess);<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#pragma&nbsp;region&nbsp;类DTest信息<br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;DTest<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img id=Codehighlighter1_211_495_Open_Image onclick="this.style.display='none'; Codehighlighter1_211_495_Open_Text.style.display='none'; Codehighlighter1_211_495_Closed_Image.style.display='inline'; Codehighlighter1_211_495_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_211_495_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_211_495_Closed_Text.style.display='none'; Codehighlighter1_211_495_Open_Image.style.display='inline'; Codehighlighter1_211_495_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_211_495_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"></span><span id=Codehighlighter1_211_495_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;构造函数</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">13</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;DTest()<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img id=Codehighlighter1_247_285_Open_Image onclick="this.style.display='none'; Codehighlighter1_247_285_Open_Text.style.display='none'; Codehighlighter1_247_285_Closed_Image.style.display='inline'; Codehighlighter1_247_285_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_247_285_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_247_285_Closed_Text.style.display='none'; Codehighlighter1_247_285_Open_Image.style.display='inline'; Codehighlighter1_247_285_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_247_285_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"></span><span id=Codehighlighter1_247_285_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memset(_cords,</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(_cords));<br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;DTest(Type&nbsp;cord[dim])<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img id=Codehighlighter1_311_350_Open_Image onclick="this.style.display='none'; Codehighlighter1_311_350_Open_Text.style.display='none'; Codehighlighter1_311_350_Closed_Image.style.display='inline'; Codehighlighter1_311_350_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_311_350_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_311_350_Closed_Text.style.display='none'; Codehighlighter1_311_350_Open_Image.style.display='inline'; Codehighlighter1_311_350_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_311_350_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"></span><span id=Codehighlighter1_311_350_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(_cords,cord,</span><span style="COLOR: #0000ff">sizeof</span><span style="COLOR: #000000">(cord));<br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;特化时，&lt;Type,dim&gt;&nbsp;省略为&lt;&gt;</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">23</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;friend&nbsp;ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&gt;</span><span style="COLOR: #000000">(ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;DTest</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type,dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;data);<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;Type&nbsp;_cords[dim];<br></span><span style="COLOR: #008080">27</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">28</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">29</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;友元模板的实现</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">30</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;Type,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">31</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;(ostream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;,&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;DTest</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">Type,dim</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">&nbsp;data)<br></span><span style="COLOR: #008080">32</span><span style="COLOR: #000000"><img id=Codehighlighter1_609_703_Open_Image onclick="this.style.display='none'; Codehighlighter1_609_703_Open_Text.style.display='none'; Codehighlighter1_609_703_Closed_Image.style.display='inline'; Codehighlighter1_609_703_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_609_703_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_609_703_Closed_Text.style.display='none'; Codehighlighter1_609_703_Open_Image.style.display='inline'; Codehighlighter1_609_703_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_609_703_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"></span><span id=Codehighlighter1_609_703_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">33</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">for</span><span style="COLOR: #000000">(</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;;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;dim</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">&nbsp;;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br></span><span style="COLOR: #008080">34</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;data._cords[i]&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</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">35</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">36</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br></span><span style="COLOR: #008080">37</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">38</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">39</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>#pragma&nbsp;endregion</span></div>
<p>&nbsp;</p>
<p><br><br>B.&nbsp;常见的几种内存泄漏<br>&nbsp; 1.分配空间未释放<br>&nbsp; 2.嵌套对象指针未释放，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;比如，一个类中包含另一个类的指针，在初始化的时候分配空间，缺没有在析构函数释放他。<br>&nbsp;&nbsp;3.释放一个对象数组的时候没有使用[]&nbsp;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete m_pObj;&nbsp;只是释放第一个&amp;m_pObj[0] 对象，应该使用delete [] m_pObj;<br>&nbsp; 4.出现浅拷贝现象<br>&nbsp; 5.返回一个动态分配的对象，其实可以看【effective c++】 的条款23: 必须返回一个对象时不要试图返回一个引用<br>&nbsp;&nbsp;&nbsp;&nbsp;<br><br>先总结这些，以后慢慢记录我的学习笔记。<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/expter/aggbug/80782.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-04-22 22:21 <a href="http://www.cppblog.com/expter/archive/2009/04/22/80782.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于会话记录Session的实现</title><link>http://www.cppblog.com/expter/archive/2009/04/22/80775.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Wed, 22 Apr 2009 12:53:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/04/22/80775.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/80775.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/04/22/80775.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/80775.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/80775.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Session的适用性很广，翻译为&#8216;会话&#8217;，最初接触他的时候在做web方面，可以记录一个用户的会话记录，当关闭浏览器的时候失效！Session实际上是一个特定的时间概念.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在最开始接触它时没有刻意的研究实现与扩展性，然后最近的一个工程有这...&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2009/04/22/80775.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/80775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-04-22 20:53 <a href="http://www.cppblog.com/expter/archive/2009/04/22/80775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Cutting Corners (acm 1996)</title><link>http://www.cppblog.com/expter/archive/2009/04/04/78970.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sat, 04 Apr 2009 13:25:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/04/04/78970.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/78970.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/04/04/78970.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/78970.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/78970.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 地址连接:http://www.karrels.org/Ed/ACM/96/ccorners.html刚开始做这题时候，没作对，后来优化了下代码，问了下pozen，测试代码通过，只是没有地方提交。。。寻路是dp(动态规划)。。其实可以成优化成很小，直接是求所有点中的其中2点距离。1996 ACM Scholastic Programming Contest Finalssponsored ...&nbsp;&nbsp;<a href='http://www.cppblog.com/expter/archive/2009/04/04/78970.html'>阅读全文</a><img src ="http://www.cppblog.com/expter/aggbug/78970.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-04-04 21:25 <a href="http://www.cppblog.com/expter/archive/2009/04/04/78970.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>智能指针(auto_ptr 和 shared_ptr)</title><link>http://www.cppblog.com/expter/archive/2009/03/29/78270.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 29 Mar 2009 07:50:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/03/29/78270.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/78270.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/03/29/78270.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/78270.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/78270.html</trackback:ping><description><![CDATA[<p>都是这周看书以及代码的总结：<br>&nbsp;&nbsp;<br>&nbsp; &nbsp; Stl&nbsp; 中 auto_ptr只是众多可能的智能指针之一，auto_ptr所做的事情，就是动态分配对象以及当对象不再需要时自动执行清理。<br>&nbsp;&nbsp;&nbsp;&nbsp;这里是一个简单的代码示例，如果没有auto_ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp; </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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ProcessAdoption(istream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">data)<br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #000000"><img id=Codehighlighter1_36_243_Open_Image onclick="this.style.display='none'; Codehighlighter1_36_243_Open_Text.style.display='none'; Codehighlighter1_36_243_Closed_Image.style.display='inline'; Codehighlighter1_36_243_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_36_243_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_243_Closed_Text.style.display='none'; Codehighlighter1_36_243_Open_Image.style.display='inline'; Codehighlighter1_36_243_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_36_243_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"></span><span id=Codehighlighter1_36_243_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(data)&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: #008000">//</span><span style="COLOR: #008000">&nbsp;如果还有数据</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #008000"><img id=Codehighlighter1_92_232_Open_Image onclick="this.style.display='none'; Codehighlighter1_92_232_Open_Text.style.display='none'; Codehighlighter1_92_232_Closed_Image.style.display='inline'; Codehighlighter1_92_232_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_92_232_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_92_232_Closed_Text.style.display='none'; Codehighlighter1_92_232_Open_Image.style.display='inline'; Codehighlighter1_92_232_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_92_232_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"></span><span id=Codehighlighter1_92_232_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ALA&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pa&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;readALAData(data);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;取出下一个数据</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">DealProcessAdoption(data);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;处理</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;pa;&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: #008000">//</span><span style="COLOR: #008000">&nbsp;释放资源</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">10</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br>&nbsp;&nbsp;&nbsp;&nbsp; 如果在DealProcessAdoption有一个exception,会发生什么事情，因为ProcessAdoption不能捕获他，所以这段代码很危险，所以DealProcessAdoption后面的代码可能会跳过，造成内存泄露。<br>如果利用try catch去捕获他，会搞得代码很乱，又缺少美观性。</p>
<p>所以Stl提供了一个智能指针来解决这个问题，我们可以先模拟实现一个智能指针的类实现。<br></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"><span style="COLOR: #008080">&nbsp;1</span><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;关于一个智能指针的定义</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">&nbsp;2</span><span style="COLOR: #008000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000">template</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">typename&nbsp;Type</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;3</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;auto_ptr<br></span><span style="COLOR: #008080">&nbsp;4</span><span style="COLOR: #000000"><img id=Codehighlighter1_54_157_Open_Image onclick="this.style.display='none'; Codehighlighter1_54_157_Open_Text.style.display='none'; Codehighlighter1_54_157_Closed_Image.style.display='inline'; Codehighlighter1_54_157_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_54_157_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_54_157_Closed_Text.style.display='none'; Codehighlighter1_54_157_Open_Image.style.display='inline'; Codehighlighter1_54_157_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_54_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"></span><span id=Codehighlighter1_54_157_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">&nbsp;5</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">&nbsp;6</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr(T&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">NULL)&nbsp;:Ptr(p)<br></span><span style="COLOR: #008080">&nbsp;7</span><span style="COLOR: #000000"><img id=Codehighlighter1_95_98_Open_Image onclick="this.style.display='none'; Codehighlighter1_95_98_Open_Text.style.display='none'; Codehighlighter1_95_98_Closed_Image.style.display='inline'; Codehighlighter1_95_98_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_95_98_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_95_98_Closed_Text.style.display='none'; Codehighlighter1_95_98_Open_Image.style.display='inline'; Codehighlighter1_95_98_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_95_98_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"></span><span id=Codehighlighter1_95_98_Open_Text><span style="COLOR: #000000">{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">&nbsp;8</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">~</span><span style="COLOR: #000000">auto_ptr()<br></span><span style="COLOR: #008080">&nbsp;9</span><span style="COLOR: #000000"><img id=Codehighlighter1_117_134_Open_Image onclick="this.style.display='none'; Codehighlighter1_117_134_Open_Text.style.display='none'; Codehighlighter1_117_134_Closed_Image.style.display='inline'; Codehighlighter1_117_134_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_117_134_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_117_134_Closed_Text.style.display='none'; Codehighlighter1_117_134_Open_Image.style.display='inline'; Codehighlighter1_117_134_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_117_134_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"></span><span id=Codehighlighter1_117_134_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">10</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;Ptr;<br></span><span style="COLOR: #008080">11</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">12</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">private</span><span style="COLOR: #000000">:<br></span><span style="COLOR: #008080">13</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;Type&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">Ptr;<br></span><span style="COLOR: #008080">14</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">15</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">16</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br></span><span style="COLOR: #008080">17</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;ProcessAdoption(istream&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">data)<br></span><span style="COLOR: #008080">18</span><span style="COLOR: #000000"><img id=Codehighlighter1_198_339_Open_Image onclick="this.style.display='none'; Codehighlighter1_198_339_Open_Text.style.display='none'; Codehighlighter1_198_339_Closed_Image.style.display='inline'; Codehighlighter1_198_339_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_198_339_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_198_339_Closed_Text.style.display='none'; Codehighlighter1_198_339_Open_Image.style.display='inline'; Codehighlighter1_198_339_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_198_339_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"></span><span id=Codehighlighter1_198_339_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">19</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br></span><span style="COLOR: #008080">20</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(data)&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: #008000">//</span><span style="COLOR: #008000">&nbsp;如果还有数据</span><span style="COLOR: #008000"><br></span><span style="COLOR: #008080">21</span><span style="COLOR: #008000"><img id=Codehighlighter1_253_328_Open_Image onclick="this.style.display='none'; Codehighlighter1_253_328_Open_Text.style.display='none'; Codehighlighter1_253_328_Closed_Image.style.display='inline'; Codehighlighter1_253_328_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_253_328_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_253_328_Closed_Text.style.display='none'; Codehighlighter1_253_328_Open_Image.style.display='inline'; Codehighlighter1_253_328_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_253_328_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"></span><span id=Codehighlighter1_253_328_Open_Text><span style="COLOR: #000000">{<br></span><span style="COLOR: #008080">22</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;auto_ptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">ALA</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;pa(readALADara(data));<br></span><span style="COLOR: #008080">23</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pa</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">DealProcessAdoption(data);<br></span><span style="COLOR: #008080">24</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br></span><span style="COLOR: #008080">25</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;<br></span><span style="COLOR: #008080">26</span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p><br>这个版本和原先版本的差异只有二处，<br>第一pa是一智能指针的对象，不是ALA*<br>第二不用自己去释放delete</p>
<p>然后我看到Effective STL的条款<br>8：永不建立auto_ptr的容器<br>关于此可以看的Effective STL的条款8</p>
<p>因为auto_ptr并不是完美无缺的，它的确很方便，但也有缺陷，在使用时要注意避免。首先，不要将auto_ptr对象作为STL容器的元素。C++标准明确禁止这样做，否则可能会碰到不可预见的结果</p>
<p>auto_ptr的另一个缺陷是将数组作为auto_ptr的参数： auto_ptr&lt;char&gt;&nbsp; pstr (new char[12] ); //数组；为定义<br>然后释放资源的时候不知道到底是利用delete pstr,还是 delete[] pstr;</p>
<p>然后收集了关于auto_ptr的几种注意事项：<br>1、auto_ptr不能共享所有权。<br>2、auto_ptr不能指向数组<br>3、auto_ptr不能作为容器的成员。<br>4、不能通过赋值操作来初始化auto_ptr<br>std::auto_ptr&lt;int&gt; p(new int(42));&nbsp;&nbsp;&nbsp;&nbsp; //OK<br>std::auto_ptr&lt;int&gt; p = new int(42);&nbsp;&nbsp;&nbsp; //ERROR<br>这是因为auto_ptr 的构造函数被定义为了explicit<br>5、不要把auto_ptr放入容器</p>
<p>然后笔者从而推荐的是boost的shared_ptr，然后看完shared_ptr关于智能指针的介绍与例子。<br>5种针对auto_ptr不足的指针如下：需要详细了解可以去查看相当文档，与测试新代码。<br>
<table cellSpacing=0 cellPadding=4 border=1>
    <tbody>
        <tr>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/libs/smart_ptr/scoped_ptr.htm"><strong><font color=#810081><u>scoped_ptr</u></font></strong></a></td>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/boost/scoped_ptr.hpp"><u><font color=#0000ff>&lt;boost/scoped_ptr.hpp&gt;</font></u></a></td>
            <td>简单的单一对象的唯一所有权。不可拷贝。</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/libs/smart_ptr/scoped_array.htm"><strong><font color=#0000ff><u>scoped_array</u></font></strong></a></td>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/boost/scoped_array.hpp"><u><font color=#0000ff>&lt;boost/scoped_array.hpp&gt;</font></u></a></td>
            <td>简单的数组的唯一所有权。不可拷贝。</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/libs/smart_ptr/shared_ptr.htm"><strong><font color=#810081><u>shared_ptr</u></font></strong></a></td>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/boost/shared_ptr.hpp"><u><font color=#0000ff>&lt;boost/shared_ptr.hpp&gt;</font></u></a></td>
            <td>在多个指针间共享的对象所有权。</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/libs/smart_ptr/shared_array.htm"><strong><font color=#810081><u>shared_array</u></font></strong></a></td>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/boost/shared_array.hpp"><u><font color=#0000ff>&lt;boost/shared_array.hpp&gt;</font></u></a></td>
            <td>在多个指针间共享的数组所有权。</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/libs/smart_ptr/weak_ptr.htm"><strong><font color=#0000ff><u>weak_ptr</u></font></strong></a></td>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/boost/weak_ptr.hpp"><u><font color=#0000ff>&lt;boost/weak_ptr.hpp&gt;</font></u></a></td>
            <td>一个属于 <strong>shared_ptr</strong> 的对象的无所有权的观察者。</td>
        </tr>
        <tr>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/libs/smart_ptr/intrusive_ptr.html"><strong><font color=#0000ff><u>intrusive_ptr</u></font></strong></a></td>
            <td><a href="mk:@MSITStore:E:\电子书与源代码\电子书与源代码\电子书\boost_1_37_0_doc_20090213.chm::/boost_doc/boost/intrusive_ptr.hpp"><u><font color=#0000ff>&lt;boost/intrusive_ptr.hpp&gt;</font></u></a></td>
            <td>带有一个侵入式引用计数的对象的共享所有权。</td>
        </tr>
    </tbody>
</table>
<br>1. shared_ptr是Boost库所提供的一个智能指针的实现,shared_ptr就是为了解决auto_ptr在对象所有权上的局限性（auto_ptr是独占的），在使用引用计数的机制上提供了可以共享所有权的智能指针.<br>2. shared_ptr比auto_ptr更安全<br>3. shared_ptr是可以拷贝和赋值的，拷贝行为也是等价的，并且可以被比较，这意味这它可被放入标准库的一般容器（vector，list）和关联容器中（map）。</p>
<p>关于shared_ptr的使用其实和auto_ptr差不多，只是实现上有差别，关于shared_ptr的定义就不贴代码了，以为内开源，可以网上找<br>1、shared_ptr&lt;T&gt; p(new Y);</p>
<p><br>要了解更多关于auto_ptr的信息，可以查看more effective c++ 的p158页条款28<br>要了解shared_ptr 类模板信息，可以查看boost 1.37.0中文文档,而且支持数组的shared_array 类模板<br>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<img src ="http://www.cppblog.com/expter/aggbug/78270.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-03-29 15:50 <a href="http://www.cppblog.com/expter/archive/2009/03/29/78270.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些学习笔记 ,陷阱，缺陷</title><link>http://www.cppblog.com/expter/archive/2009/03/08/75897.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 08 Mar 2009 06:05:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/03/08/75897.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/75897.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/03/08/75897.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/75897.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/75897.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p><br>1、关于初始化:<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><span style="COLOR: #000000">deque</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Deque;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;一个deque容器</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>deque</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Deque2(Deque.begin(),Deque.end());&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">&nbsp;一种初始化</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>copy(Deque.begin(),Deque.end(),back_inserter(Deque2)&nbsp;);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>deque</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Deque3(istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">(cin),istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">());&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;一种初始化</span><span style="COLOR: #008000"><br></span><span style="COLOR: #000000"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
&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><span style="COLOR: #000000">typedef&nbsp;istream_iteraor</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;(Func)();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>deque</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Deque3(istream_iteraotr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;cin,&nbsp;Func);&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>看上去像一个函数声明，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>typedef&nbsp;istream_iteraor</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;(Func)();<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>deque</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;f(stream_iteraor</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;,Func);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>现在比较清晰了吧，很像一个函数声明了，<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>所以第三种初始化方式根本就不能做任何事情.<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></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></span><span style="COLOR: #000000">deque</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Deque3(&nbsp;(istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;(cin))&nbsp;,&nbsp;istream_iterator</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">string</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">()&nbsp;);</span></div>
<br>通过加括号来提示编译器我们这里提供的是构造函数的参数而非参数声明，因为 (istream_iterator&lt;string&gt; (cin))&nbsp; 不能解析为变量声明，这个更void f ( (int i)) 不可能是函数声明是一回事。多一对括号不可能解释为合法的声明语句。<br><br><br>2.关于double 和float 区别<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><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_11_76_Open_Image onclick="this.style.display='none'; Codehighlighter1_11_76_Open_Text.style.display='none'; Codehighlighter1_11_76_Closed_Image.style.display='inline'; Codehighlighter1_11_76_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_11_76_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_11_76_Closed_Text.style.display='none'; Codehighlighter1_11_76_Open_Image.style.display='inline'; Codehighlighter1_11_76_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_11_76_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"></span><span id=Codehighlighter1_11_76_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">double</span><span style="COLOR: #000000">&nbsp;&nbsp;x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;1e8;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(x&nbsp;</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&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>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>&nbsp;</span></div>
<br>现在的编译器一秒就可能运行完成，<br>如果吧doubel x = 1e8 ,换为 float x = 1e8;<br>&nbsp;C++标准说 :<br>&nbsp;浮点类型有三种: float ,double, long double,关于精度很显然<br>如果换成float 答案很诡异，因为取决于float的精度，能否表达0 1e8区间的整数<br><br>所以如果换为 float，可能运行一秒，也可能是死循环，因为如果float不能表达0 1e8区间的整数， 因为其中 n-1 = n (由于浮点精度不够)<br>。<br><br><br>3. 一些拼写代码错误<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><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>#include&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">iomanip</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></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><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_73_205_Open_Image onclick="this.style.display='none'; Codehighlighter1_73_205_Open_Text.style.display='none'; Codehighlighter1_73_205_Closed_Image.style.display='inline'; Codehighlighter1_73_205_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_73_205_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_73_205_Closed_Text.style.display='none'; Codehighlighter1_73_205_Open_Image.style.display='inline'; Codehighlighter1_73_205_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_73_205_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"></span><span id=Codehighlighter1_73_205_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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">0</span><span style="COLOR: #000000">&nbsp;;&nbsp;i&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">100</span><span style="COLOR: #000000">;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_119_126_Open_Image onclick="this.style.display='none'; Codehighlighter1_119_126_Open_Text.style.display='none'; Codehighlighter1_119_126_Closed_Image.style.display='inline'; Codehighlighter1_119_126_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_119_126_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_119_126_Closed_Text.style.display='none'; Codehighlighter1_119_126_Open_Image.style.display='inline'; Codehighlighter1_119_126_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_119_126_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"></span><span id=Codehighlighter1_119_126_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;下面这行代码会干些什么？递增???????/</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">x;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;std::cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;x&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;std::endl;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&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>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br>&nbsp; 一个支持标准c++的编译器答案输出是 1<br>&nbsp; 原因很诡异，因为有个有趣的是：注释末尾&#8216;??/&#8217;会被转换为'\' ，写个宏的都知道这个就是换行符，所以??/换转换为\ ，而++x就相当于粘贴到注释行的末尾&nbsp;，所以++x.,不会起作用，是注释的一部分。<br><br>在看一个例子：<br>一个符号标准 c++的编译器会报多少错误。<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><span style="COLOR: #0000ff">struct</span><span style="COLOR: #000000">&nbsp;X&nbsp;<br><img id=Codehighlighter1_10_79_Open_Image onclick="this.style.display='none'; Codehighlighter1_10_79_Open_Text.style.display='none'; Codehighlighter1_10_79_Closed_Image.style.display='inline'; Codehighlighter1_10_79_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_10_79_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_10_79_Closed_Text.style.display='none'; Codehighlighter1_10_79_Open_Image.style.display='inline'; Codehighlighter1_10_79_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_10_79_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"></span><span id=Codehighlighter1_10_79_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">static</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;f(</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">p)<br><img id=Codehighlighter1_36_77_Open_Image onclick="this.style.display='none'; Codehighlighter1_36_77_Open_Text.style.display='none'; Codehighlighter1_36_77_Closed_Image.style.display='inline'; Codehighlighter1_36_77_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_36_77_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_36_77_Closed_Text.style.display='none'; Codehighlighter1_36_77_Open_Image.style.display='inline'; Codehighlighter1_36_77_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_36_77_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"></span><span id=Codehighlighter1_36_77_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">&nbsp;p&nbsp;</span><span style="COLOR: #000000">&amp;&amp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">[p]&nbsp;and&nbsp;not&nbsp;p[</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">:</span><span style="COLOR: #000000">&gt;&gt;</span><span style="COLOR: #000000">p[</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000">;</span></div>
<p>先一步一步的分析<br>1:0[p] 其实和p[0]一样<br>2: and not都是有效关键字 ，他们分别是&amp;&amp; 和!<br>3::&gt;竟然也是合法的，他是]的双字符写法。</p>
<p>所以这个语句会被解析为 return p &amp;&amp; p[0] &amp;&amp; !p[1]&gt;p[2] ，没有语法错误。<br>很诡异。</p>
<p>&nbsp;</p>
<img src ="http://www.cppblog.com/expter/aggbug/75897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-03-08 14:05 <a href="http://www.cppblog.com/expter/archive/2009/03/08/75897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>最近笔记以及总结！</title><link>http://www.cppblog.com/expter/archive/2009/02/22/74618.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 22 Feb 2009 14:21:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/02/22/74618.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/74618.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/02/22/74618.html#Feedback</comments><slash:comments>12</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/74618.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/74618.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 来公司已经2周了，自己做的工作挺少，给的3周完成的一个编辑器，不到2周基本功能做完了，因为没有详细的设计，而且是内部的人员使用，很多的功能都是自己来规划的，其实我觉得平时在校的话 这个3-4天就可以做完，不知道为啥做了这么久！<br><br>&nbsp; &nbsp;&nbsp; 没看看着忙碌的同事，还有游戏正在三测，都在加班，我只是看一些一些接口，一些逻辑代码，没多大的事情，估计是刚来任务也很轻吧，呵呵！<br>&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 在校虽然学了主流的的语言，但是最后选择C++，因为它开发自由，效率高，结构性很强等等。最近看了几本书，对OOD,OOA，以及编写代码时的问题，与良好的设计模式有了一定的提高，但是对于有些又有些遗忘，比如STL，LUA,软件工程。在我看来，一个程序员必须有很好的算法功底与扎实的数据结构！最近手中还有几本书，打算闲的时候看，OOD启示录，boost也得学学,另外stl，设计模式和网络编程以及他的几种模型都要加强复习。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 在我看来一个项目只有有了这方面的理论知识，有一门熟练的语言，实现起来都很快，自己感觉缺少的是一种思想，架构思想，估计是自己接触的太少，经验太少，需要的是时间来催化！<br>&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; 同时很高兴在新的环境认识了新的朋友，大家都很和善，同时也知道fox,kevinlynx也经常在CPPBLOG这里写日记，以后得像2位学习，以及公司的同事都是俺的前辈。<br><br>&nbsp; &nbsp;&nbsp; 在大学没有写个太大的程序，估计最大一个软件的在6K左右行吧(c++)，ACM估计在100多道，以及平时也的小东西不到20个项目。学习笔记，以及一些简单的win 32 编程还是有少许，比如底层驱动之类的。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 现在的任务就是多看一些大牛的技术blog，多看书，多写代码才是王道，以后编程尽量规范了，良好的风格以及更好设计模式，更优的算法才是最好的，在我平时做什么东西，都希望敢时间，几下就做不了了之。还得改正。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 我比较喜欢网络编程，平台方面主要是win,对于linux只是写过，平时玩玩。学得都比较浅毕竟没做个啥子大的商业项目。既然来了这个公司就要做出自己成绩。年轻有无限的激情，就要努力。<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 在等段时间就要写毕业设计和论文了，希望没多大问题，一个彩色人脸识别程序，关键是识别成功率！<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 在大学最后的时间即将完成，迈入社会就得认真对待任何事情了。努力工作，挣钱，养老婆，呵呵！ &nbsp;&nbsp; <br><br>&nbsp;&nbsp;&nbsp;&nbsp; 加油！！！就想kevinlynx那天说的，让人知道你能做什么，会什么！！<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 因为自己表达能力稍加，一般不写技术，怕描述因次误导或者乱说了，其实也没多大技术含量、、、呵呵 主要记录的生活笔记！<br>
<img src ="http://www.cppblog.com/expter/aggbug/74618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-02-22 22:21 <a href="http://www.cppblog.com/expter/archive/2009/02/22/74618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>正则表达式30分钟入门教程</title><link>http://www.cppblog.com/expter/archive/2009/01/11/71746.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sun, 11 Jan 2009 11:50:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/01/11/71746.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/71746.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/01/11/71746.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/71746.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/71746.html</trackback:ping><description><![CDATA[<h1>正则表达式30分钟入门教程</h1>
<p id=meta>版本：v2.3 (2008-4-13) 作者：<a href="http://www.unibetter.com/members/deerchao.aspx"><u><font color=#0000ff>deerchao</font></u></a> 转载请注明<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm"><u><font color=#0000ff>来源</font></u></a></p>
<h2 id=contents>目录</h2>
<p class=note id=skipContents><a title=转到正文内容 href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#mission"><u><font color=#0000ff>跳过目录</font></u></a></p>
<ol>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#mission"><u><font color=#0000ff>本文目标</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#howtouse"><u><font color=#0000ff>如何使用本教程</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#introduction"><u><font color=#0000ff>正则表达式到底是什么东西？</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#getstarted"><u><font color=#0000ff>入门</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#testing"><u><font color=#0000ff>测试正则表达式</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#metacode"><u><font color=#0000ff>元字符</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#escape"><u><font color=#0000ff>字符转义</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#repeat"><u><font color=#0000ff>重复</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#charclass"><u><font color=#0000ff>字符类</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#alternative"><u><font color=#0000ff>分枝条件</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#negation"><u><font color=#0000ff>反义</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#grouping"><u><font color=#0000ff>分组</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#backreference"><u><font color=#0000ff>后向引用</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#lookaround"><u><font color=#0000ff>零宽断言</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#negativelookaround"><u><font color=#0000ff>负向零宽断言</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#commenting"><u><font color=#0000ff>注释</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#greedyandlazy"><u><font color=#0000ff>贪婪与懒惰</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#regexoptions"><u><font color=#0000ff>处理选项</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#balancedgroup"><u><font color=#0000ff>平衡组/递归匹配</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#more"><u><font color=#0000ff>还有些什么东西没提到</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#contact"><u><font color=#0000ff>联系作者</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#ad"><u><font color=#0000ff>最后,来点广告...</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#resources"><u><font color=#0000ff>网上的资源及本文参考文献</font></u></a>
    <li><a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#updatelog"><u><font color=#0000ff>更新说明</font></u></a></li>
</ol>
<h2 id=mission>本文目标</h2>
<p>30分钟内让你明白正则表达式是什么，并对它有一些基本的了解，让你可以在自己的程序或网页里使用它。</p>
<h2 id=howtouse>如何使用本教程</h2>
<p class="important note" id=giveMe30Minutes>最重要的是——请给我<em>30分钟</em>，如果你没有使用正则表达式的经验，请不要试图在30<em>秒</em>内入门——除非你是超人 :)</p>
<p>别被下面那些复杂的表达式吓倒，只要跟着我一步一步来，你会发现正则表达式其实并<span lang=zh-cn>没有</span>你想像中的那么困难。当然，如果你看完了这篇教程之后，发现自己明白了很多，却又几乎什么都记不得，那也是很正常的——我认为，没接触过正则表达式的人在看完这篇教程后，能把提到过的语法记住80%以上的可能性为零。这里只是让你明白基本的原理，以后你还需要多练习，多使用，才能熟练掌握正则表达式。</p>
<p>除了作为入门教程之外，本文还试图成为可以在日常工作中使用的正则表达式语法参考手册。就作者本人的经历来说，这个目标还是完成得不错的——你看，我自己也没能把所有的东西记下来，不是吗？</p>
<p><a id=clearButton onclick="return clearFormats();" href="http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm"><u><font color=#0000ff>清除格式</font></u></a>&nbsp;文本格式约定：<span class=name>专业术语</span>&nbsp;<span class=code>元字符/语法格式</span>&nbsp;<span class=regex>正则表达式</span>&nbsp;<span class=part>正则表达式中的一部分(用于分析)</span>&nbsp;<span class=string>对其进行匹配的源字符串</span>&nbsp;<span class=desc>对正则表达式或其中一部分的说明</span></p>
<p><a id=hideButton onclick="return hideNotes();" href="http://www.unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm"><u><font color=#0000ff>隐藏边注</font></u></a>&nbsp;本文右边有一些注释，主要是用来提供一些相关信息，或者给没有程序员背景的读者解释一些基本概念，通常可以忽略。</p>
<h2 id=introduction>正则表达式到底是什么东西？</h2>
<p class=note><span class=name>字符</span>是计算机软件处理文字时最基本的单位，可能是字母，数字，标点符号，空格，换行符，汉字等等。<span class=name>字符串</span>是0个或更多个字符的序列。<span class=name>文本</span>也就是文字，字符串。说某个字符串<span class=name>匹配</span>某个正则表达式，通常是指这个字符串里有一部分（或几部分分别）能满足表达式给出的条件。</p>
<p>在编写处理字符串的程序或网页时，经常会有查找符合某些复杂规则的字符串的需要。<span class=name>正则表达式</span>就是用于描述这些规则的工具。换句话说，正则表达式就是记录文本规则的代码。</p>
<p>很可能你使用过Windows/Dos下用于文件查找的<span class=name>通配符(wildcard)</span>，也就是<span class=code>*</span>和<span class=code>?</span>。如果你想查找某个目录下的所有的Word文档的话，你会搜索<span style="COLOR: red">*.doc</span>。在这里，<span class=code>*</span>会被解释成任意的字符串。和通配符类似，正则表达式也是用来进行文本匹配的工具，只不过比起通配符，它能更精确地描述你的需求——当然，代价就是更复杂——比如你可以编写一个正则表达式，用来查找<span class=desc>所有以0开头，后面跟着2-3个数字，然后是一个连字号&#8220;-&#8221;，最后是7或8位数字的字符串</span>(像<span class=string>010-12345678</span>或<span class=string>0376-7654321</span>)。</p>
<h2 id=getstarted>入门</h2>
<p>学习正则表达式的最好方法是从例子开始，理解例子之后再自己对例子进行修改，实验。下面给出了不少简单的例子，并对它们作了详细的说明。</p>
<p>假设你在一篇英文小说里查找<span class=desc>hi</span>，你可以使用正则表达式<span class=regex>hi</span>。</p>
<p>这几乎是最简单的正则表达式了，它可以精确匹配这样的字符串：<span class=desc>由两个字符组成，前一个字符是h,后一个是i</span>。通常，处理正则表达式的工具会提供一个忽略大小写的选项，如果选中了这个选项，它可以匹配<span class=string>hi</span>,<span class=string>HI</span>,<span class=string>Hi</span>,<span class=string>hI</span>这四种情况中的任意一种。</p>
<p>不幸的是，很多单词里包含<span class=string>hi</span>这两个连续的字符，比如<span class=string>him</span>,<span class=string>history</span>,<span class=string>high</span>等等。用<span class=regex>hi</span>来查找的话，这里边的<span class=string>hi</span>也会被找出来。如果要<span class=desc>精确地查找hi这个单词</span>的话，我们应该使用<span class=regex>\bhi\b</span>。</p>
<p><span class=part>\b</span>是正则表达式规定的一个特殊代码（好吧，某些人叫它<span class=name>元字符，metacharacter</span>），代表着<span class=desc>单词的开头或结尾，也就是单词的分界处</span>。虽然通常英文的单词是由空格，标点符号或者换行来分隔的，但是<span class=code>\b</span>并不匹配这些单词分隔字符中的任何一个，它<strong>只匹配一个位置</strong>。</p>
<p class=note>如果需要更精确的说法，<span class=code>\b</span>匹配这样的位置：它的前一个字符和后一个字符不全是(一个是,一个不是或不存在)<span class=code>\w</span>。</p>
<p>假如你要找的是<span class=desc>hi后面不远处跟着一个Lucy</span>，你应该用<span class=regex>\bhi\b.*\bLucy\b</span>。</p>
<p>这里，<span class=part>.</span>是另一个元字符，匹配<span class=desc>除了换行符以外的任意字符</span>。<span class=part>*</span>同样是元字符，不过它代表的不是字符，也不是位置，而是数量——它指定*<span class=desc>前边的内容可以连续重复出现任意次以使整个表达式得到匹配</span>。因此，<span class=part>.*</span>连在一起就意味着<span class=desc>任意数量的不包含换行的字符</span>。现在<span class=regex>\bhi\b.*\bLucy\b</span>的意思就很明显了：<span class=desc>先是一个单词hi,然后是任意个任意字符(但不能是换行)，最后是Lucy这个单词</span>。</p>
<p class=note>换行符就是'\n',ASCII编码为10(十六进制0x0A)的字符。</p>
<p>如果同时使用其它元字符，我们就能构造出功能更强大的正则表达式。比如下面这个例子：</p>
<p><span class=regex>0\d\d-\d\d\d\d\d\d\d\d</span>匹配这样的字符串：<span class=desc>以0开头，然后是两个数字，然后是一个连字号&#8220;-&#8221;，最后是8个数字</span>(也就是中国的电话号码。当然，这个例子只能匹配区号为3位的情形)。</p>
<p>这里的<span class=part>\d</span>是个新的元字符，匹配<span class=desc>一位数字(0，或1，或2，或&#8230;&#8230;)</span>。<span class=part>-</span>不是元字符，只匹配它本身——连字符或者减号。</p>
<p>为了避免那么多烦人的重复，我们也可以这样写这个表达式：<span class=regex>0\d{2}-\d{8}</span>。 这里<span class=part>\d</span>后面的<span class=part>{2}</span>(<span class=part>{8}</span>)的意思是前面<span class=part>\d</span><span class=desc>必须连续重复匹配2次(8次)</span>。</p>
<h2 id=testing>测试正则表达式</h2>
<div class=note>
<p>其它可用的测试工具:</p>
<ul>
    <li><a href="http://www.regexbuddy.com/"><u><font color=#0000ff>RegexBuddy</font></u></a>
    <li><a href="http://regexpal.com/"><u><font color=#0000ff>Javascript正则表达式在线测试工具</font></u></a></li>
</ul>
</div>
<p>如果你不觉得正则表达式很难读写的话，要么你是一个天才，要么，你不是地球人。正则表达式的语法很令人头疼，即使对经常使用它的人来说也是如此。由于难于读写，容易出错，所以找一种工具对正则表达式进行测试是很有必要的。</p>
<p>由于在不同的环境下正则表达式的一些细节是不相同的，本教程介绍的是微软 .Net Framework 2.0下正则表达式的行为，所以，我向你介绍一个.Net下的工具<a title=转到RegexTester的官方网站（英文） href="http://www.dotnet2themax.com/blogs/fbalena/PermaLink,guid,13bce26d-7755-441e-92b3-1eb5f9e859f9.aspx"><u><font color=#0000ff>Regex Tester</font></u></a>。首先你确保已经安装了<a title="转到下载.Net Framework 2.0的页面" href="http://www.microsoft.com/downloads/details.aspx?displaylang=zh-cn&amp;FamilyID=0856eacb-4362-4b0d-8edd-aab15c5e04f5"><u><font color=#0000ff>.Net Framework 2.0</font></u></a>，然后<a title="从www.unibetter.com下载Regex Tester, 75KB" href="http://www.unibetter.com/deerchao/downloads/RegexTester.zip"><u><font color=#0000ff>下载Regex Tester</font></u></a>。这是个绿色软件，下载完后打开压缩包,直接运行RegexTester.exe就可以了。</p>
<p>下面是Regex Tester运行时的截图：</p>
<p><img alt="Regex Tester运行时的截图" src="http://unibetter.com/deerchao/images/RegexTester.jpg"></p>
<h2 id=metacode>元字符</h2>
<p>现在你已经知道几个很有用的元字符了，如<span class=code>\b</span>,<span class=code>.</span>,<span class=code>*</span>，还有<span class=code>\d</span>.正则表达式里还有更多的元字符，比如<span class=code>\s</span>匹配<span class=desc>任意的空白符，包括空格，制表符(Tab)，换行符，中文全角空格等</span>。<span class=code>\w</span>匹配<span class=desc>字母或数字或下划线或汉字等</span>。</p>
<p class=note>对中文/汉字的特殊处理是由.Net提供的正则表达式引擎支持的，其它环境下的具体情况请查看相关文档。</p>
<p>下面来看看更多的例子：</p>
<p><span class=regex>\ba\w*\b</span>匹配<span class=desc>以字母<span class=part>a</span>开头的单词——先是某个单词开始处(<span class=part>\b</span>)，然后是字母<span class=part>a</span>,然后是任意数量的字母或数字(<span class=part>\w*</span>)，最后是单词结束处(<span class=part>\b</span>)</span>。</p>
<p class=note>好吧，现在我们说说正则表达式里的单词是什么意思吧：就是多于一个的连续的<span class=code>\w</span>。不错，这与学习英文时要背的成千上万个同名的东西的确关系不大 :)</p>
<p><span class=regex>\d+</span>匹配<span class=desc>1个或更多连续的数字</span>。这里的<span class=part>+</span>是和<span class=code>*</span>类似的元字符，不同的是<span class=code>*</span>匹配<span class=desc>重复任意次(可能是0次)</span>，而<span class=code>+</span>则匹配<span class=desc>重复1次或更多次</span>。</p>
<p><span class=regex>\b\w{6}\b</span> 匹配<span class=desc>刚好6个字母/数字的单词</span>。</p>
<table cellSpacing=0>
    <caption>表1.常用的元字符</caption>
    <thead>
        <tr>
            <th scope=col>代码</th>
            <th scope=col>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class=code>.</span></td>
            <td><span class=desc>匹配除换行符以外的任意字符</span></td>
        </tr>
        <tr>
            <td><span class=code>\w</span></td>
            <td><span class=desc>匹配字母或数字或下划线或汉字</span></td>
        </tr>
        <tr>
            <td><span class=code>\s</span></td>
            <td><span class=desc>匹配任意的空白符</span></td>
        </tr>
        <tr>
            <td><span class=code>\d</span></td>
            <td><span class=desc>匹配数字</span></td>
        </tr>
        <tr>
            <td><span class=code>\b</span></td>
            <td><span class=desc>匹配单词的开始或结束</span></td>
        </tr>
        <tr>
            <td><span class=code>^</span></td>
            <td><span class=desc>匹配字符串的开始</span></td>
        </tr>
        <tr>
            <td><span class=code>$</span></td>
            <td><span class=desc>匹配字符串的结束</span></td>
        </tr>
    </tbody>
</table>
<p>元字符<span class=code>^</span>（和数字6在同一个键位上的符号）和<span class=code>$</span>都匹配一个位置，这和<span class=code>\b</span>有点类似。<span class=code>^</span>匹配你要用来查找的字符串的开头，<span class=code>$</span>匹配结尾。这两个代码在验证输入的内容时非常有用，比如一个网站如果要求你填写的QQ号必须为5位到12位数字时，可以使用：<span class=regex>^\d{5,12}$</span>。</p>
<p>这里的<span class=part>{5,12}</span>和前面介绍过的<span class=part>{2}</span>是类似的，只不过<span class=part>{2}</span>匹配<span class=desc>只能不多不少重复2次</span>，<span class=part>{5,12}</span>则是<span class=desc>重复的次数不能少于5次，不能多于12次</span>，否则都不匹配。</p>
<p>因为使用了<span class=part>^</span>和<span class=part>$</span>，所以输入的整个字符串都要用来和<span class=part>\d{5,12}</span>来匹配，也就是说整个输入<span class=desc>必须是5到12个数字</span>，因此如果输入的QQ号能匹配这个正则表达式的话，那就符合要求了。</p>
<p>和忽略大小写的选项类似，有些正则表达式处理工具还有一个处理多行的选项。如果选中了这个选项，<span class=code>^</span>和<span class=code>$</span>的意义就变成了<span class=desc>匹配行的开始处和结束处</span>。</p>
<h2 id=escape>字符转义</h2>
<p>如果你想查找元字符本身的话，比如你查找<span class=desc>.</span>,或者<span class=desc>*</span>,就出现了问题：你没办法指定它们，因为它们会被解释成别的意思。这时你就得使用<span class=code>\</span>来取消这些字符的特殊意义。因此，你应该使用<span class=regex>\.</span>和<span class=regex>\*</span>。当然，要查找<span class=desc>\</span>本身，你也得用<span class=regex>\\</span>.</p>
<p>例如：<span class=regex>unibetter\.com</span>匹配<span class=desc>unibetter.com</span>，<span class=regex>C:\\Windows</span>匹配<span class=desc>C:\Windows</span>。</p>
<h2 id=repeat>重复</h2>
<p>你已经看过了前面的<span class=code>*</span>,<span class=code>+</span>,<span class=code>{2}</span>,<span class=code>{5,12}</span>这几个匹配重复的方式了。下面是正则表达式中所有的限定符(指定数量的代码，例如*,{5,12}等)：</p>
<table cellSpacing=0>
    <caption>表2.常用的限定符</caption>
    <thead>
        <tr>
            <th scope=col>代码/语法</th>
            <th scope=col>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class=code>*</span></td>
            <td><span class=desc>重复零次或更多次</span></td>
        </tr>
        <tr>
            <td><span class=code>+</span></td>
            <td><span class=desc>重复一次或更多次</span></td>
        </tr>
        <tr>
            <td><span class=code>?</span></td>
            <td><span class=desc>重复零次或一次</span></td>
        </tr>
        <tr>
            <td><span class=code>{n}</span></td>
            <td><span class=desc>重复n次</span></td>
        </tr>
        <tr>
            <td><span class=code>{n,}</span></td>
            <td><span class=desc>重复n次或更多次</span></td>
        </tr>
        <tr>
            <td><span class=code>{n,m}</span></td>
            <td><span class=desc>重复n到m次</span></td>
        </tr>
    </tbody>
</table>
<p>下面是一些使用重复的例子：</p>
<p><span class=regex>Windows\d+</span>匹配<span class=desc>Windows后面跟1个或更多数字</span></p>
<p><span class=regex>^\w+</span>匹配<span class=desc>一行的第一个单词(或整个字符串的第一个单词，具体匹配哪个意思得看选项设置)</span></p>
<h2 id=charclass>字符类</h2>
<p>要想查找数字，字母或数字，空白是很简单的，因为已经有了对应这些字符集合的元字符，但是如果你想匹配没有预定义元字符的字符集合(比如元音字母a,e,i,o,u),应该怎么办？</p>
<p>很简单，你只需要在方括号里列出它们就行了，像<span class=regex>[aeiou]</span>就匹配<span class=desc>任何一个英文元音字母</span>，<span class=regex>[.?!]</span>匹配<span class=desc>标点符号(.或?或!)</span>。</p>
<p>我们也可以轻松地指定一个字符<span class=name>范围</span>，像<span class=regex>[0-9]</span>代表的含意与<span class=regex>\d</span>就是完全一致的：<span class=desc>一位数字</span>；同理<span class=regex>[a-z0-9A-Z_]</span>也完全等同于<span class=code>\w</span>（如果只考虑英文的话）。</p>
<p>下面是一个更复杂的表达式：<span class=regex>\(?0\d{2}[) -]?\d{8}</span>。</p>
<p class=note>&#8220;(&#8221;和&#8220;)&#8221;也是元字符，后面的<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#grouping"><u><font color=#0000ff>分组节</font></u></a>里会提到，所以在这里需要使用<a href="http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm#escape"><u><font color=#0000ff>转义</font></u></a>。</p>
<p>这个表达式可以匹配<span class=desc>几种格式的电话号码</span>，像<span class=string>(010)88886666</span>，或<span class=string>022-22334455</span>，或<span class=string>02912345678</span>等。我们对它进行一些分析吧：首先是一个转义字符<span class=part>\(</span>,它能出现0次或1次(<span class=part>?</span>),然后是一个<span class=part>0</span>，后面跟着2个数字(<span class=part>\d{2}</span>)，然后是<span class=part>)</span>或<span class=part>-</span>或<span class=part>空格</span>中的一个，它出现1次或不出现(<span class=part>?</span>)，最后是8个数字(<span class=part>\d{8}</span>)。</p>
<h2 id=alternative>分枝条件</h2>
<p>不幸的是，刚才那个表达式也能匹配<span class=string>010)12345678</span>或<span class=string>(022-87654321</span>这样的&#8220;不正确&#8221;的格式。要解决这个问题，我们需要用到<span class=name>分枝条件</span>。正则表达式里的<span class=name>分枝条件</span>指的是有几种规则，如果满足其中任意一种规则都应该当成匹配，具体方法是用<span class=code>|</span>把不同的规则分隔开。听不明白？没关系，看例子：</p>
<p><span class=regex>0\d{2}-\d{8}|0\d{3}-\d{7}</span>这个表达式能<span class=desc>匹配两种以连字号分隔的电话号码：一种是三位区号，8位本地号(如010-12345678)，一种是4位区号，7位本地号(0376-2233445)</span>。</p>
<p><span class=regex>\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}</span>这个表达式<span class=desc>匹配3位区号的电话号码，其中区号可以用小括号括起来，也可以不用，区号与本地号间可以用连字号或空格间隔，也可以没有间隔</span>。你可以试试用分枝条件把这个表达式扩展成也支持4位区号的。</p>
<p><span class=regex>\d{5}-\d{4}|\d{5}</span>这个表达式用于匹配美国的邮政编码。美国邮编的规则是5位数字，或者用连字号间隔的9位数字。之所以要给出这个例子是因为它能说明一个问题：<strong>使用分枝条件时，要注意各个条件的顺序</strong>。如果你把它改成<span class=regex>\d{5}|\d{5}-\d{4}</span>的话，那么就只会匹配5位的邮编(以及9位邮编的前5位)。原因是匹配分枝条件时，将会从左到右地测试每个条件，如果满足了某个分枝的话，就不会去再管其它的条件了。</p>
<h2 id=grouping>分组</h2>
<p>我们已经提到了怎么重复单个字符（直接在字符后面加上限定符就行了）；但如果想要重复多个字符又该怎么办？你可以用小括号来指定<span class=name>子表达式</span>(也叫做<span class=name>分组</span>)，然后你就可以指定这个子表达式的重复次数了，你也可以对子表达式进行其它一些操作(后面会有介绍)。</p>
<p><span class=regex>(\d{1,3}\.){3}\d{1,3}</span>是一个<span class=desc>简单的IP地址匹配</span>表达式。要理解这个表达式，请按下列顺序分析它：<span class=part>\d{1,3}</span>匹配<span class=desc>1到3位的数字</span>，<span class=part>(\d{1,3}\.){3}</span>匹配<span class=desc>三位数字加上一个英文句号(这个整体也就是这个<span class=name>分组</span>)重复3次</span>，最后再加上<span class=desc>一个一到三位的数字</span>(<span class=part>\d{1,3}</span>)。</p>
<p class=note>IP地址中每个数字都不能大于255，大家千万不要被《24》第三季的编剧给忽悠了...</p>
<p>不幸的是，它也将匹配<span class=string>256.300.888.999</span>这种不可能存在的IP地址。如果能使用算术比较的话，或许能简单地解决这个问题，但是正则表达式中并不提供关于数学的任何功能，所以只能使用冗长的分组，选择，字符类来描述一个正确的IP地址：<span class=regex>((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)</span>。</p>
<p>理解这个表达式的关键是理解<span class=part>2[0-4]\d|25[0-5]|[01]?\d\d?</span>，这里我就不细说了，你自己应该能分析得出来它的意义。</p>
<h2 id=negation>反义</h2>
<p>有时需要查找不属于某个能简单定义的字符类的字符。比如想查找除了数字以外，其它任意字符都行的情况，这时需要用到<span class=name>反义</span>：</p>
<table cellSpacing=0>
    <caption>表3.常用的反义代码</caption>
    <thead>
        <tr>
            <th scope=col>代码/语法</th>
            <th scope=col>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class=code>\W</span></td>
            <td><span class=desc>匹配任意不是字母，数字，下划线，汉字的字符</span></td>
        </tr>
        <tr>
            <td><span class=code>\S</span></td>
            <td><span class=desc>匹配任意不是空白符的字符</span></td>
        </tr>
        <tr>
            <td><span class=code>\D</span></td>
            <td><span class=desc>匹配任意非数字的字符</span></td>
        </tr>
        <tr>
            <td><span class=code>\B</span></td>
            <td><span class=desc>匹配不是单词开头或结束的位置</span></td>
        </tr>
        <tr>
            <td><span class=code>[^x]</span></td>
            <td><span class=desc>匹配除了x以外的任意字符</span></td>
        </tr>
        <tr>
            <td><span class=code>[^aeiou]</span></td>
            <td><span class=desc>匹配除了aeiou这几个字母以外的任意字符</span></td>
        </tr>
    </tbody>
</table>
<p>例子：<span class=regex>\S+</span>匹配<span class=desc>不包含空白符的字符串</span>。</p>
<p><span class=regex>&lt;a[^&gt;]+&gt;</span>匹配<span class=desc>用尖括号括起来的以a开头的字符串</span>。</p>
<h2 id=backreference>后向引用</h2>
<p>使用小括号指定一个子表达式后，<strong>匹配这个子表达式的文本</strong>(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下，每个分组会自动拥有一个<span class=name>组号</span>，规则是：从左向右，以分组的左括号为标志，第一个出现的分组的组号为1，第二个为2，以此类推。</p>
<p><span class=name>后向引用</span>用于重复搜索前面某个分组匹配的文本。例如，<span class=part>\1</span>代表<span class=desc>分组1匹配的文本</span>。难以理解？请看示例：</p>
<p><span class=regex>\b(\w+)\b\s+\1\b</span>可以用来匹配<span class=desc>重复的单词</span>，像<span class=string>go go</span>, 或者<span class=string>kitty kitty</span>。这个表达式首先是<span class=desc>一个单词</span>，也就是<span class=desc>单词开始处和结束处之间的多于一个的字母或数字</span>(<span class=part>\b(\w+)\b</span>)，这个单词会被捕获到编号为1的分组中，然后是<span class=desc>1个或几个空白符</span>(<span class=part>\s+</span>)，最后是<span class=desc>分组1中捕获的内容（也就是前面匹配的那个单词）</span>(<span class=part>\1</span>)。</p>
<p>你也可以自己指定子表达式的<span class=name>组名</span>。要指定一个子表达式的组名，请使用这样的语法：<span class=code>(?&lt;Word&gt;\w+)</span>(或者把尖括号换成<span class=code>'</span>也行：<span class=code>(?'Word'\w+)</span>),这样就把<span class=part>\w+</span>的组名指定为<span class=part>Word</span>了。要反向引用这个分组<span class=name>捕获</span>的内容，你可以使用<span class=code>\k&lt;Word&gt;</span>,所以上一个例子也可以写成这样：<span class=regex>\b(?&lt;Word&gt;\w+)\b\s+\k&lt;Word&gt;\b</span>。</p>
<p>使用小括号的时候，还有很多特定用途的语法。下面列出了最常用的一些：</p>
<table cellSpacing=0>
    <caption>表4.常用分组语法</caption>
    <tbody>
        <tr>
            <th scope=col>分类</th>
            <th scope=col>代码/语法</th>
            <th scope=col>说明</th>
        </tr>
        <tr>
            <th rowSpan=3>捕获</th>
            <td><span class=code>(exp)</span></td>
            <td><span class=desc>匹配exp,并捕获文本到自动命名的组里</span></td>
        </tr>
        <tr>
            <td><span class=code>(?&lt;name&gt;exp)</span></td>
            <td><span class=desc>匹配exp,并捕获文本到名称为name的组里，也可以写成(?'name'exp)</span></td>
        </tr>
        <tr>
            <td><span class=code>(?:exp)</span></td>
            <td><span class=desc>匹配exp,不捕获匹配的文本，也不给此分组分配组号</span></td>
        </tr>
        <tr>
            <th rowSpan=4>零宽断言</th>
            <td><span class=code>(?=exp)</span></td>
            <td><span class=desc>匹配exp前面的位置</span></td>
        </tr>
        <tr>
            <td><span class=code>(?&lt;=exp)</span></td>
            <td><span class=desc>匹配exp后面的位置</span></td>
        </tr>
        <tr>
            <td><span class=code>(?!exp)</span></td>
            <td><span class=desc>匹配后面跟的不是exp的位置</span></td>
        </tr>
        <tr>
            <td><span class=code>(?&lt;!exp)</span></td>
            <td><span class=desc>匹配前面不是exp的位置</span></td>
        </tr>
        <tr>
            <th>注释</th>
            <td><span class=code>(?#comment)</span></td>
            <td><span class=desc>这种类型的分组不对正则表达式的处理产生任何影响，用于提供注释让人阅读</span></td>
        </tr>
    </tbody>
</table>
<p>我们已经讨论了前两种语法。第三个<span class=code>(?:exp)</span>不会改变正则表达式的处理方式，只是这样的组匹配的内容<span class=desc>不会像前两种那样被捕获到某个组里面，也不会拥有组号</span>。</p>
<h2 id=lookaround>零宽断言</h2>
<p class=note>地球人，是不是觉得这些术语名称太复杂，太难记了？我也和你一样。知道有这么一种东西就行了，它叫什么，随它去吧！&#8220;无名，万物之始...&#8221;</p>
<p>接下来的四个用于查找在某些内容(但并不包括这些内容)之前或之后的东西，也就是说它们像<span class=code>\b</span>,<span class=code>^</span>,<span class=code>$</span>那样用于指定一个位置，这个位置应该满足一定的条件(即断言)，因此它们也被称为<span class=name>零宽断言</span>。最好还是拿例子来说明吧：</p>
<p class=note>断言用来声明一个应该为真的事实。正则表达式中只有当断言为真时才会继续进行匹配。</p>
<p><span class=code>(?=exp)</span>也叫<span class=name>零宽度正预测先行断言</span>，它<span class=desc>断言自身出现的位置的后面能匹配表达式exp</span>。比如<span class=regex>\b\w+(?=ing\b)</span>，匹配<span class=desc>以ing结尾的单词的前面部分(除了ing以外的部分)</span>，如查找<span class=string>I'm singing while you're dancing.</span>时，它会匹配<span class=desc>sing</span>和<span class=desc>danc</span>。</p>
<p><span class=code>(?&lt;=exp)</span>也叫<span class=name>零宽度正回顾后发断言</span>，它<span class=desc>断言自身出现的位置的前面能匹配表达式exp</span>。比如<span class=regex>(?&lt;=\bre)\w+\b</span>会匹配<span class=desc>以re开头的单词的后半部分(除了re以外的部分)</span>，例如在查找<span class=string>reading a book</span>时，它匹配<span class=desc>ading</span>。</p>
<p>假如你想要给一个很长的数字中每三位间加一个逗号(当然是从右边加起了)，你可以这样查找需要在前面和里面添加逗号的部分：<span class=regex>((?&lt;=\d)\d{3})*\b</span>，用它对<span class=string>1234567890</span>进行查找时结果是<span class=desc>234567890</span>。</p>
<p>下面这个例子同时使用了这两种断言：<span class=regex>(?&lt;=\s)\d+(?=\s)</span>匹配<span class=desc>以空白符间隔的数字(再次强调，不包括这些空白符)</span>。</p>
<h2 id=negativelookaround>负向零宽断言</h2>
<p>前面我们提到过怎么查找<strong>不是某个字符或不在某个字符类里</strong>的字符的方法(反义)。但是如果我们只是想要<strong>确保某个字符没有出现，但并不想去匹配它</strong>时怎么办？例如，如果我们想查找这样的单词--它里面出现了字母q,但是q后面跟的不是字母u,我们可以尝试这样：</p>
<p><span class=regex>\b\w*q[^u]\w*\b</span>匹配<span class=desc>包含<strong>后面不是字母u的字母q</strong>的单词</span>。但是如果多做测试(或者你思维足够敏锐，直接就观察出来了)，你会发现，如果q出现在单词的结尾的话，像<strong>Iraq</strong>,<strong>Benq</strong>，这个表达式就会出错。这是因为<span class=part>[^u]</span>总要匹配一个字符，所以如果q是单词的最后一个字符的话，后面的<span class=part>[^u]</span>将会匹配q后面的单词分隔符(可能是空格，或者是句号或其它的什么)，后面的<span class=part>\w*\b</span>将会匹配下一个单词，于是<span class=regex>\b\w*q[^u]\w*\b</span>就能匹配整个<span class=string>Iraq fighting</span>。<span class=name>负向零宽断言</span>能解决这样的问题，因为它只匹配一个位置，并不<strong>消费</strong>任何字符。现在，我们可以这样来解决这个问题：<span class=regex>\b\w*q(?!u)\w*\b</span>。</p>
<p><span class=name>零宽度负预测先行断言</span><span class=code>(?!exp)</span>，<span class=desc>断言此位置的后面不能匹配表达式exp</span>。例如：<span class=regex>\d{3}(?!\d)</span>匹配<span class=desc>三位数字，而且这三位数字的后面不能是数字</span>；<span class=regex>\b((?!abc)\w)+\b</span>匹配<span class=desc>不包含连续字符串abc的单词</span>。</p>
<p>同理，我们可以用<span class=code>(?&lt;!exp)</span>,<span class=name>零宽度正回顾后发断言</span>来<span class=desc>断言此位置的前面不能匹配表达式exp</span>：<span class=regex>(?&lt;![a-z])\d{7}</span>匹配<span class=desc>前面不是小写字母的七位数字</span>。</p>
<p class=note>请详细分析表达式<span class=regex>(?&lt;=&lt;(\w+)&gt;).*(?=&lt;\/\1&gt;)</span>，这个表达式最能表现零宽断言的真正用途。</p>
<p>一个更复杂的例子：<span class=regex>(?&lt;=&lt;(\w+)&gt;).*(?=&lt;\/\1&gt;)</span>匹配<span class=desc>不包含属性的简单HTML标签内里的内容</span>。<span class=code>(&lt;?(\w+)&gt;)</span>指定了这样的<span class=name>前缀</span>：<span class=desc>被尖括号括起来的单词</span>(比如可能是&lt;b&gt;)，然后是<span class=part>.*</span>(任意的字符串),最后是一个<span class=name>后缀</span><span class=part>(?=&lt;\/\1&gt;)</span>。注意后缀里的<span class=part>\/</span>，它用到了前面提过的字符转义；<span class=part>\1</span>则是一个反向引用，引用的正是<span class=desc>捕获的第一组</span>，前面的<span class=part>(\w+)</span>匹配的内容，这样如果前缀实际上是&lt;b&gt;的话，后缀就是&lt;/b&gt;了。整个表达式匹配的是&lt;b&gt;和&lt;/b&gt;之间的内容(再次提醒，不包括前缀和后缀本身)。</p>
<h2 id=commenting>注释</h2>
<p>小括号的另一种用途是通过语法<span class=code>(?#comment)</span>来包含注释。例如：<span class=regex>2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)</span>。</p>
<p>要包含注释的话，最好是启用&#8220;忽略模式里的空白符&#8221;选项，这样在编写表达式时能任意的添加空格，Tab，换行，而实际使用时这些都将被忽略。启用这个选项后，在#后面到这一行结束的所有文本都将被当成注释忽略掉。例如，我们可以前面的一个表达式写成这样：</p>
<pre class=regex>      (?&lt;=    # 断言要匹配的文本的前缀<br>      &lt;(\w+)&gt; # 查找尖括号括起来的字母或数字(即HTML/XML标签)<br>      )       # 前缀结束<br>      .*      # 匹配任意文本<br>      (?=     # 断言要匹配的文本的后缀<br>      &lt;\/\1&gt;  # 查找尖括号括起来的内容：前面是一个"/"，后面是先前捕获的标签<br>      )       # 后缀结束</pre>
<h2 id=greedyandlazy>贪婪与懒惰</h2>
<p>当正则表达式中包含能接受重复的限定符时，通常的行为是（在使整个表达式能得到匹配的前提下）匹配<strong>尽可能多</strong>的字符。考虑这个表达式：<span class=regex>a.*b</span>，它将会匹配<span class=desc>最长的以a开始，以b结束的字符串</span>。如果用它来搜索<span class=string>aabab</span>的话，它会匹配整个字符串<span class=desc>aabab</span>。这被称为<span class=name>贪婪</span>匹配。</p>
<p>有时，我们更需要<span class=name>懒惰</span>匹配，也就是匹配<strong>尽可能少</strong>的字符。前面给出的限定符都可以被转化为懒惰匹配模式，只要在它后面加上一个问号<span class=code>?</span>。这样<span class=regex>.*?</span>就意味着<span class=desc>匹配任意数量的重复，但是在能使整个匹配成功的前提下使用最少的重复</span>。现在看看懒惰版的例子吧：</p>
<p><span class=regex>a.*?b</span>匹配<span class=desc>最短的，以a开始，以b结束的字符串</span>。如果把它应用于<span class=string>aabab</span>的话，它会匹配<span class=desc>aab（第一到第三个字符）</span>和<span class=desc>ab（第四到第五个字符）</span>。</p>
<p class=note>为什么第一个匹配是aab（第一到第三个字符）而不是ab（第二到第三个字符）？简单地说，因为正则表达式有另一条规则，比懒惰／贪婪规则的优先级更高：最先开始的匹配拥有最高的优先权——The match that begins earliest wins。</p>
<table cellSpacing=0>
    <caption>表5.懒惰限定符</caption>
    <thead>
        <tr>
            <th scope=col>代码/语法</th>
            <th scope=col>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class=code>*?</span></td>
            <td><span class=desc>重复任意次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class=code>+?</span></td>
            <td><span class=desc>重复1次或更多次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class=code>??</span></td>
            <td><span class=desc>重复0次或1次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class=code>{n,m}?</span></td>
            <td><span class=desc>重复n到m次，但尽可能少重复</span></td>
        </tr>
        <tr>
            <td><span class=code>{n,}?</span></td>
            <td><span class=desc>重复n次以上，但尽可能少重复</span></td>
        </tr>
    </tbody>
</table>
<h2 id=regexoptions>处理选项</h2>
<p class=note>在C#中，你可以使用<a title="MSDN 相关文档" href="http://msdn2.microsoft.com/zh-cn/library/h5845fdz.aspx"><u><font color=#0000ff>Regex(String, RegexOptions)构造函数</font></u></a>来设置正则表达式的处理选项。如：Regex regex = new Regex("\ba\w{6}\b", RegexOptions.IgnoreCase);</p>
<p>上面介绍了几个选项如忽略大小写，处理多行等，这些选项能用来改变处理正则表达式的方式。下面是.Net中常用的正则表达式选项：</p>
<table cellSpacing=0>
    <caption>表6.常用的处理选项</caption>
    <thead>
        <tr>
            <th scope=col>名称</th>
            <th scope=col>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>IgnoreCase(忽略大小写)</td>
            <td>匹配时不区分大小写。</td>
        </tr>
        <tr>
            <td>Multiline(多行模式)</td>
            <td>更改<span class=code>^</span>和<span class=code>$</span>的含义，使它们分别在任意一行的行首和行尾匹配，而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,<span class=code>$</span>的精确含意是:匹配\n之前的位置以及字符串结束前的位置.) </td>
        </tr>
        <tr>
            <td>Singleline(单行模式)</td>
            <td>更改<span class=code>.</span>的含义，使它与每一个字符匹配（包括换行符\n）。 </td>
        </tr>
        <tr>
            <td>IgnorePatternWhitespace(忽略空白)</td>
            <td>忽略表达式中的非转义空白并启用由<span class=code>#</span>标记的注释。</td>
        </tr>
        <tr>
            <td>RightToLeft(从右向左查找)</td>
            <td>匹配从右向左而不是从左向右进行。</td>
        </tr>
        <tr>
            <td>ExplicitCapture(显式捕获)</td>
            <td>仅捕获已被显式命名的组。</td>
        </tr>
        <tr>
            <td>ECMAScript(JavaScript兼容模式)</td>
            <td>使表达式的行为与它在JavaScript里的行为一致。</td>
        </tr>
    </tbody>
</table>
<p>一个经常被问到的问题是：是不是只能同时使用多行模式和单行模式中的一种？答案是：不是。这两个选项之间没有任何关系，除了它们的名字比较相似（以至于让人感到疑惑）以外。</p>
<h2 id=balancedgroup>平衡组/递归匹配</h2>
<p class="important note">这里介绍的平衡组语法是由.Net Framework支持的；其它语言／库不一定支持这种功能，或者支持此功能但需要使用不同的语法。</p>
<p>有时我们需要匹配像<span class=desc>( 100 * ( 50 + 15 ) )这样的可嵌套的层次性结构</span>，这时简单地使用<span class=code>\(.+\)</span>则只会匹配到最左边的左括号和最右边的右括号之间的内容(这里我们讨论的是贪婪模式，懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次数不相等，比如<span class=string>( 5 / ( 3 + 2 ) ) )</span>，那我们的匹配结果里两者的个数也不会相等。有没有办法在这样的字符串里匹配到最长的，配对的括号之间的内容呢？</p>
<p>为了避免<span class=code>(</span>和<span class=code>\(</span>把你的大脑彻底搞糊涂，我们还是用尖括号代替圆括号吧。现在我们的问题变成了如何把<span class=string>xx &lt;aa &lt;bbb&gt; &lt;bbb&gt; aa&gt; yy</span>这样的字符串里，最长的配对的尖括号内的内容捕获出来？</p>
<p>这里需要用到以下的语法构造：</p>
<ul>
    <li><span class=code>(?'group')</span> 把捕获的内容命名为group,并压入<span class=name>堆栈(Stack)</span>
    <li><span class=code>(?'-group')</span> 从堆栈上弹出最后压入堆栈的名为group的捕获内容，如果堆栈本来为空，则本分组的匹配失败
    <li><span class=code>(?(group)yes|no)</span> 如果堆栈上存在以名为group的捕获内容的话，继续匹配yes部分的表达式，否则继续匹配no部分
    <li><span class=code>(?!)</span> 零宽负向先行断言，由于没有后缀表达式，试图匹配总是失败</li>
</ul>
<p class=note>如果你不是一个程序员（或者你自称程序员但是不知道堆栈是什么东西），你就这样理解上面的三种语法吧：第一个就是在黑板上写一个"group"，第二个就是从黑板上擦掉一个"group"，第三个就是看黑板上写的还有没有"group"，如果有就继续匹配yes部分，否则就匹配no部分。</p>
<p>我们需要做的是每碰到了左括号，就在压入一个"Open",每碰到一个右括号，就弹出一个，到了最后就看看堆栈是否为空－－如果不为空那就证明左括号比右括号多，那匹配就应该失败。正则表达式引擎会进行回溯(放弃最前面或最后面的一些字符)，尽量使整个表达式得到匹配。</p>
<pre class=regex>&lt;                         #最外层的左括号<br>    [^&lt;&gt;]*                #最外层的左括号后面的不是括号的内容<br>    (<br>        (<br>            (?'Open'&lt;)    #碰到了左括号，在黑板上写一个"Open"<br>            [^&lt;&gt;]*       #匹配左括号后面的不是括号的内容<br>        )+<br>        (<br>            (?'-Open'&gt;)   #碰到了右括号，擦掉一个"Open"<br>            [^&lt;&gt;]*        #匹配右括号后面不是括号的内容<br>        )+<br>    )*<br>    (?(Open)(?!))         #在遇到最外层的右括号前面，判断黑板上还有没有没擦掉的"Open"；如果还有，则匹配失败<br>&gt;                         #最外层的右括号</pre>
<p>平衡组的一个最常见的应用就是匹配HTML,下面这个例子可以匹配<span class=desc>嵌套的&lt;div&gt;标签</span>：<span class=regex>&lt;div[^&gt;]*&gt;[^&lt;&gt;]*(((?'Open'&lt;div[^&gt;]*&gt;)[^&lt;&gt;]*)+((?'-Open'&lt;/div&gt;)[^&lt;&gt;]*)+)*(?(Open)(?!))&lt;/div&gt;</span>.</p>
<h2 id=more>还有些什么东西没提到</h2>
<p>我已经描述了构造正则表达式的大量元素，还有一些我没有提到的东西。下面是未提到的元素的列表，包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到关于.net下正则表达式详细的文档。</p>
<table cellSpacing=0>
    <caption>表7.尚未详细讨论的语法</caption>
    <thead>
        <tr>
            <th scope=col>代码/语法</th>
            <th scope=col>说明</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td><span class=code>\a</span></td>
            <td><span class=desc>报警字符(打印它的效果是电脑嘀一声)</span></td>
        </tr>
        <tr>
            <td><span class=code>\b</span></td>
            <td><span class=desc>通常是单词分界位置，但如果在字符类里使用代表退格</span></td>
        </tr>
        <tr>
            <td><span class=code>\t</span></td>
            <td><span class=desc>制表符，Tab</span></td>
        </tr>
        <tr>
            <td><span class=code>\r</span></td>
            <td><span class=desc>回车</span></td>
        </tr>
        <tr>
            <td><span class=code>\v</span></td>
            <td><span class=desc>竖向制表符</span></td>
        </tr>
        <tr>
            <td><span class=code>\f</span></td>
            <td><span class=desc>换页符</span></td>
        </tr>
        <tr>
            <td><span class=code>\n</span></td>
            <td><span class=desc>换行符</span></td>
        </tr>
        <tr>
            <td><span class=code>\e</span></td>
            <td><span class=desc>Escape</span></td>
        </tr>
        <tr>
            <td><span class=code>\0nn</span></td>
            <td><span class=desc>ASCII代码中八进制代码为nn的字符</span></td>
        </tr>
        <tr>
            <td><span class=code>\xnn</span></td>
            <td><span class=desc>ASCII代码中十六进制代码为nn的字符</span></td>
        </tr>
        <tr>
            <td><span class=code>\unnnn</span></td>
            <td><span class=desc>Unicode代码中十六进制代码为nnnn的字符</span></td>
        </tr>
        <tr>
            <td><span class=code>\cN</span></td>
            <td><span class=desc>ASCII控制字符。比如\cC代表Ctrl+C</span></td>
        </tr>
        <tr>
            <td><span class=code>\A</span></td>
            <td><span class=desc>字符串开头(类似^，但不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class=code>\Z</span></td>
            <td><span class=desc>字符串结尾或行尾(不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class=code>\z</span></td>
            <td><span class=desc>字符串结尾(类似$，但不受处理多行选项的影响)</span></td>
        </tr>
        <tr>
            <td><span class=code>\G</span></td>
            <td><span class=desc>当前搜索的开头</span></td>
        </tr>
        <tr>
            <td><span class=code>\p{name}</span></td>
            <td><span class=desc>Unicode中命名为name的字符类，例如\p{IsGreek}</span></td>
        </tr>
        <tr>
            <td><span class=code>(?&gt;exp)</span></td>
            <td><span class=desc>贪婪子表达式</span></td>
        </tr>
        <tr>
            <td><span class=code>(?&lt;x&gt;-&lt;y&gt;exp)</span></td>
            <td><span class=desc>平衡组</span></td>
        </tr>
        <tr>
            <td><span class=code>(?im-nsx:exp)</span></td>
            <td><span class=desc>在子表达式exp中改变处理选项</span></td>
        </tr>
        <tr>
            <td><span class=code>(?im-nsx)</span></td>
            <td><span class=desc>为表达式后面的部分改变处理选项</span></td>
        </tr>
        <tr>
            <td><span class=code>(?(exp)yes|no)</span></td>
            <td><span class=desc>把exp当作零宽正向先行断言，如果在这个位置能匹配，使用yes作为此组的表达式；否则使用no</span></td>
        </tr>
        <tr>
            <td><span class=code>(?(exp)yes)</span></td>
            <td><span class=desc>同上，只是使用空表达式作为no</span></td>
        </tr>
        <tr>
            <td><span class=code>(?(name)yes|no)</span></td>
            <td><span class=desc>如果命名为name的组捕获到了内容，使用yes作为表达式；否则使用no</span></td>
        </tr>
        <tr>
            <td><span class=code>(?(name)yes)</span></td>
            <td><span class=desc>同上，只是使用空表达式作为no</span></td>
        </tr>
    </tbody>
</table>
<h2 id=contact>联系作者</h2>
<p>好吧,我承认,我骗了你,读到这里你肯定花了不止30分钟.相信我,这是我的错,而不是因为你太笨.我之所以说"30分钟",是为了让你有信心,有耐心继续下去.既然你看到了这里,那证明我的阴谋成功了.被忽悠的感觉很爽吧？</p>
<p>要投诉我,或者觉得我其实可以做得更好,或者有任何其它问题,欢迎来<a href="http://www.cnblogs.com/deerchao/archive/2006/08/24/zhengzhe30fengzhongjiaocheng.html"><u><font color=#0000ff>我的博客</font></u></a>让我知道.</p>
<img src ="http://www.cppblog.com/expter/aggbug/71746.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-01-11 19:50 <a href="http://www.cppblog.com/expter/archive/2009/01/11/71746.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转：一种经典的网络游戏服务器架构 </title><link>http://www.cppblog.com/expter/archive/2009/01/07/71437.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Wed, 07 Jan 2009 13:19:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2009/01/07/71437.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/71437.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2009/01/07/71437.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/71437.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/71437.html</trackback:ping><description><![CDATA[from:http://www.cppblog.com/johndragon/archive/2008/04/10/46768.html<br>首先，二话不说，上图（用Windows画图画的。。。）<br><br><img height=768 alt="" src="http://www.cppblog.com/images/cppblog_com/johndragon/servergraph.jpg" width=988 border=0><br>这个图是一个区的架构图，所有区的架构是一样的。上面虚线框的ServerGroup和旁边方框内的架构一样。图上的所有x N的服务器，都是多台一起的。红线，绿线，和蓝线图上也有图示，这里就不多介绍了。关于Agent Server大家也能看出来，其实就是Gate。<br>这里主要介绍下图上的标记了号码的位置的数据连接的内容和意义。<br><br>1-&nbsp;&nbsp;&nbsp;这是一条WebService的管道，在用户激活该区帐号，或者修改帐号密码的时候，通过这条通道来插入和更新用户的帐号信息。<br>2-&nbsp;&nbsp;&nbsp;这也是一条WebService管道，用来获取和控制用户该该组内的角色信息，以及进行付费商城代币之类的更新操作。<br>3-&nbsp;&nbsp;&nbsp;这是一条本地的TCP/IP连接，这条连接主要用来进行服务器组在登陆服务器的注册，以及登陆服务器验证帐户后，向用户服务器注册帐户登陆信息，以及进行对已经登陆的帐户角色信息进行操作（比如踢掉当前登陆的角色），还有服务器组的信息更新（当前在线玩家数量等）。<br>4-&nbsp;&nbsp;&nbsp;这也是一条本地TCP/IP连接，这条连接用来对连接到GameServer的客户端进行验证，以及获取角色数据信息，还有传回GameServer上角色的数据信息改变。<br>5-&nbsp;&nbsp;&nbsp;这条连接也是一条本地的TCP/IP连接，它用来进行公共信息服务器和数个游戏服务器间的交互，用来交换一些游戏世界级的信息（比如公会信息，跨服组队信息，跨服聊天频道等）。<br>6-&nbsp;&nbsp;&nbsp;这里的两条连接，想表达的意思是，UserServer和GameServer的Agent是可以互换使用的，也就是玩家进入组内之后，就不需要再切换Agent。如果不怕乱套，也可以把登陆服务器的Agent也算上，这样用户整个过程里就不需要再更换Agent，减少重复连接的次数，也提高了稳定性。（毕竟连接次数少了，也降低了连不上服务器的出现几率）<br><br>在这个架构里面，GameServer实际上是一个游戏逻辑的综合体，里面可以再去扩展成几个不同的逻辑服务器，通过PublicServer进行公共数据交换。<br>UserServer实际上扮演了一个ServerGroup的领头羊的角色，它负责向LoginServer注册和更新服务器组的信息（名字，当前人数），并且对Agent进行调度，对选择了该组的玩家提供一个用户量最少的Agent。同时，它也兼了一个角色管理服务器的功能，发送给客户端当前的角色列表，角色的创建，删除，选择等管理操作，都是在这里进行的。而且，它还是一个用户信息的验证服务器，GameServer需要通过它来进行客户端的合法性验证，以及获取玩家选择的角色数据信息。<br><br><br>采用这种架构的游戏，通常有以下表现。<br>1- 用户必须激活一个大区，才能在大区内登陆自己的帐号。<br>2- 用户启动客户端的时候，弹出一个登陆器，选择大区。<br>3- 用户启动真正的客户端的时候，一开始就是输入帐号密码。<br>4- 帐号验证完成之后，进行区内的服务器选择。<br>5- 服务器选择完成之后，进入角色管理。同时，角色在不同的服务器里不能共享。<br><br>市面上符合上面几个表现特征的游戏相当的多，而且也不乏旷世巨作。这个架构不是一个新的架构，但是它足够经典和完善，并且逻辑简单而清晰，用来做MMORPG，或者其它网络游戏的服务器架构，是一种不错的选择。<br>
<img src ="http://www.cppblog.com/expter/aggbug/71437.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2009-01-07 21:19 <a href="http://www.cppblog.com/expter/archive/2009/01/07/71437.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一些笔试题（包括金山西山居笔试）</title><link>http://www.cppblog.com/expter/archive/2008/12/22/70109.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Mon, 22 Dec 2008 14:24:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2008/12/22/70109.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/70109.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2008/12/22/70109.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/70109.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/70109.html</trackback:ping><description><![CDATA[以前做过的笔试题，都是自己曾经做的<br><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><span style="COLOR: #000000">#&nbsp;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></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></span><span style="COLOR: #0000ff">#define</span><span style="COLOR: #000000">&nbsp;Q(x)&nbsp;&nbsp;x*x</span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_71_161_Open_Image onclick="this.style.display='none'; Codehighlighter1_71_161_Open_Text.style.display='none'; Codehighlighter1_71_161_Closed_Image.style.display='inline'; Codehighlighter1_71_161_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_71_161_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_71_161_Closed_Text.style.display='none'; Codehighlighter1_71_161_Open_Image.style.display='inline'; Codehighlighter1_71_161_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_71_161_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"></span><span id=Codehighlighter1_71_161_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;b&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">2</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;c&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;</span><span style="COLOR: #000000">/=</span><span style="COLOR: #000000">Q(b</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">c)</span><span style="COLOR: #000000">/</span><span style="COLOR: #000000">Q(b</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">c);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;a&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&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>}</span></span></div>
<p><br>因为 宏Q(x) 不规范，<br>所以结果 很迷惑人<br><br>a&nbsp;&nbsp; /=Q(b+c)/Q(b+c);的执行顺序是从右到左<br><br>tmp = Q(b+c)/Q(b+c) =&nbsp; 2+1*2+1 / 2+1*2+1 =2+2+0+2+1=7&nbsp; 没有对宏加括号是经常容易犯错！<br><br>a = a/tmp = 10/7 = 1<br><br>所以&nbsp; a = 1;<br><br><br><br><br><br><br><br><br>-----------------------------------------<br><br>题目2<br>反转一个字符串（西山居笔试题）：<br>题目：写一个函数，把一个以0字符结尾的字符串str中的'A'字符移到str的末尾！<br><br>分析：<br>1：以时间换空间&nbsp;&nbsp; 从后向前循环查找字符A<br>2：以空间换时间&nbsp;&nbsp; 一次循环 <br><br>算法1代码：<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><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Deal(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">str&nbsp;)<br><img id=Codehighlighter1_22_442_Open_Image onclick="this.style.display='none'; Codehighlighter1_22_442_Open_Text.style.display='none'; Codehighlighter1_22_442_Closed_Image.style.display='inline'; Codehighlighter1_22_442_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_22_442_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_442_Closed_Text.style.display='none'; Codehighlighter1_22_442_Open_Image.style.display='inline'; Codehighlighter1_22_442_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_22_442_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"></span><span id=Codehighlighter1_22_442_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strlen(str);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;len</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,b</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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(str[a]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_100_150_Open_Image onclick="this.style.display='none'; Codehighlighter1_100_150_Open_Text.style.display='none'; Codehighlighter1_100_150_Closed_Image.style.display='inline'; Codehighlighter1_100_150_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_100_150_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_100_150_Closed_Text.style.display='none'; Codehighlighter1_100_150_Open_Image.style.display='inline'; Codehighlighter1_100_150_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_100_150_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"></span><span id=Codehighlighter1_100_150_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果最后一个字符不为'0'</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(a</span><span style="COLOR: #000000">&gt;=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_173_440_Open_Image onclick="this.style.display='none'; Codehighlighter1_173_440_Open_Text.style.display='none'; Codehighlighter1_173_440_Closed_Image.style.display='inline'; Codehighlighter1_173_440_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_173_440_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_173_440_Closed_Text.style.display='none'; Codehighlighter1_173_440_Open_Image.style.display='inline'; Codehighlighter1_173_440_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_173_440_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"></span><span id=Codehighlighter1_173_440_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(str[a]&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_210_421_Open_Image onclick="this.style.display='none'; Codehighlighter1_210_421_Open_Text.style.display='none'; Codehighlighter1_210_421_Closed_Image.style.display='inline'; Codehighlighter1_210_421_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_210_421_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_210_421_Closed_Text.style.display='none'; Codehighlighter1_210_421_Open_Image.style.display='inline'; Codehighlighter1_210_421_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_210_421_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"></span><span id=Codehighlighter1_210_421_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;a;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(n&nbsp;</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">&nbsp;len</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">b</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_279_353_Open_Image onclick="this.style.display='none'; Codehighlighter1_279_353_Open_Text.style.display='none'; Codehighlighter1_279_353_Closed_Image.style.display='inline'; Codehighlighter1_279_353_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_279_353_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_279_353_Closed_Text.style.display='none'; Codehighlighter1_279_353_Open_Image.style.display='inline'; Codehighlighter1_279_353_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_279_353_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"></span><span id=Codehighlighter1_279_353_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[n]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;str[n</span><span style="COLOR: #000000">+</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">];&nbsp;&nbsp;</span><span style="COLOR: #008000">//<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;str[n]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">b累加，表示有b个字符A</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a</span><span style="COLOR: #000000">--</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br><br><br>算法2:<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><span style="COLOR: #0000ff">void</span><span style="COLOR: #000000">&nbsp;Deal(</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">str&nbsp;)<br><img id=Codehighlighter1_22_476_Open_Image onclick="this.style.display='none'; Codehighlighter1_22_476_Open_Text.style.display='none'; Codehighlighter1_22_476_Closed_Image.style.display='inline'; Codehighlighter1_22_476_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_22_476_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_22_476_Closed_Text.style.display='none'; Codehighlighter1_22_476_Open_Image.style.display='inline'; Codehighlighter1_22_476_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_22_476_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"></span><span id=Codehighlighter1_22_476_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;len&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;strlen(str);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;a</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;len</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,b</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,i</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,j</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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(str[a]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_108_158_Open_Image onclick="this.style.display='none'; Codehighlighter1_108_158_Open_Text.style.display='none'; Codehighlighter1_108_158_Closed_Image.style.display='inline'; Codehighlighter1_108_158_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_108_158_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_108_158_Closed_Text.style.display='none'; Codehighlighter1_108_158_Open_Image.style.display='inline'; Codehighlighter1_108_158_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_108_158_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"></span><span id=Codehighlighter1_108_158_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">return</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果最后一个字符不为'0'</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;tmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">[len</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>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">(i</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">len)<br><img id=Codehighlighter1_215_332_Open_Image onclick="this.style.display='none'; Codehighlighter1_215_332_Open_Text.style.display='none'; Codehighlighter1_215_332_Closed_Image.style.display='inline'; Codehighlighter1_215_332_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_215_332_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_215_332_Closed_Text.style.display='none'; Codehighlighter1_215_332_Open_Image.style.display='inline'; Codehighlighter1_215_332_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_215_332_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"></span><span id=Codehighlighter1_215_332_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">(str[i]&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">)<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp[j</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;str[i];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">多少个字符A</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">while</span><span style="COLOR: #000000">&nbsp;(j</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">len)<br><img id=Codehighlighter1_357_387_Open_Image onclick="this.style.display='none'; Codehighlighter1_357_387_Open_Text.style.display='none'; Codehighlighter1_357_387_Closed_Image.style.display='inline'; Codehighlighter1_357_387_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_357_387_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_357_387_Closed_Text.style.display='none'; Codehighlighter1_357_387_Open_Image.style.display='inline'; Codehighlighter1_357_387_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_357_387_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"></span><span id=Codehighlighter1_357_387_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp[j</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">'</span><span style="COLOR: #000000">A</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;tmp[len]&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">\0</span><span style="COLOR: #000000">'</span><span style="COLOR: #000000">;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;strcpy(str,tmp);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;tmp;&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></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;tmp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;NULL;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top></span></div>
<br><br><br>PS:因为是直接手写的。。所以难免有错误！<br>现在修改了，对不起各位。。。 
<img src ="http://www.cppblog.com/expter/aggbug/70109.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2008-12-22 22:24 <a href="http://www.cppblog.com/expter/archive/2008/12/22/70109.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>广播实现代码</title><link>http://www.cppblog.com/expter/archive/2008/12/08/68819.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Mon, 08 Dec 2008 02:44:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2008/12/08/68819.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/68819.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2008/12/08/68819.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/68819.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/68819.html</trackback:ping><description><![CDATA[首先 UDP 默认不能实现广播<br>要实现一个机子的广播，首先 应该明白2个函数<br>&nbsp;&nbsp;&nbsp;&nbsp; 1.setsockopt 开启发送广播报文<br>&nbsp;&nbsp;&nbsp;&nbsp; 2.getsockopt 确定广播选项是否关闭<br><br>setsockopt 的原型定义：<br>WINSOCK_API_LINKAGE int WSAAPI setsockopt( IN SOCKET s, IN int level, IN int optname, IN const char FAR * optval, IN int optlen )<br>开启报文代码<br><br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(setsockopt(sock,SOL_SOCKET,SO_BROADCAST,(</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">bborad,oplen)&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;SOCKET_ERROR)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">setsockopt error!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&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;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br>作为server:<br>然后发送广播报文<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;addr;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nlen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(addr);<br>&nbsp;&nbsp;&nbsp;&nbsp;memset(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">addr,</span><span style="color: #000000;">0</span><span style="color: #000000;">,nlen);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_family&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AF_INET;<br>&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_port&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;htons(</span><span style="color: #000000;">9999</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;addr.sin_addr.s_addr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">INADDR_BROADCAST;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">const</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">msg&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">hello!&nbsp;This&nbsp;is&nbsp;a&nbsp;test!</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;len&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;strlen(msg);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(sendto(sock,msg,len,</span><span style="color: #000000;">0</span><span style="color: #000000;">,(</span><span style="color: #0000ff;">struct</span><span style="color: #000000;">&nbsp;sockaddr&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">addr,</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(addr))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;SOCKET_ERROR)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">send&nbsp;error&nbsp;!!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&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;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<br><br>然后客户端：<br>接受报文：<br>2008年12月8日
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#&nbsp;include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">WinSock2.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br>#&nbsp;include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br><br>#pragma&nbsp;&nbsp;&nbsp;comment(lib,&nbsp;&nbsp;&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">ws2_32.lib</span><span style="color: #000000;">"</span><span style="color: #000000;">)<br></span><span style="color: #0000ff;">#define</span><span style="color: #000000;">&nbsp;WSVERS&nbsp;MAKEWORD(2,0)</span><span style="color: #000000;"><br></span><span style="color: #008000;">//</span><span style="color: #008000;">CInitSock&nbsp;initSock;</span><span style="color: #008000;"><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;WSADATA&nbsp;wsadata;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(WSAStartup(WSVERS,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">wsadata))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">WSAStartup&nbsp;failed!\n</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&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;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;SOCKET&nbsp;sLiten&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;::socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(sLiten&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;INVALID_SOCKET)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">WSACleanup&nbsp;failed&nbsp;with&nbsp;error&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,WSAGetLastError());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">printf("&nbsp;Failed&nbsp;socket()");</span><span style="color: #008000;"><br></span><span style="color: #000000;">&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;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;local;<br>&nbsp;&nbsp;&nbsp;&nbsp;local.sin_family&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;AF_INET;<br>&nbsp;&nbsp;&nbsp;&nbsp;local.sin_port&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;htons(</span><span style="color: #000000;">9999</span><span style="color: #000000;">);<br>&nbsp;&nbsp;&nbsp;&nbsp;local.sin_addr.s_addr&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">INADDR_ANY;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(::bind(sLiten,(LPSOCKADDR)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">local,</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(local))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;SOCKET_ERROR)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;failed&nbsp;bind()</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br>&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;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;buf[</span><span style="color: #000000;">1024</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;sockaddr_in&nbsp;addr;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;nlen&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(addr);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">while</span><span style="color: #000000;">(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;recv&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;::recvfrom(sLiten,buf,</span><span style="color: #000000;">1024</span><span style="color: #000000;">,</span><span style="color: #000000;">0</span><span style="color: #000000;">,(sockaddr&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">addr,</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">nlen);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(recv&nbsp;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buf[recv]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">\0</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">接收到数据&nbsp;&nbsp;(%s):&nbsp;(%s)</span><span style="color: #000000;">"</span><span style="color: #000000;">,::inet_ntoa(addr.sin_addr),buf);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;::closesocket(sLiten);<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;"> </span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>}</span></div>
<br><br><img src ="http://www.cppblog.com/expter/aggbug/68819.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2008-12-08 10:44 <a href="http://www.cppblog.com/expter/archive/2008/12/08/68819.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL 中 map和set的区别</title><link>http://www.cppblog.com/expter/archive/2008/12/06/68714.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sat, 06 Dec 2008 02:43:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2008/12/06/68714.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/68714.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2008/12/06/68714.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/68714.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/68714.html</trackback:ping><description><![CDATA[stl中：<br>MAP的节点是一对数据. &nbsp; <br>SET的节点是一个数据.<br><br>
Map使用关键值Key来唯一标识每一个成员 map可以重复。<br>
set是集合&nbsp;&nbsp;&nbsp;  <br><br>&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;  &nbsp;&nbsp;&nbsp;  <br>都属于关联容器 &nbsp; <br>只不过， &nbsp; map的形式 &nbsp; map&lt;type1, &nbsp; type2&gt; &nbsp; mymap; &nbsp; <br> &nbsp;  &nbsp;  &nbsp;  &nbsp;  &nbsp;&nbsp;  set的形式&nbsp;&nbsp; set&lt;type&gt; &nbsp; myset; &nbsp; <br><br><br>set（集合）——包含了经过排序了的数据，这些数据的值(value)必须是唯一的。<br>
<br>
map（映射）——经过排序了的二元组的集
合，map中的每个元素都是由两个值组成，其中的key（键值，一个map中的键值必须是唯一的）是在排序或搜索时使用，它的值可以在容器中重新获取；而
另一个值是该元素关联的数值。比如，除了可以ar[43] = "overripe"这样找到一个数据，map还可以通过ar["banana"] =
"overripe"这样的方法找到一个数据。如果你想获得其中的元素信息，通过输入元素的全名就可以轻松实现。<br><br>
map是映射集合中的元素不能重复，set可以进行集合的各种操作（交并补等），当然你也可以用list或vector实现set，但是效率会很低。set一般是用平衡树或哈西表实现的。<br>
映射是一种一一对应的关系，哈西表也可以看作是映射的一种。映射通常可用来实现字典结构（dictionary）<br>
<br>
<br><br><br><br> <img src ="http://www.cppblog.com/expter/aggbug/68714.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2008-12-06 10:43 <a href="http://www.cppblog.com/expter/archive/2008/12/06/68714.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>09年我曾经遇到的笔试题目</title><link>http://www.cppblog.com/expter/archive/2008/12/06/68711.html</link><dc:creator>expter</dc:creator><author>expter</author><pubDate>Sat, 06 Dec 2008 02:27:00 GMT</pubDate><guid>http://www.cppblog.com/expter/archive/2008/12/06/68711.html</guid><wfw:comment>http://www.cppblog.com/expter/comments/68711.html</wfw:comment><comments>http://www.cppblog.com/expter/archive/2008/12/06/68711.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/expter/comments/commentRss/68711.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/expter/services/trackbacks/68711.html</trackback:ping><description><![CDATA[1.指针运算<br><br>注意 ，每个例子不只是一个题目，可能有多个，用<span style="color: #000000;"></span><span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">....................................来分开的</span>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#&nbsp;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>#&nbsp;include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></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><br></span><span style="color: #0000ff;">enum</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">string</span><span style="color: #000000;"><br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;x1,x2,x3</span><span style="color: #000000;">=</span><span style="color: #000000;">10</span><span style="color: #000000;">,x4,x5,<br>}X;<br><br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">测试1</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;"></span><span style="color: #008000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;x1&nbsp;&lt;&lt;&nbsp;x5&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;char&nbsp;*p1;<br>&nbsp;&nbsp;&nbsp;&nbsp;unsigned&nbsp;long&nbsp;*p2;<br>&nbsp;&nbsp;&nbsp;&nbsp;p1&nbsp;=&nbsp;(unsigned&nbsp;char&nbsp;*)0x801000;<br>&nbsp;&nbsp;&nbsp;&nbsp;p2&nbsp;=&nbsp;(unsigned&nbsp;long&nbsp;*)0x801000;<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf("%p\n",p1+5);<br>&nbsp;&nbsp;&nbsp;&nbsp;printf("%p\n",p2+5);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;*&nbsp;t&nbsp;[]&nbsp;=&nbsp;{&nbsp;"abccc","daa","caa"};<br>&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;**bb&nbsp;=&nbsp;t;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;t[1]&nbsp;&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;sizeof(t)&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;"></span><span style="color: #000000;"><br><br></span><span style="color: #000000;"></span><span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">....................................</span><br><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;a[</span><span style="color: #000000;">5</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;{</span><span style="color: #000000;">1</span><span style="color: #000000;">,</span><span style="color: #000000;">2</span><span style="color: #000000;">,</span><span style="color: #000000;">3</span><span style="color: #000000;">,</span><span style="color: #000000;">4</span><span style="color: #000000;">,</span><span style="color: #000000;">5</span><span style="color: #000000;">};<br>&nbsp;&nbsp;&nbsp;&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;">(&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)(</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">a</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;">2</span><span style="color: #000000;">)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;&nbsp;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;j</span><span style="color: #000000;">=</span><span style="color: #000000;">1</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">c&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(j</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;&amp;</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">++</span><span style="color: #000000;">,c</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(i</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">||</span><span style="color: #000000;">&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p</span><span style="color: #000000;">++</span><span style="color: #000000;">,c</span><span style="color: #000000;">++</span><span style="color: #000000;">;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;&lt;</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;">&lt;&lt;</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</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;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">p&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</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;">&lt;&lt;</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)c&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br><br><br>&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;"></span><span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">....................................</span><br><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;"></span><span style="color: #008000;">int&nbsp;i&nbsp;=1;<br>&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;"></span><span style="color: #008000;">int&nbsp;c&nbsp;=&nbsp;(i++)&nbsp;+&nbsp;(i++)&nbsp;+&nbsp;(i++);</span><span style="color: #008000;"><br></span><span style="color: #000000;"><br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;c&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br><br>&nbsp;&nbsp;&nbsp;&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>}<br></span></div>
<br>2.
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#&nbsp;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>#&nbsp;include&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">stdio.h</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"><br></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><br></span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;foo(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;k)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;tmp[</span><span style="color: #000000;">100</span><span style="color: #000000;">];<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">sprintf(tmp,"%d",k);</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,tmp);<br>&nbsp;&nbsp;&nbsp;&nbsp;foo(k</span><span style="color: #000000;">-</span><span style="color: #000000;">1</span><span style="color: #000000;">);<br>}<br></span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;main()<br>{<br><br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;x</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;y</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;printf(</span><span style="color: #000000;">"</span><span style="color: #000000;">%d&nbsp;%d&nbsp;%d&nbsp;%d\n</span><span style="color: #000000;">"</span><span style="color: #000000;">,x</span><span style="color: #000000;">--</span><span style="color: #000000;">,</span><span style="color: #000000;">++</span><span style="color: #000000;">y,i</span><span style="color: #000000;">++</span><span style="color: #000000;">,i</span><span style="color: #000000;">++</span><span style="color: #000000;">);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;tmp[</span><span style="color: #000000;">20</span><span style="color: #000000;">]</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">hello\0\t\\\\world</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">tmp</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">sizeof</span><span style="color: #000000;">(tmp)&nbsp;</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;</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;">&lt;&lt;</span><span style="color: #000000;">strlen(tmp)</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">&nbsp;tmp</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br><br>&nbsp;&nbsp;&nbsp; </span><span style="color: #000000;"></span><span style="color: #008000;">//</span><span style="color: #008000;">....................................</span><br><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;arr[</span><span style="color: #000000;">100</span><span style="color: #000000;">]&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">hello&nbsp;world</span><span style="color: #000000;">"</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">v&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">*</span><span style="color: #000000;">)arr;<br>&nbsp;&nbsp;&nbsp;&nbsp;v[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0X61626364</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;v[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0X41424344</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;v[</span><span style="color: #000000;">2</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0X31323334</span><span style="color: #000000;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;v[</span><span style="color: #000000;">3</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;">;<br>&nbsp;&nbsp;&nbsp;&nbsp;cout</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">arr</span><span style="color: #000000;">&lt;&lt;</span><span style="color: #000000;">endl;<br>&nbsp;&nbsp;&nbsp; <br></span><span style="color: #000000;"></span><span style="color: #000000;"></span><span style="color: #008000;">&nbsp;&nbsp;&nbsp; //</span><span style="color: #008000;">....................................</span><br><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span><span style="color: #008000;"></span><span style="color: #008000;">foo(3);</span><span style="color: #008000;"><br></span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&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>}</span></div>
<br><br><img src ="http://www.cppblog.com/expter/aggbug/68711.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/expter/" target="_blank">expter</a> 2008-12-06 10:27 <a href="http://www.cppblog.com/expter/archive/2008/12/06/68711.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>