﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-随感而发-随笔分类-c/c++</title><link>http://www.cppblog.com/shongbee2/category/10032.html</link><description>杂七杂八</description><language>zh-cn</language><lastBuildDate>Sat, 11 Dec 2010 22:32:37 GMT</lastBuildDate><pubDate>Sat, 11 Dec 2010 22:32:37 GMT</pubDate><ttl>60</ttl><item><title>API回调成员函数 THUNK</title><link>http://www.cppblog.com/shongbee2/archive/2010/12/11/136157.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Sat, 11 Dec 2010 08:14:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2010/12/11/136157.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/136157.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2010/12/11/136157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/136157.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/136157.html</trackback:ping><description><![CDATA[想来想去还是罗嗦一下，<font face="Times New Roman">API</font><font face=宋体>只能回调全局函数，而我们有时候希望他能回调成员函数。最常用的就是</font><font face="Times New Roman">Timmer</font><font face=宋体>和窗口回调。要实现这个需求，就会用到</font><font face="Times New Roman">THUNK</font><font face=宋体>技术。</font><font face="Times New Roman">THUNK </font><font face=宋体>我查了一下是：</font><font face="Times New Roman">thunk&nbsp;&nbsp;</font><font face=宋体>名词 </font><font face="Times New Roman">n.&nbsp;&nbsp;</font><font face=宋体>铮</font><font face="Times New Roman">;</font><font face=宋体>铛</font><font face="Times New Roman">,</font><font face=宋体>锵 。跟这个完全没有关系嘛（看来英文太烂是坏处还是挺多的）。学习了一下之后，我理解的意思就是：狸猫换太子。替换原来意图，转调我们需要的地址。</font><span></span>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>Thunk<font face=宋体>的原理其实说起来很简单：巧妙的将数据段的几个字节的数据设为特殊的值，然后告诉系统，这几个字节的数据是代码（即将一个函数指针指向这几个字节的第一个字节），让系统来执行</font></span><span>。</span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>让<font face="Times New Roman">API</font><font face=宋体>回调成员函数：</font></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>直接用成员函数的地址传给作为<font face="Times New Roman">API</font><font face=宋体>的回调函数显然会编译出错的，原因是他们的调用规则不一致，</font><font face="Times New Roman"><a title="c++" href="www.cppblog.com/shongbee2/" >C++</a></font><font face=宋体>编译器不允许这样做。具体可以参考：</font></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span><a href="http://hi.baidu.com/shongbee2/blog/item/7867de9744e3c26155fb9611.html"><span class=15><u><font color=#0000ff>http://hi.baidu.com/shongbee2/blog/item/7867de9744e3c26155fb9611.html</font></u></span></a></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>而刚好<font face="Times New Roman">THUNK</font><font face=宋体>技术就是让数据段当做代码断用，如果我把回调函数地址用一个数据段给他，然后在数据段中再跳转到成员函数的地址。这样就可以间接的调用成员函数了。不错，我就是学习的这个方法。嘻嘻。。</font></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>大致方向知道了，还得了解一下细节，函数调用的规则：</span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>建议看一下</span><span><a href="http://hi.baidu.com/shongbee2/blog/item/7867de9744e3c26155fb9611.html"><span class=15><u><font color=#0000ff>http://hi.baidu.com/shongbee2/blog/item/7867de9744e3c26155fb9611.html</font></u></span></a></span><span>（也就是上一篇文章啦。）需要注意的：调用者怎么处理栈，被调用者怎么使用栈和处理栈。系统回调函数基本上都是<font face="Times New Roman">_stdcall</font><font face=宋体>的调用方式，成员函数是</font><font face="Times New Roman">__thiscall</font><font face=宋体>的调用方式。他们的区别为：</font></span><span></span></p>
<table style="PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; PADDING-RIGHT: 5.4pt; BORDER-COLLAPSE: collapse; PADDING-TOP: 0pt; mso-table-layout-alt: fixed" class=FCK__ShowTableBorders>
    <tbody>
        <tr style="HEIGHT: 15.85pt">
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; BORDER-LEFT: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 144.15pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: rgb(0,0,0) 0.5pt solid; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-left-alt: 0.5000pt solid rgb(0,0,0); mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=192>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>关键字</span><span></span></p>
            </td>
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 53.8pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: rgb(0,0,0) 0.5pt solid; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=71>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>堆栈清除</span><span></span></p>
            </td>
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 234.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: rgb(0,0,0) 0.5pt solid; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=312>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>参数传递</span><span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 13.6pt">
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; BORDER-LEFT: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 144.15pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-left-alt: 0.5000pt solid rgb(0,0,0); mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=192>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>__stdcall</span><span></span></p>
            </td>
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 53.8pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=71>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>被调用者</span><span></span></p>
            </td>
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 234.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=312>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>将参数倒序压入堆栈</span><span>(</span><span>自右向左</span><span>)</span><span></span></p>
            </td>
        </tr>
        <tr style="HEIGHT: 14.4pt">
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; BORDER-LEFT: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 144.15pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-left-alt: 0.5000pt solid rgb(0,0,0); mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=192>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>__thiscall</span><span></span></p>
            </td>
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 53.8pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=71>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>被调用者</span><span></span></p>
            </td>
            <td style="BORDER-BOTTOM: rgb(0,0,0) 0.5pt solid; PADDING-BOTTOM: 0pt; PADDING-LEFT: 5.4pt; WIDTH: 234.4pt; PADDING-RIGHT: 5.4pt; BORDER-TOP: medium none; BORDER-RIGHT: rgb(0,0,0) 0.5pt solid; PADDING-TOP: 0pt; mso-border-right-alt: 0.5000pt solid rgb(0,0,0); mso-border-top-alt: 0.5000pt solid rgb(0,0,0); mso-border-bottom-alt: 0.5000pt solid rgb(0,0,0)" vAlign=top width=312>
            <p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>压入堆栈，</span><span>this</span><span>指针保存在 <font face="Times New Roman">ECX </font><font face=宋体>寄存器中</font></span><span></span></p>
            </td>
        </tr>
    </tbody>
</table>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>发现他们唯一不同的就是<font face="Times New Roman">__thiscall</font><font face=宋体>把</font><font face="Times New Roman">this</font><font face=宋体>指针保存到了</font><font face="Times New Roman">ECX</font><font face=宋体>的寄存器中。其他都是一样的。这种情况我们就方便了，我们只需在他调用我们的时候，我们吧</font><font face="Times New Roman">this</font><font face=宋体>指针保存到</font><font face="Times New Roman">ECX</font><font face=宋体>，然后跳转到期望的成员函数地址就可以了。</font></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>//<font face=宋体>我认为思路就是这样了。接下来是实现，贴源代码：</font></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>#include "stdafx.h"<br>#include "wtypes.h" </span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>#include &lt;iostream&gt;<br>using namespace std; </span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>typedef void (*FUNC)(DWORD dwThis);<br>typedef int (_stdcall *FUNC1)(int a, int b);<br>#pragma pack(push,1)<br>typedef struct tagTHUNK<br>{<br>&nbsp;&nbsp;&nbsp; BYTE&nbsp;&nbsp;&nbsp; bMovEcx;&nbsp;&nbsp; //MOVE ECX 将this指针移动到ECX的指令<br>&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp; dwThis;&nbsp;&nbsp; // this&nbsp;&nbsp; this指针的地址<br>&nbsp;&nbsp;&nbsp; BYTE&nbsp;&nbsp;&nbsp; bJmp;&nbsp;&nbsp;&nbsp; //jmp&nbsp;&nbsp; 跳转指令<br>&nbsp;&nbsp;&nbsp; DWORD&nbsp;&nbsp;&nbsp; dwRealProc; //proc offset 跳转偏移</span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>&nbsp;&nbsp;&nbsp; void Init(DWORD proc,void* pThis)<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp; bMovEcx = 0xB9;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //注释见下面说明^_^<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwThis = (DWORD)pThis;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bJmp = 0xE9;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FlushInstructionCache(GetCurrentProcess(),this,sizeof(THUNK));<br>&nbsp;&nbsp;&nbsp; }<br>}THUNK;<br>#pragma pack(pop) <br>/**************************************************************************************<br>void Init(DWORD proc,void* pThis)里面的说明：<br>0xB9 为MOVE ECX的指令， 0xE9 跳转的指令，这段初始化表示：<br>0013FF54 mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ecx, ptr [this] <br>0013FF59 jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwRealProc<br>这个单步一下便知。<br>下面那个API ：FlushInstructionCache，查MSDN，表示刷新缓存，<br>因为我们修改了数据，建议他重新载入一下。</span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>我最不能理解的是jmp的偏移是为什么是那样计算，所以这里也着重说明一下：<br>jmp跳转的是当前指令地址的偏移，我们参数中proc是实际函数的地址，我们需要<br>把他转为jmp的偏移: 实际函数地址-jmp指令地址。<br>实际函数地址就是proc,jmp地址就是((INT_PTR)this+sizeof(THUNK))，所以就得到<br>dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)));这行代码<br>还有一点，我对汇编不了解，下面是YY：为什么不是：<br>dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)) - sizeof(dwRealProc))<br>直观上看jmp地址不是：this + sizeof(bMoveEcx) + sizeof(dwThis) + sizeof(bJmp)吗？<br>也就是((INT_PTR)this+sizeof(THUNK)) - sizeof(dwRealProc) 啊。可是我看了一下编译的结果，<br>发现0013FF59 jmp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dwRealProc 是一行的，也就是jmp地址实际就是:<br>((INT_PTR)this+sizeof(THUNK)) 这个地址。经过测试也没有问题，我就认为是这样了，不对的还<br>忘多指出。嘻嘻。<br>还有一个容易混淆的，就是我们会传入this指针，在dwRealProc里面和 FlushInstructionCache<br>里面都用到了this。这里要注意啦：如果你不知道传入的参数this指针和使用的这个this的话，你就该<br>重新复习一下C++基础了。解释一下：传入的this指针变为参数pThis，使用的this是THUNK的this。^_^<br>*****************************************************************************************/</span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>template&lt;typename dst_type,typename src_type&gt;<br>dst_type pointer_cast(src_type src)<br>{<br>return *static_cast&lt;dst_type*&gt;( static_cast&lt;void*&gt;(&amp;src) );<br>}</span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>class Test<br>{<br>public:<br>int m_nFirst;<br>&nbsp;&nbsp;&nbsp; THUNK m_thunk;<br>&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_nTest; </span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>&nbsp;&nbsp;&nbsp; //构造函数中初始化为3，仅为测试，以便查看外面的方法JmpedTest是否可以正确取得这个值<br>&nbsp;&nbsp;&nbsp; Test() : m_nTest(3),m_nFirst(4)<br>&nbsp;&nbsp;&nbsp; {} </span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>&nbsp;&nbsp;&nbsp; void TestThunk()<br>&nbsp;&nbsp;&nbsp; {<br>&nbsp;&nbsp; m_thunk.Init(pointer_cast&lt;int&gt;(&amp;Test::Test2),this);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FUNC1 f = (FUNC1)&amp;m_thunk;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f(1,2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cout &lt;&lt; "Test::TestThunk()" &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp; } </span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>int Test2(int a, int b)<br>{<br>&nbsp;&nbsp; cout &lt;&lt; a &lt;&lt; " " &lt;&lt; b &lt;&lt; " " &lt;&lt; m_nFirst &lt;&lt; " " &lt;&lt; m_nTest &lt;&lt; endl;<br>&nbsp;&nbsp; return 0;<br>}<br>}; </span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>int _tmain(int argc, _TCHAR* argv[])<br>{<br>&nbsp;&nbsp;&nbsp; Test t;<br>&nbsp;&nbsp;&nbsp; t.TestThunk();<br>&nbsp;&nbsp;&nbsp; system("pause");<br>&nbsp;&nbsp;&nbsp; return 0;<br>}</span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>总结：</span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>这个明显是暴力的去强制跳转，直接把指令写入到数据段中，增加了出错的风险，而且可移植性变的很差。所以尽量少用。</span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>要弄清楚函数调用规则和堆栈的平衡。如果你用<font face="Times New Roman">_cedcl</font><font face=宋体>规则的函数调用的话，就会出错啦。</font></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>学习代码中只是处理了简单的情况，还有几种方式，例如不是强制跳转，而是用<font face="Times New Roman">call</font><font face=宋体>的方式调用，也可以实现。对于其他的函数规则例如成员函数是</font><font face="Times New Roman">_stdcall</font><font face=宋体>，他是参数压栈的，这个</font><font face="Times New Roman">THUNK</font><font face=宋体>的写法也不一样了。。</font></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>因为数据段中用到了<font face="Times New Roman">this,</font><font face=宋体>函数回调中会用到它，所以一定要保证这个</font><font face="Times New Roman">this</font><font face=宋体>有效。特别是窗口回调函数，如果释放了变量，但是窗口没有销毁是很容易出问题的。窗口回调函数也有比较喜欢用一个静态的分配器，通过窗口识别，把他分配到不同的成员处理函数中的方式。</font></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>这个只是初学，原因是发现<font face="Times New Roman">ATL</font><font face=宋体>的窗口回调是这样做的。觉得很神奇，所以学习了一下，有不对的地方还望多多指教。嘻嘻。。。</font></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span>找到的资料：</span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span><a href="http://www.vckbase.com/document/viewdoc/?id=1821"><span class=15><u><font color=#0000ff>http://www.vckbase.com/document/viewdoc/?id=1821</font></u></span></a></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span><a href="http://www.codeproject.com/KB/cpp/GenericThunks.aspx"><span class=15><u><font color=#0000ff>http://www.codeproject.com/KB/cpp/GenericThunks.aspx</font></u></span></a></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span><a href="http://blog.csdn.net/superarhow/archive/2006/07/10/898261.aspx"><span class=15><u><font color=#0000ff>http://blog.csdn.net/superarhow/archive/2006/07/10/898261.aspx</font></u></span></a></span><span></span></p>
<p style="MARGIN-TOP: 0pt; MARGIN-BOTTOM: 0pt" class=p0><span><a href="http://www.cnblogs.com/homeofish/archive/2009/02/20/1395208.html"><span class=15><u><font color=#0000ff>http://www.cnblogs.com/homeofish/archive/2009/02/20/1395208.html</font></u></span></a></span><span></span></p><img src ="http://www.cppblog.com/shongbee2/aggbug/136157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2010-12-11 16:14 <a href="http://www.cppblog.com/shongbee2/archive/2010/12/11/136157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>诡异的强制类型转换操作符</title><link>http://www.cppblog.com/shongbee2/archive/2009/07/28/91524.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Tue, 28 Jul 2009 12:03:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/07/28/91524.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/91524.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/07/28/91524.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/91524.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/91524.html</trackback:ping><description><![CDATA[<p>最近在学习中，看到了一段很诡异的代码。<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">CComptr</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">IDispatch</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;ptrDisp;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top>IDispatch</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pDisp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ptrDisp;</span></div>
<p>对此很是疑惑，为什么两个完全不同的类型可以无差别的转换。<br>猜测1：<br>认为IDispatch重载了赋值操作符。0.1秒的时间否定。他只是一个接口，定义很明确的4的方法。不可能。由于不相信，还特意去看了一下他的接口定义。彻底死心。<br>猜测2.<br>CComptr&lt;IDispatch&gt;重载了赋值操作符。但是想来想去应该和他的重载没有关系，因为这个操作在他的左边，和他的赋值操作符全然没有关系。不信之，进去看了一下，并且把重载给注释掉，结果还是能编译成功，彻底确信不是赋值的作用。<br><br>真相：<br>终于拿出杀手锏，F11，单步，哈哈，进去发现原来有：<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">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;T</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">()&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">throw</span><span style="COLOR: #000000">()<br><img id=Codehighlighter1_30_45_Open_Image onclick="this.style.display='none'; Codehighlighter1_30_45_Open_Text.style.display='none'; Codehighlighter1_30_45_Closed_Image.style.display='inline'; Codehighlighter1_30_45_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_30_45_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_30_45_Closed_Text.style.display='none'; Codehighlighter1_30_45_Open_Image.style.display='inline'; Codehighlighter1_30_45_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_30_45_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_30_45_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;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;}</span></span></div>
<p>这段代码。哈哈。。问了大牛知道是重载强制转换。哈哈。纵欲知道原因了。。。<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"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">class</span><span style="COLOR: #000000">&nbsp;A1&nbsp;<br><img id=Codehighlighter1_10_97_Open_Image onclick="this.style.display='none'; Codehighlighter1_10_97_Open_Text.style.display='none'; Codehighlighter1_10_97_Closed_Image.style.display='inline'; Codehighlighter1_10_97_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_10_97_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_10_97_Closed_Text.style.display='none'; Codehighlighter1_10_97_Open_Image.style.display='inline'; Codehighlighter1_10_97_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_10_97_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_97_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #0000ff">public</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;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">()<br><img id=Codehighlighter1_38_53_Open_Image onclick="this.style.display='none'; Codehighlighter1_38_53_Open_Text.style.display='none'; Codehighlighter1_38_53_Closed_Image.style.display='inline'; Codehighlighter1_38_53_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_38_53_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_38_53_Closed_Text.style.display='none'; Codehighlighter1_38_53_Open_Image.style.display='inline'; Codehighlighter1_38_53_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_38_53_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_38_53_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;</span><span style="COLOR: #000000">6</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;</span><span style="COLOR: #0000ff">operator</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">()&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">const</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_80_95_Open_Image onclick="this.style.display='none'; Codehighlighter1_80_95_Open_Text.style.display='none'; Codehighlighter1_80_95_Closed_Image.style.display='inline'; Codehighlighter1_80_95_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_80_95_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_80_95_Closed_Text.style.display='none'; Codehighlighter1_80_95_Open_Image.style.display='inline'; Codehighlighter1_80_95_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_80_95_Closed_Text style="BORDER-RIGHT: #808080 1px solid; BORDER-TOP: #808080 1px solid; DISPLAY: none; BORDER-LEFT: #808080 1px solid; BORDER-BOTTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff"><img src="http://www.cppblog.com/Images/dot.gif"></span><span id=Codehighlighter1_80_95_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;</span><span style="COLOR: #000000">6</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><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;main()<br><img id=Codehighlighter1_111_179_Open_Image onclick="this.style.display='none'; Codehighlighter1_111_179_Open_Text.style.display='none'; Codehighlighter1_111_179_Closed_Image.style.display='inline'; Codehighlighter1_111_179_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_111_179_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_111_179_Closed_Text.style.display='none'; Codehighlighter1_111_179_Open_Image.style.display='inline'; Codehighlighter1_111_179_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_111_179_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_111_179_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(</span><span style="COLOR: #000000">5</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;a1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">(</span><span style="COLOR: #000000">6</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;A1&nbsp;aa1;<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;a2&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;aa1;&nbsp;&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></div>
<p>编译成功，爽。。。。<br><br></p><img src ="http://www.cppblog.com/shongbee2/aggbug/91524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-07-28 20:03 <a href="http://www.cppblog.com/shongbee2/archive/2009/07/28/91524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>万恶的listView控件</title><link>http://www.cppblog.com/shongbee2/archive/2009/07/28/91513.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Tue, 28 Jul 2009 09:28:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/07/28/91513.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/91513.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/07/28/91513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/91513.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/91513.html</trackback:ping><description><![CDATA[C++里面也有listView控件，叫list Control。很好很强大哦。MFC对应的类为CListCtrl.。ATL/WTL对应的类为CListViewCtrl 。<br>用起来很不错。可惜响应消息就麻烦很多。一个右键弹出菜单，居然弄的要用钩子。之后才发现是消息响应错了。是应该响应<br>OnRClick类似的消息吧(忘了)，LButtonDown什么的就被想获得了。。还有什么OwnerData什么的又是一大堆的消息，响应的都郁闷。然后我的策略就是直接用他自己的。哈哈。一个消息不响应。。。。<br>等有时间了，一定要学一个listView控件的专题。(C++的)。。一定要努力学习。。加油。。。<img src ="http://www.cppblog.com/shongbee2/aggbug/91513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-07-28 17:28 <a href="http://www.cppblog.com/shongbee2/archive/2009/07/28/91513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】基于Thunk实现的类成员消息处理函数</title><link>http://www.cppblog.com/shongbee2/archive/2009/07/23/90908.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Thu, 23 Jul 2009 03:35:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/07/23/90908.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/90908.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/07/23/90908.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/90908.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/90908.html</trackback:ping><description><![CDATA[<a href="http://blog.csdn.net/JerKii/archive/2006/04/07/654188.aspx">http://blog.csdn.net/JerKii/archive/2006/04/07/654188.aspx</a><br>由于比较多，直接贴链接了。<br>郁闷的是我死活没有弄成功。。唉，只有继续加油咯。。。<img src ="http://www.cppblog.com/shongbee2/aggbug/90908.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-07-23 11:35 <a href="http://www.cppblog.com/shongbee2/archive/2009/07/23/90908.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>字符编码转换，为什么我的ICONV不能用啊？</title><link>http://www.cppblog.com/shongbee2/archive/2009/07/10/89730.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Fri, 10 Jul 2009 07:23:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/07/10/89730.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/89730.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/07/10/89730.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/89730.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/89730.html</trackback:ping><description><![CDATA[<p>哎，找了半天转换，找到了ICONV，据说是跨平台的，很牛。下载的libxml也需要到他，也下载了他的库，由于libxml转换编码格式。</p>
<p>可是用来用去都不正确。网上去找的资料都是一个版本的，我最后的代码为：</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;charToUtf_8(IN&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;strSrc,&nbsp;IN&nbsp;OUT&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">&nbsp;pstrDst)<br><img id=Codehighlighter1_63_841_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_841_Open_Text.style.display='none'; Codehighlighter1_63_841_Closed_Image.style.display='inline'; Codehighlighter1_63_841_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_63_841_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_841_Closed_Text.style.display='none'; Codehighlighter1_63_841_Open_Image.style.display='inline'; Codehighlighter1_63_841_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_63_841_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_63_841_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">u2g(in_utf8,strlen(in_utf8),out,OUTLEN);</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;iconv_t&nbsp;cd&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iconv_open(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">utf-8</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">ANSI_X3.4-1986</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">iconv_t&nbsp;cd&nbsp;=&nbsp;iconv_open("utf-8",&nbsp;"CP_ACP");</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(cd&nbsp;</span><span style="COLOR: #000000">==</span><span style="COLOR: #000000">&nbsp;(iconv_t)(</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">))<br><img id=Codehighlighter1_236_255_Open_Image onclick="this.style.display='none'; Codehighlighter1_236_255_Open_Text.style.display='none'; Codehighlighter1_236_255_Closed_Image.style.display='inline'; Codehighlighter1_236_255_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_236_255_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_236_255_Closed_Text.style.display='none'; Codehighlighter1_236_255_Open_Image.style.display='inline'; Codehighlighter1_236_255_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;</span><span id=Codehighlighter1_236_255_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_236_255_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align=top>&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;size_t&nbsp;ilen&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;::strlen(strSrc)&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;size_t&nbsp;olen&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;ilen&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">4</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;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">inbuf&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">[ilen];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">outbuf&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">[olen];<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;memset(inbuf,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;ilen);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;memset(outbuf,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;olen);<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">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: #0000ff">in</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;inbuf;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;outbuf;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></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/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;memcpy(inbuf,&nbsp;strSrc,&nbsp;ilen);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;size_t&nbsp;ret&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;iconv(cd,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">in</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">ilen,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #0000ff">out</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">&amp;</span><span style="COLOR: #000000">olen);<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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">下面这种方式会出错，为什么?<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">size_t&nbsp;ret&nbsp;=&nbsp;iconv(cd,&nbsp;&amp;inbuf,&nbsp;&amp;ilen,&nbsp;&amp;outbuf,&nbsp;&amp;olen);<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></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;if&nbsp;(ret&nbsp;==&nbsp;(size_t)(-1))<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;cerr&nbsp;&lt;&lt;&nbsp;"iconv&nbsp;error"&nbsp;&lt;&lt;&nbsp;endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;}<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;else<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">&nbsp;&nbsp;&nbsp;cout&nbsp;&lt;&lt;&nbsp;outbuf&nbsp;&lt;&lt;&nbsp;endl;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></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"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;delete[]&nbsp;inbuf;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;delete&nbsp;outbuf;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;iconv_close(cd);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&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 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>
<p>&nbsp;</p>
<p>当然这些代码是从网上拷贝下来再改的。编译通过，运行就不行了。</p>
<p>后来我放弃了。直接用windows的方法。（还好我是在windows上开发）</p>
<p>&nbsp;</p>
<div style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><img src="http://www.cppblog.com/Images/OutliningIndicators/None.gif" align=top><span style="COLOR: #0000ff">bool</span><span style="COLOR: #000000">&nbsp;CharToUtf_8(IN&nbsp;</span><span style="COLOR: #0000ff">const</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;strSrc,&nbsp;IN&nbsp;OUT&nbsp;</span><span style="COLOR: #0000ff">char</span><span style="COLOR: #000000">**</span><span style="COLOR: #000000">&nbsp;pstrDst)<br><img id=Codehighlighter1_63_459_Open_Image onclick="this.style.display='none'; Codehighlighter1_63_459_Open_Text.style.display='none'; Codehighlighter1_63_459_Closed_Image.style.display='inline'; Codehighlighter1_63_459_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_63_459_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_63_459_Closed_Text.style.display='none'; Codehighlighter1_63_459_Open_Image.style.display='inline'; Codehighlighter1_63_459_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_63_459_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_63_459_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;assert(pstrDst);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&nbsp;nSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MultiByteToWideChar(CP_ACP,NULL,&nbsp;strSrc,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;NULL,&nbsp;</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;WCHAR</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">&nbsp;pwchTemp&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #0000ff">new</span><span style="COLOR: #000000">&nbsp;WCHAR[nSize];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;nSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;MultiByteToWideChar(CP_ACP,NULL,&nbsp;strSrc,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;pwchTemp,&nbsp;nSize);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;nSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WideCharToMultiByte(CP_UTF8,&nbsp;NULL,&nbsp;pwchTemp,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;NULL,&nbsp;</span><span style="COLOR: #000000">0</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">0</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/InBlock.gif" align=top>&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pstrDst&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">[nSize];<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;nSize&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;WideCharToMultiByte(CP_UTF8,&nbsp;NULL,&nbsp;pwchTemp,&nbsp;</span><span style="COLOR: #000000">-</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">pstrDst,&nbsp;nSize,&nbsp;</span><span style="COLOR: #000000">0</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/InBlock.gif" align=top>&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 src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" align=top>}</span></span></div>
<p>&nbsp;</p>
<p>这样就可以饿了。呵呵。。哎。。。。<br>不过挺郁闷的，为什么ICONV不能用啊，有高手指点一下吗？</p><img src ="http://www.cppblog.com/shongbee2/aggbug/89730.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-07-10 15:23 <a href="http://www.cppblog.com/shongbee2/archive/2009/07/10/89730.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>VS2008设置内存断点</title><link>http://www.cppblog.com/shongbee2/archive/2009/07/08/89571.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Wed, 08 Jul 2009 13:55:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/07/08/89571.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/89571.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/07/08/89571.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/89571.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/89571.html</trackback:ping><description><![CDATA[<p>菜鸟的我居然不知道什么是内存断点。<br>自己理解一下：内存断点就是当某个内存改变的时候会断下来的。就跟程序断点一样，运行到那里就断下来一样。<br>VS2008怎么设置内存断点呢。我打开内存监视器。按F9是没有效果的，给出错误提示。后来通过网上搜了才知道原来是这样设置的哦！哈哈。<br>截图什么的就算了，因为我觉得我对VS2008的界面应该还是比较了解的吧。哈哈<br><br>1.内存断点只能是在程序调试运行的时候才能设置的。这跟普通的代码断点不一样。<br>2.进入调试状态，（按F5啦），设置一个要监控的内存的变量哪里设置断点先断下来。（我是这样做的）。<br>3.断下来之后，哈哈，关键：点击菜单栏的Debug-&gt;new Breakpoint-&gt; new DataBreakPoint。这就是设置内存的断点啦。<br>4 。点击之后会出来一个设置内存断点的对话框，填好好断的内存就可以了。上面的地址是可以直接用变量名加取地址符的。例如&amp;a，其他的应该就好理解，监控的长度和语言。设置就OK了，哈哈。<br>今天有学了一招，以后如果想知道内存什么时候被改变，俺就不怕啦。。。</p><img src ="http://www.cppblog.com/shongbee2/aggbug/89571.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-07-08 21:55 <a href="http://www.cppblog.com/shongbee2/archive/2009/07/08/89571.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>gtest学习文章</title><link>http://www.cppblog.com/shongbee2/archive/2009/07/08/89531.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Wed, 08 Jul 2009 02:28:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/07/08/89531.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/89531.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/07/08/89531.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/89531.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/89531.html</trackback:ping><description><![CDATA[<p>现在要用gtest框架写单元测试。所以网上找了一个学习资料（或是教程）呵呵，因为我的基础很烂，直接看官方的文档可能不是很会。谢谢提供者。<br>文章地址：<a href="http://www.cnblogs.com/coderzh/archive/2009/04/06/1426758.html">http://www.cnblogs.com/coderzh/archive/2009/04/06/1426758.html</a><br>这是一个系列的，希望早日看完。哈哈，加油。。。</p><img src ="http://www.cppblog.com/shongbee2/aggbug/89531.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-07-08 10:28 <a href="http://www.cppblog.com/shongbee2/archive/2009/07/08/89531.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL_Map的简单实用</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/05/79029.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Sun, 05 Apr 2009 10:11:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/05/79029.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/79029.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/05/79029.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/79029.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/79029.html</trackback:ping><description><![CDATA[今天学了STL中Map的简单操作，学的很肤浅，呵呵，目前我只用到这些，还需要继续努力。呵呵。如果要查阅MSDN的话，关键字可以用map class.呵呵。还有多看一下其它介绍STL的书。也刚刚转载了博客园一个前辈的map资料，很不错。所以这里就直接奉上源代码：注意[]的操作，他是一个插入和修改，查找合并的过程，如果没有找到，他会插入一个默认元素的。如果要修改，可以直接用[]做修改。呵呵。<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</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #000000">map</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><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_68_1330_Open_Image onclick="this.style.display='none'; Codehighlighter1_68_1330_Open_Text.style.display='none'; Codehighlighter1_68_1330_Closed_Image.style.display='inline'; Codehighlighter1_68_1330_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_68_1330_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_68_1330_Closed_Text.style.display='none'; Codehighlighter1_68_1330_Open_Image.style.display='inline'; Codehighlighter1_68_1330_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_68_1330_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_68_1330_Open_Text><span style="COLOR: #000000">{<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;map</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Map_DInt;<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;typedef&nbsp;pair</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;Map_Pair;<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;Map_DInt&nbsp;map1;<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">empty是检测map是否为空</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: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(map1.empty())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">检测是否为空如果为空，输出</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_211_236_Open_Image onclick="this.style.display='none'; Codehighlighter1_211_236_Open_Text.style.display='none'; Codehighlighter1_211_236_Closed_Image.style.display='inline'; Codehighlighter1_211_236_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_211_236_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_211_236_Closed_Text.style.display='none'; Codehighlighter1_211_236_Open_Image.style.display='inline'; Codehighlighter1_211_236_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_211_236_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_236_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;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">empty\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;}</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;map1[</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">30</span><span style="COLOR: #000000">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">因为map重载了[]可以通过[]直接添加数据和查找数据</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;map1.insert(Map_DInt::value_type(</span><span style="COLOR: #000000">4</span><span style="COLOR: #000000">,</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加数据4(key),&nbsp;40(value)</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;map1.insert(Map_Pair(</span><span style="COLOR: #000000">1</span><span style="COLOR: #000000">,&nbsp;</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">));&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">添加数据1,10<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">遍历节点，并输出对应的key和value</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: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(Map_DInt::iterator&nbsp;it1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;map1.begin();&nbsp;it1&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;map1.end();&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">it1)<br><img id=Codehighlighter1_491_560_Open_Image onclick="this.style.display='none'; Codehighlighter1_491_560_Open_Text.style.display='none'; Codehighlighter1_491_560_Closed_Image.style.display='inline'; Codehighlighter1_491_560_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_491_560_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_491_560_Closed_Text.style.display='none'; Codehighlighter1_491_560_Open_Image.style.display='inline'; Codehighlighter1_491_560_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_491_560_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_491_560_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;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">Key:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;it1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">first&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;Value:</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">it1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">second&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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">[]也可以直接用于查找，但是如果没有找到，他会默认加一个值进去的</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;Map_DInt::iterator&nbsp;it1;<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;it1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;map1.find(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">查找key&nbsp;为5的数据</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: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(it1&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;map1.end())&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果找到，则输出他的数据</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_701_735_Open_Image onclick="this.style.display='none'; Codehighlighter1_701_735_Open_Text.style.display='none'; Codehighlighter1_701_735_Closed_Image.style.display='inline'; Codehighlighter1_701_735_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_701_735_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_701_735_Closed_Text.style.display='none'; Codehighlighter1_701_735_Open_Image.style.display='inline'; Codehighlighter1_701_735_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_701_735_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_701_735_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;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;it1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">second&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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;</span><span style="COLOR: #0000ff">else</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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">否则输出找不到</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_758_787_Open_Image onclick="this.style.display='none'; Codehighlighter1_758_787_Open_Text.style.display='none'; Codehighlighter1_758_787_Closed_Image.style.display='inline'; Codehighlighter1_758_787_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_758_787_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_758_787_Closed_Text.style.display='none'; Codehighlighter1_758_787_Open_Image.style.display='inline'; Codehighlighter1_758_787_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_758_787_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_758_787_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;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">Not&nbsp;Found\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;}</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">if</span><span style="COLOR: #000000">&nbsp;(map1[</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">0</span><span style="COLOR: #000000">)<br><img id=Codehighlighter1_810_840_Open_Image onclick="this.style.display='none'; Codehighlighter1_810_840_Open_Text.style.display='none'; Codehighlighter1_810_840_Closed_Image.style.display='inline'; Codehighlighter1_810_840_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_810_840_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_810_840_Closed_Text.style.display='none'; Codehighlighter1_810_840_Open_Image.style.display='inline'; Codehighlighter1_810_840_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_810_840_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_810_840_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;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;map1[</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">]&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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;</span><span style="COLOR: #0000ff">else</span><span style="COLOR: #000000"><br><img id=Codehighlighter1_849_878_Open_Image onclick="this.style.display='none'; Codehighlighter1_849_878_Open_Text.style.display='none'; Codehighlighter1_849_878_Closed_Image.style.display='inline'; Codehighlighter1_849_878_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_849_878_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_849_878_Closed_Text.style.display='none'; Codehighlighter1_849_878_Open_Image.style.display='inline'; Codehighlighter1_849_878_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_849_878_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_849_878_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;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">Not&nbsp;Found\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;}</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;it1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;map1.find(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">查找key&nbsp;为5的数据</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: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(it1&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;map1.end())&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果找到，则输出他的数据</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_957_991_Open_Image onclick="this.style.display='none'; Codehighlighter1_957_991_Open_Text.style.display='none'; Codehighlighter1_957_991_Closed_Image.style.display='inline'; Codehighlighter1_957_991_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_957_991_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_957_991_Closed_Text.style.display='none'; Codehighlighter1_957_991_Open_Image.style.display='inline'; Codehighlighter1_957_991_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_957_991_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_957_991_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;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;it1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">second&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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;</span><span style="COLOR: #0000ff">else</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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">否则输出找不到</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_1014_1043_Open_Image onclick="this.style.display='none'; Codehighlighter1_1014_1043_Open_Text.style.display='none'; Codehighlighter1_1014_1043_Closed_Image.style.display='inline'; Codehighlighter1_1014_1043_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1014_1043_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1014_1043_Closed_Text.style.display='none'; Codehighlighter1_1014_1043_Open_Image.style.display='inline'; Codehighlighter1_1014_1043_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_1014_1043_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_1014_1043_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;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">Not&nbsp;Found\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;}</span></span><span style="COLOR: #000000"><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;map1[</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">50</span><span style="COLOR: #000000">;&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"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;it1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;map1.find(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">查找key&nbsp;为5的数据</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: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(it1&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;map1.end())&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果找到，则输出他的数据</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_1148_1182_Open_Image onclick="this.style.display='none'; Codehighlighter1_1148_1182_Open_Text.style.display='none'; Codehighlighter1_1148_1182_Closed_Image.style.display='inline'; Codehighlighter1_1148_1182_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1148_1182_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1148_1182_Closed_Text.style.display='none'; Codehighlighter1_1148_1182_Open_Image.style.display='inline'; Codehighlighter1_1148_1182_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_1148_1182_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_1148_1182_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;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;it1</span><span style="COLOR: #000000">-&gt;</span><span style="COLOR: #000000">second&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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;</span><span style="COLOR: #0000ff">else</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;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">否则输出找不到</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_1205_1234_Open_Image onclick="this.style.display='none'; Codehighlighter1_1205_1234_Open_Text.style.display='none'; Codehighlighter1_1205_1234_Closed_Image.style.display='inline'; Codehighlighter1_1205_1234_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_1205_1234_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_1205_1234_Closed_Text.style.display='none'; Codehighlighter1_1205_1234_Open_Image.style.display='inline'; Codehighlighter1_1205_1234_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_1205_1234_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_1205_1234_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;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">Not&nbsp;Found\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;}</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;size_t&nbsp;nNum&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;map1.erase(</span><span style="COLOR: #000000">5</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">删除数据</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;map1.clear();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">清楚所有数据</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</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;</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></span></div>
<img src ="http://www.cppblog.com/shongbee2/aggbug/79029.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-05 18:11 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/05/79029.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】STL map常用操作简介</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/05/79026.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Sun, 05 Apr 2009 09:48:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/05/79026.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/79026.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/05/79026.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/79026.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/79026.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://www.cnblogs.com/TianFang/archive/2006/12/30/607859.html">http://www.cnblogs.com/TianFang/archive/2006/12/30/607859.html</a><strong><br>1。目录 </strong></p>
<ol>
    <li>map简介
    <li>map的功能
    <li>使用map
    <li>在map中插入元素
    <li>查找并获取map中的元素
    <li>从map中删除元素 </li>
</ol>
<p><strong>2。map简介 </strong></p>
<p>map是一类<span style="COLOR: red">关联式容器</span>。它的特点是<span style="COLOR: #9bbb59">增加和删除节点对迭代器的影响很小</span>，除了那个操作节点，对其他的节点都没有什么影响。对于迭代器来说，可以修改实值，而不能修改key。 </p>
<p><strong>3。map的功能 </strong></p>
<ol>
    <li>自动建立Key － value的对应。key 和 value可以是任意你需要的类型。
    <li>根据key值快速查找记录，查找的复杂度基本是Log(N)，如果有1000个记录，最多查找10次，1,000,000个记录，最多查找20次。
    <li>快速插入Key - Value 记录。
    <li>快速删除记录
    <li>根据Key 修改value记录。
    <li>遍历所有记录。 </li>
</ol>
<p><strong>4。使用map </strong></p>
<p>使用map得包含map类所在的头文件<br>#include &lt;map&gt; //注意，STL头文件没有扩展名.h </p>
<p>map对象是模板类，需要关键字和存储对象两个模板参数：<br>std:map&lt;int, string&gt; personnel;<br>这样就定义了一个用int作为索引,并拥有相关联的指向string的指针. </p>
<p>为了使用方便，可以对模板类进行一下类型定义， </p>
<p style="MARGIN-LEFT: 11pt">typedef map&lt;int, CString&gt; UDT_MAP_INT_CSTRING; <br>UDT_MAP_INT_CSTRING enumMap; </p>
<p><strong>5。在map中插入元素 </strong></p>
<p>改变map中的条目非常简单，因为map类已经对[]操作符进行了重载 </p>
<p style="MARGIN-LEFT: 11pt">enumMap[1] = "One";<br>enumMap[2] = "Two";<br>..... </p>
<p>这样非常直观，但存在一个性能的问题。<span style="COLOR: #9bbb59">插入2时,先在enumMap中查找主键为2的项，没发现，然后将一个新的对象插入enumMap，键是2，值是一个空字符串，插入完成后，将字符串赋为"Two"</span>; 该方法会将每个值都赋为缺省值，然后再赋为显示的值，如果元素是类对象，则开销比较大。我们可以用以下方法来避免开销： </p>
<p style="MARGIN-LEFT: 11pt">enumMap.<span style="COLOR: #f79646">insert</span>(map&lt;int, CString&gt; :: value_type(2, "Two")) </p>
<p><strong>6。查找并获取map中的元素 </strong></p>
<p>下标操作符给出了获得一个值的最简单方法： </p>
<p style="MARGIN-LEFT: 11pt">CString tmp = enumMap[2]; </p>
<p>但是,<span style="COLOR: #948a54">只有当map中有这个键的实例时才对</span>，否则会自动插<span style="COLOR: #548dd4">入一个实例，值为初始化值</span>。 </p>
<p>我们可以使用Find()和Count()方法来发现一个键是否存在。 </p>
<p>查找map中是否包含某个关键字条目用<span style="COLOR: #f79646">find()</span>方法，传入的参数是要查找的key，在这里需要提到的是begin()和end()两个成员，分别代表map对象中第一个条目和最后一个条目，这两个数据的类型是iterator. </p>
<p style="MARGIN-LEFT: 11pt">int nFindKey = 2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//要查找的Key<br>//定义一个条目变量(实际是指针)<br>UDT_MAP_INT_CSTRING::iterator it= enumMap.find(nFindKey);&nbsp;<br>if(it == enumMap.end()) {<br>&nbsp;&nbsp;&nbsp;&nbsp;//没找到<br>}<br>else {<br>&nbsp;&nbsp;&nbsp;&nbsp;//找到<br>} </p>
<p>通过map对象的方法获取的iterator数据类型是一个std::pair对象，包括两个数据 iterator-&gt;first 和 iterator-&gt;second 分别代表关键字和存储的数据 </p>
<p><strong>7。从map中删除元素 </strong></p>
<p>移除某个map中某个条目用<span style="COLOR: #f79646">erase()</span> </p>
<p>该成员方法的定义如下 </p>
<ol>
    <li>iterator erase(iterator it); //通过一个条目对象删除
    <li>iterator erase(iterator first, iterator last);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//删除一个范围
    <li>size_type erase(const Key&amp; key); //通过关键字删除 </li>
</ol>
<p><span style="COLOR: #f79646">clear()</span>就相当于 enumMap.erase(enumMap.begin(), enumMap.end()); </p>
<img src ="http://www.cppblog.com/shongbee2/aggbug/79026.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-05 17:48 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/05/79026.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL中set的简单学习</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/05/79011.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Sun, 05 Apr 2009 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/05/79011.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/79011.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/05/79011.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/79011.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/79011.html</trackback:ping><description><![CDATA[今天我学习了STL中set的简单用法，set和map一样是一个用平衡二叉树写的模板，map可以有两个或多这个只配对，而set只有一个，当你只存放一个元素的时候，可以考虑用set,他的有点和map一样，查找很快。呵呵。因为我只用到set的一些简单的功能，所以也只学了一点点他的用法。更深入的用法还必须继续加油学习。呵呵。对了，如果要查MSDN中关于set的用法的话，关键字用set class就可以了。只用set貌似还要找半天。虽然简单，还是把源代码奉上：<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</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">set</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><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_68_915_Open_Image onclick="this.style.display='none'; Codehighlighter1_68_915_Open_Text.style.display='none'; Codehighlighter1_68_915_Closed_Image.style.display='inline'; Codehighlighter1_68_915_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedBlockStart.gif" align=top><img id=Codehighlighter1_68_915_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_68_915_Closed_Text.style.display='none'; Codehighlighter1_68_915_Open_Image.style.display='inline'; Codehighlighter1_68_915_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedBlock.gif" align=top></span><span id=Codehighlighter1_68_915_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_68_915_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">set</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">&nbsp;st1;&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">创建一个int类型的set</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: #0000ff">set</span><span style="COLOR: #000000">&lt;</span><span style="COLOR: #0000ff">int</span><span style="COLOR: #000000">&gt;</span><span style="COLOR: #000000">::iterator&nbsp;it1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">创建一个他对应的迭代器<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top><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">empty是判断他是否为空，而且如果要判断空，最好用这个来判断<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">如果为空返回true</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: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(st1.empty())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">判断空,如果是空，则输出empty</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_235_260_Open_Image onclick="this.style.display='none'; Codehighlighter1_235_260_Open_Text.style.display='none'; Codehighlighter1_235_260_Closed_Image.style.display='inline'; Codehighlighter1_235_260_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_235_260_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_235_260_Closed_Text.style.display='none'; Codehighlighter1_235_260_Open_Image.style.display='inline'; Codehighlighter1_235_260_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_235_260_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_235_260_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;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">empty\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;}</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">查找数据，find。返回值是找到的情况的迭代器，如果没有找到，<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">迭代器只想end，如果找到，为找到的数据，所以这里一定要先<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">判断一下是否找到数据了。</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;it1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;st1.find(</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">查找数据</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(it1&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;st1.end())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果找到就输出数据</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_414_442_Open_Image onclick="this.style.display='none'; Codehighlighter1_414_442_Open_Text.style.display='none'; Codehighlighter1_414_442_Closed_Image.style.display='inline'; Codehighlighter1_414_442_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_414_442_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_414_442_Closed_Text.style.display='none'; Codehighlighter1_414_442_Open_Image.style.display='inline'; Codehighlighter1_414_442_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_414_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_414_442_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;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">it1&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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;<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">插入数据。</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;st1.insert(</span><span style="COLOR: #000000">10</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">插入数据</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;st1.insert(</span><span style="COLOR: #000000">30</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;st1.insert(</span><span style="COLOR: #000000">20</span><span style="COLOR: #000000">);<br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;st1.insert(</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<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">遍历数据，用迭代器遍历数据</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: #0000ff">for</span><span style="COLOR: #000000">&nbsp;(it1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;st1.begin();&nbsp;it1&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;st1.end();&nbsp;</span><span style="COLOR: #000000">++</span><span style="COLOR: #000000">it1)&nbsp;&nbsp;&nbsp;&nbsp;<br><img id=Codehighlighter1_607_634_Open_Image onclick="this.style.display='none'; Codehighlighter1_607_634_Open_Text.style.display='none'; Codehighlighter1_607_634_Closed_Image.style.display='inline'; Codehighlighter1_607_634_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_607_634_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_607_634_Closed_Text.style.display='none'; Codehighlighter1_607_634_Open_Image.style.display='inline'; Codehighlighter1_607_634_Open_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ContractedSubBlock.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</span><span id=Codehighlighter1_607_634_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_607_634_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;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">it1&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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;<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">因为开始没有40这个元素，所以找不到，现在插入了，再<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">寻找一下。呵呵，找到了。</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;it1&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;st1.find(</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">查找数据</span><span style="COLOR: #008000"><br><img src="http://www.cppblog.com/Images/OutliningIndicators/InBlock.gif" align=top></span><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #0000ff">if</span><span style="COLOR: #000000">&nbsp;(it1&nbsp;</span><span style="COLOR: #000000">!=</span><span style="COLOR: #000000">&nbsp;st1.end())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="COLOR: #008000">//</span><span style="COLOR: #008000">如果找到就输出数据</span><span style="COLOR: #008000"><br><img id=Codehighlighter1_751_779_Open_Image onclick="this.style.display='none'; Codehighlighter1_751_779_Open_Text.style.display='none'; Codehighlighter1_751_779_Closed_Image.style.display='inline'; Codehighlighter1_751_779_Closed_Text.style.display='inline';" src="http://www.cppblog.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align=top><img id=Codehighlighter1_751_779_Closed_Image style="DISPLAY: none" onclick="this.style.display='none'; Codehighlighter1_751_779_Closed_Text.style.display='none'; Codehighlighter1_751_779_Open_Image.style.display='inline'; Codehighlighter1_751_779_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_751_779_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_751_779_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;cout&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;&nbsp;</span><span style="COLOR: #000000">*</span><span style="COLOR: #000000">it1&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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">删除数据这里返回的是删除的个数。在这里当然是1咯</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;size_t&nbsp;kk&nbsp;</span><span style="COLOR: #000000">=</span><span style="COLOR: #000000">&nbsp;st1.erase(</span><span style="COLOR: #000000">40</span><span style="COLOR: #000000">);<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;kk&nbsp;</span><span style="COLOR: #000000">&lt;&lt;</span><span style="COLOR: #000000">&nbsp;endl;<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">清除全部数据。</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;st1.clear();<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;system(</span><span style="COLOR: #000000">"</span><span style="COLOR: #000000">pause</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;</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></span></div>
<img src ="http://www.cppblog.com/shongbee2/aggbug/79011.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-05 14:58 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/05/79011.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转】函数调用的一些约定__cdecl __fastcall与 __stdcall</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/02/78672.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Thu, 02 Apr 2009 04:52:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/02/78672.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/78672.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/02/78672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/78672.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/78672.html</trackback:ping><description><![CDATA[转自：http://www.91linux.com/html/article/program/cpp/20081211/14588.html
<br>__cdecl __fastcall与 __stdcall <br><br>调用约定： <br>__cdecl __fastcall与 __stdcall，三者都是调用约定(Calling convention)，它决定以下内容：1)函数参数的压栈顺序，2)由调用者还是被调用者把参数弹出栈，3)以及产生函数修饰名的方法。 <br><br>1、__stdcall调用约定：函数的参数自右向左通过栈传递，被调用的函数在返回前清理传送参数的内存栈， <br><br>2、_cdecl是C和C＋＋程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码，所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意：对于可变参数的成员函数，始终使用__cdecl的转换方式。 <br><br>3、__fastcall调用约定：它是通过寄存器来传送参数的（实际上，它用ECX和EDX传送前两个双字（DWORD）或更小的参数，剩下的参数仍旧自右向左压栈传送，被调用的函数在返回前清理传送参数的内存栈）。 <br><br>4、thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器，参数从右到左压。thiscall不是关键词，因此不能被程序员指定。 <br><br>5、
naked
call采用1-4的调用约定时，如果必要的话，进入函数时编译器会产生代码来保存ESI，EDI，EBX，EBP寄存器，退出函数时则产生代码恢复这些
寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符，故必须和_declspec共同使用。 <br><br>调用约定可以通过工程设置：Setting...\C/C++ \Code Generation项进行选择，缺省状态为__cdecl。 <br><br>名字修饰约定： <br><br>1、修饰名(Decoration name)："C"或者"C++"函数在内部（编译和链接）通过修饰名识别 <br>2、C编译时函数名修饰约定规则： <br>__stdcall调用约定在输出函数名前加上一个下划线前缀，后面加上一个"@"符号和其参数的字节数，格式为_functionname@number,例如 ：function(int a, int b)，其修饰名为：_function@8 <br>__cdecl调用约定仅在输出函数名前加上一个下划线前缀，格式为_functionname。 <br>__fastcall调用约定在输出函数名前加上一个"@"符号，后面也是一个"@"符号和其参数的字节数，格式为@functionname@number。 <br><br>3、C++编译时函数名修饰约定规则： <br>__stdcall调用约定： <br>1)、以"?"标识函数名的开始，后跟函数名； <br>2)、函数名后面以"@@YG"标识参数表的开始，后跟参数表； <br>3)、参数表以代号表示： <br>X--void ， <br>D--char， <br>E--unsigned char， <br>F--short， <br>H--int， <br>I--unsigned int， <br>J--long， <br>K--unsigned long， <br>M--float， <br>N--double， <br>_N--bool， <br>PA--表示指针，后面的代号表明指针类型，如果相同类型的指针连续出现，以"0"代替，一个"0"代表一次重复； <br>4)、参数表的第一项为该函数的返回值类型，其后依次为参数的数据类型,指针标识在其所指数据类型前； <br>5)、参数表后以"@Z"标识整个名字的结束，如果该函数无参数，则以"Z"标识结束。 <br>其格式为"?functionname@@YG*****@Z"或"?functionname@@YG*XZ"，例如 <br>int Test1(char *var1,unsigned long)-----&#8220;?Test1@@YGHPADK@Z&#8221; <br>void Test2() -----&#8220;?Test2@@YGXXZ&#8221; <br><br>__cdecl调用约定： <br>规则同上面的_stdcall调用约定，只是参数表的开始标识由上面的"@@YG"变为"@@YA"。 <br>__fastcall调用约定： <br>规则同上面的_stdcall调用约定，只是参数表的开始标识由上面的"@@YG"变为"@@YI"。 <br>VC++对函数的省缺声明是"__cedcl",将只能被C/C++调用.<br>注意： <br>1、_beginthread需要__cdecl的线程函数地址，_beginthreadex和CreateThread需要__stdcall的线程函数地址。 <br><br>2、一般WIN32的函数都是__stdcall。而且在Windef.h中有如下的定义： <br>#define CALLBACK __stdcall <br>#define WINAPI　 __stdcall <br><br>3、extern "C" _declspec(dllexport) int __cdecl Add(int a, int b); <br>typedef int (__cdecl*FunPointer)(int a, int b); <br>修饰符的书写顺序如上。 <br><br>4、
extern "C"的作用：如果Add(int a, int
b)是在c语言编译器编译，而在c++文件使用，则需要在c++文件中声明：extern "C" Add(int a, int
b)，因为c编译器和c++编译器对函数名的解释不一样（c++编译器解释函数名的时候要考虑函数参数，这样是了方便函数重载，而在c语言中不存在函数重
载的问题），使用extern "C"，实质就是告诉c++编译器，该函数是c库里面的函数。如果不使用extern "C"则会出现链接错误。 <br>一般象如下使用： <br>#ifdef _cplusplus <br>#define EXTERN_C extern "C" <br>#else <br>#define EXTERN_C extern <br>#endif <br><br>#ifdef _cplusplus <br>extern "C"{ <br>#endif <br>EXTERN_C int func(int a, int b); <br>#ifdef _cplusplus <br>} <br>#endif <br><br>5、MFC提供了一些宏，可以使用AFX_EXT_CLASS来代替__declspec(DLLexport)，并修饰类名，从而导出类，AFX_API_EXPORT来修饰函数，AFX_DATA_EXPORT来修饰变量 <br>AFX_CLASS_IMPORT：__declspec(DLLexport) <br>AFX_API_IMPORT：__declspec(DLLexport) <br>AFX_DATA_IMPORT：__declspec(DLLexport) <br>AFX_CLASS_EXPORT：__declspec(DLLexport) <br>AFX_API_EXPORT：__declspec(DLLexport) <br>AFX_DATA_EXPORT：__declspec(DLLexport) <br>AFX_EXT_CLASS：#ifdef _AFXEXT <br>AFX_CLASS_EXPORT <br>#else <br>AFX_CLASS_IMPORT <br><br>6、
DLLMain负责初始化(Initialization)和结束(Termination)工作，每当一个新的进程或者该进程的新的线程访问DLL时，
或者访问DLL的每一个进程或者线程不再使用DLL或者结束时，都会调用DLLMain。但是，使用TerminateProcess或
TerminateThread结束进程或者线程，不会调用DLLMain。 <br><br>7、一个DLL在内存中只有一个实例 <br>DLL程序和调用其输出函数的程序的关系： <br>1)、DLL与进程、线程之间的关系 <br>DLL模块被映射到调用它的进程的虚拟地址空间。 <br>DLL使用的内存从调用进程的虚拟地址空间分配，只能被该进程的线程所访问。 <br>DLL的句柄可以被调用进程使用；调用进程的句柄可以被DLL使用。 <br>DLLDLL可以有自己的数据段，但没有自己的堆栈，使用调用进程的栈，与调用它的应用程序相同的堆栈模式。 <br><br>2)、关于共享数据段 <br>DLL
定义的全局变量可以被调用进程访问；DLL可以访问调用进程的全局数据。使用同一DLL的每一个进程都有自己的DLL全局变量实例。如果多个线程并发访问
同一变量，则需要使用同步机制；对一个DLL的变量，如果希望每个使用DLL的线程都有自己的值，则应该使用线程局部存储(TLS，Thread
Local Strorage)。<br>
<br><br><img src ="http://www.cppblog.com/shongbee2/aggbug/78672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-02 12:52 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/02/78672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]C++操作符号的优先级</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/01/78561.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Wed, 01 Apr 2009 05:44:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/01/78561.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/78561.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/01/78561.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/78561.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/78561.html</trackback:ping><description><![CDATA[<br>原文地址：http://www.cppreference.com/wiki/operator_precedence
<br>哈哈。以后不用到处去看书啦。谢谢那个哥们。<br>
<table class="inline">
    <tbody>
        <tr class="row0">
            <th class="col0 centeralign">Operator  </th>
            <th class="col1 centeralign">  Description  </th>
            <th class="col2 centeralign">  Example  </th>
            <th class="col3 centeralign">  Overloadable  </th>
        </tr>
        <tr class="row1">
            <td class="col0 centeralign" colspan="4">  <strong> Group 1</strong>  (no associativity)  </td>
        </tr>
        <tr class="row2">
            <td class="col0">::</td>
            <td class="col1">Scope resolution operator</td>
            <td class="col2">Class::age = 2;</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row3">
            <td class="col0 centeralign" colspan="4">  <strong> Group 2</strong>   </td>
        </tr>
        <tr class="row4">
            <td class="col0">()</td>
            <td class="col1">Function call</td>
            <td class="col2">isdigit('1')</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row5">
            <td class="col0">()</td>
            <td class="col1">Member initalization </td>
            <td class="col2"> c_tor(int x, int y) : _x(x), _y(y*10){};</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row6">
            <td class="col0">[]</td>
            <td class="col1">Array access</td>
            <td class="col2">array[4] = 2;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row7">
            <td class="col0">-&gt;</td>
            <td class="col1">Member access from a pointer</td>
            <td class="col2">ptr-&gt;age = 34;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row8">
            <td class="col0">.</td>
            <td class="col1">Member access from an object</td>
            <td class="col2">obj.age = 34;</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row9">
            <td class="col0">++</td>
            <td class="col1">Post-increment</td>
            <td class="col2">for( int i = 0; i &lt; 10; i++ ) cout &lt;&lt; i;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row10">
            <td class="col0">--</td>
            <td class="col1">Post-decrement</td>
            <td class="col2">for( int i = 10; i &gt; 0; i-- ) cout &lt;&lt; i;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row11">
            <td class="col0">const_cast</td>
            <td class="col1">Special cast</td>
            <td class="col2">const_cast&lt;type_to&gt;(type_from);</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row12">
            <td class="col0">dynamic_cast</td>
            <td class="col1">Special cast</td>
            <td class="col2">dynamic_cast&lt;type_to&gt;(type_from);</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row13">
            <td class="col0">static_cast</td>
            <td class="col1">Special cast</td>
            <td class="col2">static_cast&lt;type_to&gt;(type_from);</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row14">
            <td class="col0">reinterpret_cast</td>
            <td class="col1">Special cast</td>
            <td class="col2">reinterpret_cast&lt;type_to&gt;(type_from);</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row15">
            <td class="col0">typeid</td>
            <td class="col1">Runtime type information</td>
            <td class="col2">cout &#171; typeid(var).name(); <br>
            cout &#171; typeid(type).name();</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row16">
            <td class="col0 centeralign" colspan="4">  <strong> Group 3</strong>  (right-to-left associativity)  </td>
        </tr>
        <tr class="row17">
            <td class="col0">!</td>
            <td class="col1">Logical negation</td>
            <td class="col2">if( !done ) &#8230;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row18">
            <td class="col0">not</td>
            <td class="col1" colspan="3">Alternate spelling for ! </td>
        </tr>
        <tr class="row19">
            <td class="col0">~</td>
            <td class="col1">Bitwise complement</td>
            <td class="col2">flags = ~flags;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row20">
            <td class="col0">compl</td>
            <td class="col1" colspan="3">Alternate spelling for ~ </td>
        </tr>
        <tr class="row21">
            <td class="col0">++</td>
            <td class="col1">Pre-increment</td>
            <td class="col2">for( i = 0; i &lt; 10; ++i ) cout &lt;&lt; i;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row22">
            <td class="col0">--</td>
            <td class="col1">Pre-decrement</td>
            <td class="col2">for( i = 10; i &gt; 0; --i ) cout &lt;&lt; i;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row23">
            <td class="col0">-</td>
            <td class="col1">Unary minus</td>
            <td class="col2">int i = -1;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row24">
            <td class="col0">+</td>
            <td class="col1">Unary plus</td>
            <td class="col2">int i = +1;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row25">
            <td class="col0">*</td>
            <td class="col1">Dereference</td>
            <td class="col2">int data = *intPtr;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row26">
            <td class="col0">&amp;</td>
            <td class="col1">Address of</td>
            <td class="col2">int *intPtr = &amp;data;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row27">
            <td class="col0">new</td>
            <td class="col1">Dynamic memory allocation</td>
            <td class="col2">long *pVar = new long; <br>
            MyClass *ptr = new MyClass(args);</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row28">
            <td class="col0">new []</td>
            <td class="col1">Dynamic memory allocation of array</td>
            <td class="col2">long *array = new long[n];</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row29">
            <td class="col0">delete</td>
            <td class="col1">Deallocating the memory</td>
            <td class="col2"> delete pVar;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row30">
            <td class="col0">delete []</td>
            <td class="col1">Deallocating the memory of array</td>
            <td class="col2"> delete [] array;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row31">
            <td class="col0">(type)</td>
            <td class="col1">Cast to a given type</td>
            <td class="col2">int i = (int) floatNum;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row32">
            <td class="col0">sizeof</td>
            <td class="col1">Return size of an object or type</td>
            <td class="col2">int size = sizeof floatNum; <br>
            int size = sizeof(float);</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row33">
            <td class="col0 centeralign" colspan="4">  <strong> Group 4</strong>   </td>
        </tr>
        <tr class="row34">
            <td class="col0">-&gt;*</td>
            <td class="col1">Member pointer selector</td>
            <td class="col2">ptr-&gt;*var = 24;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row35">
            <td class="col0">.*</td>
            <td class="col1">Member object selector</td>
            <td class="col2">obj.*var = 24;</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row36">
            <td class="col0 centeralign" colspan="4">  <strong> Group 5</strong>   </td>
        </tr>
        <tr class="row37">
            <td class="col0">*</td>
            <td class="col1">Multiplication</td>
            <td class="col2">int i = 2 * 4;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row38">
            <td class="col0">/</td>
            <td class="col1">Division</td>
            <td class="col2">float f = 10.0 / 3.0;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row39">
            <td class="col0">%</td>
            <td class="col1">Modulus</td>
            <td class="col2">int rem = 4 % 3;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row40">
            <td class="col0 centeralign" colspan="4">  <strong> Group 6</strong>   </td>
        </tr>
        <tr class="row41">
            <td class="col0">+</td>
            <td class="col1">Addition</td>
            <td class="col2">int i = 2 + 3;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row42">
            <td class="col0">-</td>
            <td class="col1">Subtraction</td>
            <td class="col2">int i = 5 - 1;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row43">
            <td class="col0 centeralign" colspan="4">  <strong> Group 7</strong>   </td>
        </tr>
        <tr class="row44">
            <td class="col0">&lt;&lt;</td>
            <td class="col1">Bitwise shift left</td>
            <td class="col2">int flags = 33 &lt;&lt; 1;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row45">
            <td class="col0">&gt;&gt;</td>
            <td class="col1">Bitwise shift right</td>
            <td class="col2">int flags = 33 &gt;&gt; 1;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row46">
            <td class="col0 centeralign" colspan="4">  <strong> Group 8</strong>   </td>
        </tr>
        <tr class="row47">
            <td class="col0">&lt;</td>
            <td class="col1">Comparison less-than</td>
            <td class="col2">if( i &lt; 42 ) &#8230;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row48">
            <td class="col0">&lt;=</td>
            <td class="col1">Comparison less-than-or-equal-to</td>
            <td class="col2">if( i &lt;= 42 ) ...</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row49">
            <td class="col0">&gt;</td>
            <td class="col1">Comparison greater-than</td>
            <td class="col2">if( i &gt; 42 ) &#8230;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row50">
            <td class="col0">&gt;=</td>
            <td class="col1">Comparison greater-than-or-equal-to</td>
            <td class="col2">if( i &gt;= 42 ) ...</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row51">
            <td class="col0 centeralign" colspan="4">  <strong> Group 9</strong>   </td>
        </tr>
        <tr class="row52">
            <td class="col0">==</td>
            <td class="col1">Comparison equal-to</td>
            <td class="col2">if( i == 42 ) ...</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row53">
            <td class="col0">eq</td>
            <td class="col1" colspan="3">Alternate spelling for == </td>
        </tr>
        <tr class="row54">
            <td class="col0">!=</td>
            <td class="col1">Comparison not-equal-to</td>
            <td class="col2">if( i != 42 ) &#8230;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row55">
            <td class="col0">not_eq</td>
            <td class="col1" colspan="3">Alternate spelling for != </td>
        </tr>
        <tr class="row56">
            <td class="col0 centeralign" colspan="4">  <strong> Group 10</strong>   </td>
        </tr>
        <tr class="row57">
            <td class="col0">&amp;</td>
            <td class="col1">Bitwise AND</td>
            <td class="col2">flags = flags &amp; 42;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row58">
            <td class="col0">bitand</td>
            <td class="col1" colspan="3">Alternate spelling for &amp; </td>
        </tr>
        <tr class="row59">
            <td class="col0 centeralign" colspan="4">  <strong> Group 11</strong>   </td>
        </tr>
        <tr class="row60">
            <td class="col0">^</td>
            <td class="col1">Bitwise exclusive OR (XOR)</td>
            <td class="col2">flags = flags ^ 42;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row61">
            <td class="col0">xor</td>
            <td class="col1" colspan="3">Alternate spelling for ^ </td>
        </tr>
        <tr class="row62">
            <td class="col0 centeralign" colspan="4">  <strong> Group 12</strong>   </td>
        </tr>
        <tr class="row63">
            <td class="col0">|</td>
            <td class="col1">Bitwise inclusive (normal) OR</td>
            <td class="col2">flags = flags | 42;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row64">
            <td class="col0">bitor</td>
            <td class="col1" colspan="3">Alternate spelling for | </td>
        </tr>
        <tr class="row65">
            <td class="col0 centeralign" colspan="4">  <strong> Group 13</strong>   </td>
        </tr>
        <tr class="row66">
            <td class="col0">&amp;&amp;</td>
            <td class="col1">Logical AND</td>
            <td class="col2">if( conditionA &amp;&amp; conditionB ) &#8230;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row67">
            <td class="col0">and</td>
            <td class="col1" colspan="3">Alternate spelling for &amp;&amp; </td>
        </tr>
        <tr class="row68">
            <td class="col0 centeralign" colspan="4">  <strong> Group 14</strong>   </td>
        </tr>
        <tr class="row69">
            <td class="col0">||</td>
            <td class="col1">Logical OR</td>
            <td class="col2">if( conditionA || conditionB ) ...</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row70">
            <td class="col0">or</td>
            <td class="col1" colspan="3">Alternate spelling for || </td>
        </tr>
        <tr class="row71">
            <td class="col0 centeralign" colspan="4">  <strong> Group 15</strong>  (right-to-left associativity)  </td>
        </tr>
        <tr class="row72">
            <td class="col0">? :</td>
            <td class="col1">Ternary conditional (if-then-else)</td>
            <td class="col2">int i = (a &gt; b) ? a : b;</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row73">
            <td class="col0 centeralign" colspan="4">  <strong> Group 16</strong>  (right-to-left associativity)  </td>
        </tr>
        <tr class="row74">
            <td class="col0">=</td>
            <td class="col1">Assignment operator</td>
            <td class="col2">int a = b;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row75">
            <td class="col0">+=</td>
            <td class="col1">Increment and assign</td>
            <td class="col2">a += 3;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row76">
            <td class="col0">-=</td>
            <td class="col1">Decrement and assign</td>
            <td class="col2">b -= 4;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row77">
            <td class="col0">*=</td>
            <td class="col1">Multiply and assign</td>
            <td class="col2">a *= 5;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row78">
            <td class="col0">/=</td>
            <td class="col1">Divide and assign</td>
            <td class="col2">a /= 2;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row79">
            <td class="col0">%=</td>
            <td class="col1">Modulo and assign</td>
            <td class="col2">a %= 3;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row80">
            <td class="col0">&amp;=</td>
            <td class="col1">Bitwise AND and assign</td>
            <td class="col2">flags &amp;= new_flags;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row81">
            <td class="col0">and_eq</td>
            <td class="col1" colspan="3">Alternate spelling for &amp;= </td>
        </tr>
        <tr class="row82">
            <td class="col0">^=</td>
            <td class="col1">Bitwise exclusive or (XOR) and assign</td>
            <td class="col2">flags ^= new_flags;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row83">
            <td class="col0">xor_eq</td>
            <td class="col1" colspan="3">Alternate spelling for ^= </td>
        </tr>
        <tr class="row84">
            <td class="col0">|=</td>
            <td class="col1">Bitwise normal OR and assign</td>
            <td class="col2">flags |= new_flags;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row85">
            <td class="col0">or_eq</td>
            <td class="col1" colspan="3">Alternate spelling for |= </td>
        </tr>
        <tr class="row86">
            <td class="col0">&lt;&lt;=</td>
            <td class="col1">Bitwise shift left and assign</td>
            <td class="col2">flags &lt;&lt;= 2;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row87">
            <td class="col0">&gt;&gt;=</td>
            <td class="col1">Bitwise shift right and assign</td>
            <td class="col2">flags &gt;&gt;= 2;</td>
            <td class="col3">YES</td>
        </tr>
        <tr class="row88">
            <td class="col0 centeralign" colspan="4">  <strong> Group 17</strong>   </td>
        </tr>
        <tr class="row89">
            <td class="col0">throw</td>
            <td class="col1">throw exception</td>
            <td class="col2">throw EClass(&#8220;Message&#8221;);</td>
            <td class="col3">NO</td>
        </tr>
        <tr class="row90">
            <td class="col0 centeralign" colspan="4">  <strong> Group 18</strong>   </td>
        </tr>
        <tr class="row91">
            <td class="col0">,</td>
            <td class="col1">Sequential evaluation operator</td>
            <td class="col2">for( i = 0, j = 0; i &lt; 10; i++, j++ ) &#8230;</td>
            <td class="col3">YES</td>
        </tr>
    </tbody>
</table>
<br>哎，效果没有那里好。看来操作还需要练习。呵呵<br> <img src ="http://www.cppblog.com/shongbee2/aggbug/78561.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-01 13:44 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/01/78561.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>c++操作符重载</title><link>http://www.cppblog.com/shongbee2/archive/2009/04/01/78554.html</link><dc:creator>shongbee2</dc:creator><author>shongbee2</author><pubDate>Wed, 01 Apr 2009 05:10:00 GMT</pubDate><guid>http://www.cppblog.com/shongbee2/archive/2009/04/01/78554.html</guid><wfw:comment>http://www.cppblog.com/shongbee2/comments/78554.html</wfw:comment><comments>http://www.cppblog.com/shongbee2/archive/2009/04/01/78554.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cppblog.com/shongbee2/comments/commentRss/78554.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/shongbee2/services/trackbacks/78554.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天我学习的是C++操作符重载。C++的操作符重载给C++带来很大的方便和灵活性。可以重载里面大部分操作符。这样在调用的时候就会相对的自然和简单。废话少说，直接奉上源代码(有部分相关的资料的注释都已经写在源代码上了):Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighte...&nbsp;&nbsp;<a href='http://www.cppblog.com/shongbee2/archive/2009/04/01/78554.html'>阅读全文</a><img src ="http://www.cppblog.com/shongbee2/aggbug/78554.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/shongbee2/" target="_blank">shongbee2</a> 2009-04-01 13:10 <a href="http://www.cppblog.com/shongbee2/archive/2009/04/01/78554.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>