﻿<?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++博客-My Program Study and Share</title><link>http://www.cppblog.com/minxinwang/</link><description>Share</description><language>zh-cn</language><lastBuildDate>Tue, 14 Apr 2026 23:10:00 GMT</lastBuildDate><pubDate>Tue, 14 Apr 2026 23:10:00 GMT</pubDate><ttl>60</ttl><item><title>关于Oracle错误：动态执行表不可访问，本会话自动统计被禁止，关闭自动统计之后的问题</title><link>http://www.cppblog.com/minxinwang/archive/2011/02/11/139912.html</link><dc:creator>Mr.wang</dc:creator><author>Mr.wang</author><pubDate>Fri, 11 Feb 2011 10:19:00 GMT</pubDate><guid>http://www.cppblog.com/minxinwang/archive/2011/02/11/139912.html</guid><wfw:comment>http://www.cppblog.com/minxinwang/comments/139912.html</wfw:comment><comments>http://www.cppblog.com/minxinwang/archive/2011/02/11/139912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/minxinwang/comments/commentRss/139912.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/minxinwang/services/trackbacks/139912.html</trackback:ping><description><![CDATA[用SYS登录，授权给相应的用户，用下面的语句

<div><div>grant select on v_$statname to scott;&nbsp;</div><div>grant select on v_$sesstat to scott;&nbsp;</div><div>grant select on v_$session to scott;&nbsp;</div><div>grant select on v_$mystat to scott;&nbsp;</div></div><img src ="http://www.cppblog.com/minxinwang/aggbug/139912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/minxinwang/" target="_blank">Mr.wang</a> 2011-02-11 18:19 <a href="http://www.cppblog.com/minxinwang/archive/2011/02/11/139912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title> ORA-01950: 对表空间 'USERS' 无权限 </title><link>http://www.cppblog.com/minxinwang/archive/2011/02/11/139910.html</link><dc:creator>Mr.wang</dc:creator><author>Mr.wang</author><pubDate>Fri, 11 Feb 2011 09:47:00 GMT</pubDate><guid>http://www.cppblog.com/minxinwang/archive/2011/02/11/139910.html</guid><wfw:comment>http://www.cppblog.com/minxinwang/comments/139910.html</wfw:comment><comments>http://www.cppblog.com/minxinwang/archive/2011/02/11/139910.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/minxinwang/comments/commentRss/139910.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/minxinwang/services/trackbacks/139910.html</trackback:ping><description><![CDATA[<div class="blog_content">
<p>创建新的用户时，要指定default&nbsp;&nbsp; 
tablespace，否则它会把system表空间当成自己的缺省表空间。这样做是不提倡的。估计原来创建某个用户的时候没有指定缺省表空间，而现在它使用系统表空间的权限被DBA给收回了。&nbsp;&nbsp; 
<br>先用的简单的办法试试，一般缺省的ORACLE安装都是有USERS表空间的。&nbsp;&nbsp; 
<br>比如你要在用户（或SCHEMA）usera中建表，那么你用SYSTEM登录ORACLE后，执行如下SQL&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; <br>ALTER&nbsp;&nbsp; 
USER&nbsp;&nbsp; usera&nbsp;&nbsp; QUOTA&nbsp;&nbsp; UNLIMITED&nbsp;&nbsp; ON&nbsp;&nbsp; USERS;&nbsp;&nbsp; 
<br>如果没有USERS表空间，则会报错，你可以找一个其他的表空间，从v$tablespace可以看到所有的表空间。</p>
<p>&nbsp;</p>
<p>下面情况sany用户开始创建的时候没有制定default tablespace&nbsp;&nbsp; ********</p>
<p><br>SQL&gt; connect sany/as646333<br>已连接。<br>SQL&gt; select * from 
user_sys_privs<br>2 ;</p>
<p>USERNAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PRIVILEGE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
ADM<br>------------------------------ ---------------------------------------- 
---<br>SANY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE SESSION&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
NO<br>SANY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EXECUTE ANY PROCEDURE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
NO<br>SANY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE USER&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
NO<br>SANY&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE TABLE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
NO</p>
<p>SQL&gt; create table bjwh(user_id number(5),user_name varchar2(20),phone 
varchar2(12),email varchar2(20<br>));<br>create table bjwh(user_id 
number(5),user_name varchar2(20),phone varchar2(12),email 
varchar2(20))<br>*<br>第 1 行出现错误:<br>ORA-01950: 对表空间 'USERS' 无权限</p>
<p><br>SQL&gt; connect system/oracle<br>已连接。<br>SQL&gt; alter user sany quota 
unlimited on users;</p>
<p>用户已更改。</p>
<p>SQL&gt; connect sany/as646333<br>已连接。<br>SQL&gt; create table bjwh(user_id 
number(5),user_name varchar2(20),phone varchar2(12),email varchar2(2<br>0));</p>
<p>表已创建。</p>
<p>SQL&gt; disconnect<br>从 Oracle Database 10g Enterprise Edition Release 
10.2.0.1.0 - Production<br>With the Partitioning, OLAP and Data Mining options 
断开<br>SQL&gt; desc bjwh<br>SP2-0640: 未连接<br>SP2-0641: "DESCRIBE" 
需要连接至服务器<br>SQL&gt; connect sany/as646333<br>已连接。<br>SQL&gt; desc 
bjwh<br>名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 是否为空? 
类型<br>----------------------------------------- -------- 
----------------------------<br>USER_ID&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
NUMBER(5)<br>USER_NAME&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
VARCHAR2(20)<br>PHONE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
VARCHAR2(12)<br>EMAIL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
VARCHAR2(20)</p>
<p>&nbsp;</p>
<p>问题解决。</p></div>
<img src ="http://www.cppblog.com/minxinwang/aggbug/139910.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/minxinwang/" target="_blank">Mr.wang</a> 2011-02-11 17:47 <a href="http://www.cppblog.com/minxinwang/archive/2011/02/11/139910.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>oracle用户授所有权限 </title><link>http://www.cppblog.com/minxinwang/archive/2011/02/11/139906.html</link><dc:creator>Mr.wang</dc:creator><author>Mr.wang</author><pubDate>Fri, 11 Feb 2011 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/minxinwang/archive/2011/02/11/139906.html</guid><wfw:comment>http://www.cppblog.com/minxinwang/comments/139906.html</wfw:comment><comments>http://www.cppblog.com/minxinwang/archive/2011/02/11/139906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/minxinwang/comments/commentRss/139906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/minxinwang/services/trackbacks/139906.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 1grant&nbsp;alter&nbsp;system&nbsp;to&nbsp;linder;&nbsp;&nbsp;&nbsp;2grant&nbsp;audit&nbsp;system&nbsp;to&nbsp;linder;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;4grant&nbsp;create&nbsp;session&nbsp;to&nbsp;linder...&nbsp;&nbsp;<a href='http://www.cppblog.com/minxinwang/archive/2011/02/11/139906.html'>阅读全文</a><img src ="http://www.cppblog.com/minxinwang/aggbug/139906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/minxinwang/" target="_blank">Mr.wang</a> 2011-02-11 17:20 <a href="http://www.cppblog.com/minxinwang/archive/2011/02/11/139906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在SQL*Pluse中以scott/tiger登录时提示ora-28000 the account is locked,解决办法</title><link>http://www.cppblog.com/minxinwang/archive/2011/02/11/139901.html</link><dc:creator>Mr.wang</dc:creator><author>Mr.wang</author><pubDate>Fri, 11 Feb 2011 07:55:00 GMT</pubDate><guid>http://www.cppblog.com/minxinwang/archive/2011/02/11/139901.html</guid><wfw:comment>http://www.cppblog.com/minxinwang/comments/139901.html</wfw:comment><comments>http://www.cppblog.com/minxinwang/archive/2011/02/11/139901.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/minxinwang/comments/commentRss/139901.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/minxinwang/services/trackbacks/139901.html</trackback:ping><description><![CDATA[<p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">第一种:</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">在SQL*Pluse中以scott/tiger登录时提示ora-28000 the account is locked。</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">解决办法：</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">新装完Oracle10g后，用scott/tiger测试，会出现以下错误提示：<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oracle10g the account is locked<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oracle10g the password has expired<br>原因：默认Oracle10g的scott不能登陆。<br>解决：<br>（1）conn sys/sys as sysdba; //以DBA的身份登录<br>（2）alter user scott account unlock;// 然后解锁<br>（3）conn scott/tiger //弹出一个修改密码的对话框，修改一下密码就可以了</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">第二种:</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">在进行本地Net服务命名配置的时候,最后一步测试的时候,用户名和密码分别填scott和tiger.(配置方法,参考我的公用邮箱中的录像)</p><p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; font-family: verdana, sans-serif; font-size: 14px; line-height: 21px; ">配置后就可以用scott和tiger登录了.</p>
<img src ="http://www.cppblog.com/minxinwang/aggbug/139901.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/minxinwang/" target="_blank">Mr.wang</a> 2011-02-11 15:55 <a href="http://www.cppblog.com/minxinwang/archive/2011/02/11/139901.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>STL源码剖析--迭代器</title><link>http://www.cppblog.com/minxinwang/archive/2011/01/14/138538.html</link><dc:creator>Mr.wang</dc:creator><author>Mr.wang</author><pubDate>Fri, 14 Jan 2011 07:56:00 GMT</pubDate><guid>http://www.cppblog.com/minxinwang/archive/2011/01/14/138538.html</guid><description><![CDATA[
<table style="table-layout: fixed; width: 100%; ">
<tbody>
<tr>
<td>
<div id="blog_text" class="cnt">
<p style="FONT-SIZE: 13pt"><font style="BACKGROUND-COLOR: rgb(255,255,255)">STL设计的精髓在于，把容器（Containers）和算法（Algorithms）分开，彼此独立设计，最后再用迭代器（Iterator）把他们粘 
合在一起。可见迭代器在STL中的重要程度。迭代器已经作为一种设计思想被记录与《设计模式》中，它的意图在于&#8220;提供一种方法顺序访问一个聚合对象中的各 
个元素，而又不需暴露该对象的内部表示&#8221;。</font></p>
<p style="FONT-SIZE: 13pt"><font style="BACKGROUND-COLOR: rgb(255,255,255)">&nbsp; 
迭代器的作用其实相当于一个智能指针，它指向容器内部的数据，可以通过operator *操作符来解指针获得数据的值，也可以通过operator 
-&gt;操作符来获取数据的指针，还能够重载++,--等运算符来移动指针。</font></p>
<p>&nbsp;</p>
<p><font style="FONT-SIZE: 13pt" face="黑体"><strong>迭代器的分类</strong></font></p>
<p style="FONT-SIZE: 12pt">迭代器大致可以分为以下几种：</p>
<p style="FONT-SIZE: 12pt">1、Input Interator ：只允许作为输入，也就是只读（Read 
Only）<br>2、Output Interator ：只允许作为输出，也就是只写（Write Only）<br>3、Forward Interator 
：允许读写，但只能做前向移动<br>4、Bidirectional Interator ：允许读写，可以做双向移动<br>5、Random Access 
Interator ：允许读写，可以任意移动</p>
<div class="highlighter">
<ol class="highlighter-cpp">
<li><span class="keyword">struct</span><span>&nbsp;input_iterator_tag&nbsp;{};</span> 
</li><li class="alt"><span class="keyword">struct</span><span>&nbsp;output_iterator_tag&nbsp;{};</span> 
</li><li><span class="keyword">struct</span><span>&nbsp;forward_iterator_tag&nbsp;:&nbsp;</span><span class="keyword">public</span><span>&nbsp;input_iterator_tag&nbsp;{};</span> 
</li><li class="alt"><span class="keyword">struct</span><span>&nbsp;bidirectional_iterator_tag&nbsp;:&nbsp;</span><span class="keyword">public</span><span>&nbsp;forward_iterator_tag&nbsp;{};</span> 
</li><li><span class="keyword">struct</span><span>&nbsp;random_access_iterator_tag&nbsp;:&nbsp;</span><span class="keyword">public</span><span>&nbsp;bidirectional_iterator_tag&nbsp;{};</span> 
</li><li class="alt"></li></ol></div>
<p style="FONT-SIZE: 13pt"><font face="黑体"><strong>实现原理</strong></font></p>
<p style="FONT-SIZE: 12pt">下面以List为例说明迭代器的原理</p>
<div class="highlighter">
<ol class="highlighter-cpp">
<li><span class="comment">//&nbsp;List节点的定义 </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;T&gt;</span> 
</li><li><span class="keyword">struct</span><span>&nbsp;__list_node&nbsp;{</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">void</span><span>*&nbsp;void_pointer;</span> 
</li><li><span>&nbsp;&nbsp;void_pointer&nbsp;next;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;void_pointer&nbsp;prev;</span> 
</li><li><span>&nbsp;&nbsp;T&nbsp;data;</span> 
</li><li class="alt"><span>};</span> 
</li><li>
</li><li class="alt"><span class="comment">//&nbsp;List迭代器的定义 </span>
</li><li><span class="keyword">template</span><span>&lt;</span><span class="keyword">class</span><span>&nbsp;T,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Ref,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Ptr&gt;</span> 
</li><li class="alt"><span class="keyword">struct</span><span>&nbsp;__list_iterator&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;这三个typedef是为了简化后面的代码书写 </span>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;__list_iterator&lt;T,&nbsp;T&amp;,&nbsp;T*&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator;</span> 

</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;__list_iterator&lt;T,&nbsp;</span><span class="keyword">const</span><span>&nbsp;T&amp;,&nbsp;</span><span class="keyword">const</span><span>&nbsp;T*&gt;&nbsp;const_iterator;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;__list_iterator&lt;T,&nbsp;Ref,&nbsp;Ptr&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self;</span> 

</li><li>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;bidirectional_iterator_tag&nbsp;iterator_category;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;迭代器类型属于bidirectional&nbsp;iterator </span>
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&nbsp;value_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;值类型 </span>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;Ptr&nbsp;pointer;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;指针类型 </span>
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;Ref&nbsp;reference;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;引用类型 </span>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;__list_node&lt;T&gt;*&nbsp;link_type;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;节点指针类型 </span>
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="datatypes">size_t</span><span>&nbsp;size_type;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="datatypes">ptrdiff_t</span><span>&nbsp;difference_type;</span> 
</li><li>
</li><li class="alt"><span>&nbsp;&nbsp;link_type&nbsp;node;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;迭代器当前所指的节点 
</span>
</li><li>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;三种构造函数 </span>
</li><li><span>&nbsp;&nbsp;__list_iterator(link_type&nbsp;x)&nbsp;:&nbsp;node(x)&nbsp;{}</span> 
</li><li class="alt"><span>&nbsp;&nbsp;__list_iterator()&nbsp;{}</span> 
</li><li><span>&nbsp;&nbsp;__list_iterator(</span><span class="keyword">const</span><span>&nbsp;iterator&amp;&nbsp;x)&nbsp;:&nbsp;node(x.node)&nbsp;{}</span> 
</li><li class="alt">
</li><li><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;==和!=操作符重载 </span>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="datatypes">bool</span><span>&nbsp;operator==(</span><span class="keyword">const</span><span>&nbsp;self&amp;&nbsp;x)&nbsp;</span><span class="keyword">const</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;node&nbsp;==&nbsp;x.node;&nbsp;}</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="datatypes">bool</span><span>&nbsp;operator!=(</span><span class="keyword">const</span><span>&nbsp;self&amp;&nbsp;x)&nbsp;</span><span class="keyword">const</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;node&nbsp;!=&nbsp;x.node;&nbsp;}</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;*操作符，汲取所指节点中的数据 </span>
</li><li class="alt"><span>&nbsp;&nbsp;reference&nbsp;operator*()&nbsp;</span><span class="keyword">const</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;(*node).data;&nbsp;}</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;-&gt;操作符，汲取所指节点中数据的地址 </span>
</li><li class="alt"><span>&nbsp;&nbsp;pointer&nbsp;operator-&gt;()&nbsp;</span><span class="keyword">const</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;&amp;(operator*());&nbsp;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;前置++操作符，指向下一个节点 </span>
</li><li class="alt"><span>&nbsp;&nbsp;self&amp;&nbsp;operator++()&nbsp;{&nbsp;</span> 
</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;(link_type)((*node).next);</span> 
</li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;*</span><span class="keyword">this</span><span>;</span> 
</li><li><span>&nbsp;&nbsp;}</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;后置++操作符，指向下一个节点 </span>
</li><li><span>&nbsp;&nbsp;self&nbsp;operator++(</span><span class="datatypes">int</span><span>)&nbsp;{&nbsp;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;self&nbsp;tmp&nbsp;=&nbsp;*</span><span class="keyword">this</span><span>;</span> 
</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;++*</span><span class="keyword">this</span><span>;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;tmp;</span> 
</li><li><span>&nbsp;&nbsp;}</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;前置--操作符，指向前一个节点 </span>
</li><li><span>&nbsp;&nbsp;self&amp;&nbsp;operator--()&nbsp;{&nbsp;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;node&nbsp;=&nbsp;(link_type)((*node).prev);</span> 
</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;*</span><span class="keyword">this</span><span>;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;}</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="comment">//&nbsp;后置--操作符，指向前一个节点 </span>
</li><li class="alt"><span>&nbsp;&nbsp;self&nbsp;operator--(</span><span class="datatypes">int</span><span>)&nbsp;{&nbsp;</span> 
</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;self&nbsp;tmp&nbsp;=&nbsp;*</span><span class="keyword">this</span><span>;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;--*</span><span class="keyword">this</span><span>;</span> 
</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;tmp;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;}</span> 
</li><li><span>};</span> 
</li><li class="alt">
</li><li><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;T,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Alloc&nbsp;=&nbsp;alloc&gt;</span> 
</li><li class="alt"><span class="keyword">class</span><span>&nbsp;list&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;...</span> 
</li><li class="alt"><span>&nbsp;&nbsp;...</span> 
</li><li>
</li><li class="alt"><span class="keyword">public</span><span>:</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;__list_iterator&lt;T,&nbsp;T&amp;,&nbsp;T*&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;注意iterator所用的就是__list_iterator </span>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;__list_iterator&lt;T,&nbsp;</span><span class="keyword">const</span><span>&nbsp;T&amp;,&nbsp;</span><span class="keyword">const</span><span>&nbsp;T*&gt;&nbsp;const_iterator;</span> 
</li><li>
</li><li class="alt"><span>&nbsp;&nbsp;...</span> 
</li><li><span>&nbsp;&nbsp;...</span> 
</li><li class="alt">
</li><li><span class="keyword">protected</span><span>:</span> 
</li><li class="alt"><span>&nbsp;&nbsp;link_type&nbsp;node;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;头节点,该List其实是一个带头节点的双向循环链表 </span>
</li><li>
</li><li class="alt"><span class="keyword">public</span><span>:</span> 
</li><li><span>&nbsp;&nbsp;list()&nbsp;{&nbsp;empty_initialize();&nbsp;}</span> 
</li><li class="alt">
</li><li><span>&nbsp;&nbsp;iterator&nbsp;begin()&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;(link_type)((*node).next);&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;返回头节点的下一个节点，即第一个节点的iterator </span>
</li><li class="alt"><span>&nbsp;&nbsp;const_iterator&nbsp;begin()&nbsp;</span><span class="keyword">const</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;(link_type)((*node).next);&nbsp;}</span> 
</li><li><span>&nbsp;&nbsp;iterator&nbsp;end()&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;node;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;返回头节点的iterator，其实就是返回链表的结尾 </span>
</li><li class="alt"><span>&nbsp;&nbsp;const_iterator&nbsp;end()&nbsp;</span><span class="keyword">const</span><span>&nbsp;{&nbsp;</span><span class="keyword">return</span><span>&nbsp;node;&nbsp;}</span> 
</li><li><span>&nbsp;&nbsp;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;...</span> 
</li><li><span>&nbsp;&nbsp;...</span> 
</li><li class="alt"><span>}</span> </li></ol></div>
<p style="FONT-SIZE: 12pt">如果我们对List容器使用find算法，这一过程中会发生什么？<br>int a[] = 
{1,2,3,4,5};<br>list&lt;int&gt; l(a, a+5);<br>list&lt;int&gt;::iterator it = 
find(l.begin(), l.end(), 3);<br>cout &lt;&lt; *it &lt;&lt; end;</p>
<p style="FONT-SIZE: 12pt">先看看find函数的定义</p>
<div class="highlighter">
<ol class="highlighter-cpp">
<li><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;InputIterator,&nbsp;</span><span class="keyword">class</span><span>&nbsp;T&gt;</span> 
</li><li class="alt"><span>InputIterator&nbsp;find(InputIterator&nbsp;first,&nbsp;InputIterator&nbsp;last,&nbsp;</span><span class="keyword">const</span><span>&nbsp;T&amp;&nbsp;value)&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(first&nbsp;!=&nbsp;last&nbsp;&amp;&amp;&nbsp;*first&nbsp;!=&nbsp;value)&nbsp;++first;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;first;</span> 
</li><li><span>}</span> </li></ol></div>
<p style="FONT-SIZE: 12pt">&nbsp; 
我们所调用的find函数的特化版本其实是：<br>find&lt;__list_iterator&lt;int, int&amp;, int*&gt;, 
int&gt;(__list_iterator&lt;int, int&amp;, int*&gt; first, 
__list_iterator&lt;int, int&amp;, int*&gt; last, const int&amp; 
value)<br>从而find函数中所用到的!=、*、++等操作符都作用在__list_iterator&lt;int, int&amp;, 
int*&gt;的身上，这正是泛型的作用所在。</p>
<p style="FONT-SIZE: 12pt">&nbsp;</p>
<p style="FONT-SIZE: 13pt"><font face="黑体"><strong>STL中迭代器的各种特性</strong></font></p>
<p style="FONT-SIZE: 12pt">&nbsp; 
还记得我在《STL源码剖析学习笔记2——神奇的__type_traits》中所提到的traits编程技巧么？在STL的迭代器中同样用到了这种技巧，因为STL的迭代器在使用的时候需要了解各种迭代器的特性。主要特性包含以下几种：<br>1、iterator_category：表示迭代器所属的类型<br>2、value_type：表示迭代器所指数据的类型<br>3、difference_type：表示两个迭代器之间的距离类型<br>4、pointer：表示迭代器所指数据的指针类型<br>5、reference：表示迭代器所指数据的引用类型</p>
<p style="FONT-SIZE: 12pt">&nbsp; 通常迭代器的几种特性被放在iterator_traits中。<br></p>
<div class="highlighter">
<ol class="highlighter-cpp">
<li><span class="comment">//&nbsp;对所有Iterator的泛化 </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;Iterator&gt;</span> 
</li><li><span class="keyword">struct</span><span>&nbsp;iterator_traits&nbsp;{</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">typename</span><span>&nbsp;Iterator::iterator_category&nbsp;iterator_category;</span> 

</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">typename</span><span>&nbsp;Iterator::value_type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">typename</span><span>&nbsp;Iterator::difference_type&nbsp;&nbsp;&nbsp;difference_type;</span> 

</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">typename</span><span>&nbsp;Iterator::pointer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">typename</span><span>&nbsp;Iterator::reference&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;</span> 

</li><li><span>};</span> 
</li><li class="alt">
</li><li><span class="comment">//&nbsp;对指针类型的偏特化（Partial&nbsp;Spetialization） </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;T&gt;</span> 
</li><li><span class="keyword">struct</span><span>&nbsp;iterator_traits&lt;T*&gt;&nbsp;{</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;random_access_iterator_tag&nbsp;iterator_category;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;指针类型是可以随机访问的 </span>
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;值类型 </span>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="datatypes">ptrdiff_t</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difference_type;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;指针类型之间的距离一定是整型（ptrdiff_t被定义为int型） </span>
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;</span> 

</li><li><span>};</span> 
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;T&gt;</span> 
</li><li><span class="keyword">struct</span><span>&nbsp;iterator_traits&lt;</span><span class="keyword">const</span><span>&nbsp;T*&gt;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;同上，只不过这里是常量指针 </span>
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;random_access_iterator_tag&nbsp;iterator_category;</span> 

</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="datatypes">ptrdiff_t</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difference_type;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">const</span><span>&nbsp;T*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">const</span><span>&nbsp;T&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;</span> 
</li><li><span>};</span> </li></ol></div>
<p style="FONT-SIZE: 12pt">&nbsp; 各种不同的迭代器的特性定义如下：</p>
<div class="highlighter">
<ol class="highlighter-cpp">
<li><span class="comment">//&nbsp;input&nbsp;iterator的属性 </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;T,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Distance&gt;&nbsp;</span><span class="keyword">struct</span><span>&nbsp;input_iterator&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;input_iterator_tag&nbsp;iterator_category;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;Distance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difference_type;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;</span> 
</li><li class="alt"><span>};</span> 
</li><li><span class="comment">//&nbsp;output&nbsp;iterator的属性 </span>
</li><li class="alt"><span class="keyword">struct</span><span>&nbsp;output_iterator&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;output_iterator_tag&nbsp;iterator_category;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difference_type;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;</span> 
</li><li class="alt"><span>};</span> 
</li><li><span class="comment">//&nbsp;forward&nbsp;iterator的属性 </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;T,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Distance&gt;&nbsp;</span><span class="keyword">struct</span><span>&nbsp;forward_iterator&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;forward_iterator_tag&nbsp;iterator_category;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;Distance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difference_type;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;</span> 
</li><li class="alt"><span>};</span> 
</li><li><span class="comment">//&nbsp;bidirectional&nbsp;iterator的属性 </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;T,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Distance&gt;&nbsp;</span><span class="keyword">struct</span><span>&nbsp;bidirectional_iterator&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;bidirectional_iterator_tag&nbsp;iterator_category;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;</span> 

</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;Distance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difference_type;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;</span> 

</li><li class="alt"><span>};</span> 
</li><li><span class="comment">//&nbsp;random&nbsp;access&nbsp;iterator的属性 </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;T,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Distance&gt;&nbsp;</span><span class="keyword">struct</span><span>&nbsp;random_access_iterator&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;random_access_iterator_tag&nbsp;iterator_category;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value_type;</span> 

</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;Distance&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;difference_type;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pointer;</span> 
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;T&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reference;</span> 

</li><li class="alt"><span>};</span> </li></ol></div>
<p class="alt"><span style="FONT-SIZE: 12pt">&nbsp; 
通过iterator_traits就能得到相应interator的各种特性，这样可以让程序更灵活，也能提高效率。<br>下面几个例子是为了说明iterator_traits在STL中的使用<br>eg1. 
count模板函数，它的返回值必须使用difference_type</span></p><span style="FONT-SIZE: 12pt">
<div class="highlighter">
<ol class="highlighter-cpp">
<li><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;InputIterator,&nbsp;</span><span class="keyword">class</span><span>&nbsp;T&gt;</span> 
</li><li class="alt"><span class="keyword">typename</span><span>&nbsp;iterator_traits&lt;InputIterator&gt;::difference_type</span> 

</li><li><span>count(InputIterator&nbsp;first,&nbsp;InputIterator&nbsp;last,&nbsp;</span><span class="keyword">const</span><span>&nbsp;T&amp;&nbsp;value)&nbsp;{</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typename</span><span>&nbsp;iterator_traits&lt;InputIterator&gt;::difference_type&nbsp;n&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;萃取迭代器的difference_type类型 </span>
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">for</span><span>&nbsp;(&nbsp;;&nbsp;first&nbsp;!=&nbsp;last;&nbsp;++first)</span> 
</li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(*first&nbsp;==&nbsp;value)</span> 
</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;++n;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;n;</span> 
</li><li><span>}</span> </li></ol></div>
<p>eg2. advance模板函数，为了提高效率，必须针对不同类型的iterator重载不同的处理函数</p>
<div class="highlighter">
<ol class="highlighter-cpp">
<li><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;InputIterator,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Distance&gt;</span> 
</li><li class="alt"><span class="keyword">inline</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;advance(InputIterator&amp;&nbsp;i,&nbsp;Distance&nbsp;n)&nbsp;{</span> 

</li><li><span>&nbsp;&nbsp;__advance(i,&nbsp;n,&nbsp;iterator_category(i));&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;根据不同的类型调用不同的重载函数 </span>
</li><li class="alt"><span>}</span> 
</li><li>
</li><li class="alt"><span class="comment">//&nbsp;iterator_category函数的定义 </span>
</li><li><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;Iterator&gt;</span> 
</li><li class="alt"><span class="keyword">inline</span><span>&nbsp;</span><span class="keyword">typename</span><span>&nbsp;iterator_traits&lt;Iterator&gt;::iterator_category</span> 

</li><li><span>iterator_category(</span><span class="keyword">const</span><span>&nbsp;Iterator&amp;)&nbsp;{</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">typedef</span><span>&nbsp;</span><span class="keyword">typename</span><span>&nbsp;iterator_traits&lt;Iterator&gt;::iterator_category&nbsp;category;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;其实就是返回Iterator的iterator_category类型 </span>
</li><li><span>&nbsp;&nbsp;</span><span class="keyword">return</span><span>&nbsp;category();</span> 
</li><li class="alt"><span>}</span> </li></ol></div>
<p>&nbsp; 再看__advance函数针对不同迭代器的三种版本，它们分别针对input iterator、forward 
iterator、Bidirectional iterator和Random access iterator四种不同的迭代器</p>
<div class="highlighter">
<ol class="highlighter-cpp">
<li><span class="comment">//&nbsp;针对input&nbsp;iterator和forward&nbsp;iterator的版本 </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;InputIterator,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Distance&gt;</span> 
</li><li><span class="keyword">inline</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;__advance(InputIterator&amp;&nbsp;i,&nbsp;Distance&nbsp;n,&nbsp;input_iterator_tag)&nbsp;{</span> 

</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(n--)&nbsp;++i;&nbsp;&nbsp;</span><span class="comment">//&nbsp;只能单向移动 </span>
</li><li><span>}</span> 
</li><li class="alt"><span class="comment">//&nbsp;针对Bidirectional&nbsp;iterator的版本 </span>
</li><li><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;BidirectionalIterator,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Distance&gt;</span> 
</li><li class="alt"><span class="keyword">inline</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;__advance(BidirectionalIterator&amp;&nbsp;i,&nbsp;Distance&nbsp;n,&nbsp;</span> 

</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bidirectional_iterator_tag)&nbsp;{</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">if</span><span>&nbsp;(n&nbsp;&gt;=&nbsp;0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;根据方向不同有不同的处理 </span>
</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(n--)&nbsp;++i;</span> 
</li><li class="alt"><span>&nbsp;&nbsp;</span><span class="keyword">else</span> 
</li><li><span>&nbsp;&nbsp;&nbsp;&nbsp;</span><span class="keyword">while</span><span>&nbsp;(n++)&nbsp;--i;</span> 
</li><li class="alt"><span>}</span> 
</li><li><span class="comment">//&nbsp;针对Random&nbsp;access&nbsp;iterator的版本 </span>
</li><li class="alt"><span class="keyword">template</span><span>&nbsp;&lt;</span><span class="keyword">class</span><span>&nbsp;RandomAccessIterator,&nbsp;</span><span class="keyword">class</span><span>&nbsp;Distance&gt;</span> 
</li><li><span class="keyword">inline</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;__advance(RandomAccessIterator&amp;&nbsp;i,&nbsp;Distance&nbsp;n,&nbsp;</span> 

</li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;random_access_iterator_tag)&nbsp;{</span> 
</li><li><span>&nbsp;&nbsp;i&nbsp;+=&nbsp;n;&nbsp;&nbsp;&nbsp;</span><span class="comment">//&nbsp;随机访问，提高效率 </span>
</li><li class="alt"><span>}</span> </li></ol></div>
<p>&nbsp; 总的来说，在STL中是由容器（container）来负责设计适当的迭代器（iterator），由迭代器（iterator）来负责设计适当的迭代器 
属性。正因为这一点才使得容器和算法可以完全分离开来，通过迭代器提供的接口来访问容器的内部元素。在这里我们又一次看到了traits编程技巧的强大功 
能，在很大程度上弥补了C++语言不是强类型语言的不足之处。</p></span></div></td></tr></tbody></table><br>
<img src ="http://www.cppblog.com/minxinwang/aggbug/138538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/minxinwang/" target="_blank">Mr.wang</a> 2011-01-14 15:56 <a href="http://www.cppblog.com/minxinwang/archive/2011/01/14/138538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++内联函数(转载)</title><link>http://www.cppblog.com/minxinwang/archive/2011/01/11/138366.html</link><dc:creator>Mr.wang</dc:creator><author>Mr.wang</author><pubDate>Tue, 11 Jan 2011 15:07:00 GMT</pubDate><guid>http://www.cppblog.com/minxinwang/archive/2011/01/11/138366.html</guid><wfw:comment>http://www.cppblog.com/minxinwang/comments/138366.html</wfw:comment><comments>http://www.cppblog.com/minxinwang/archive/2011/01/11/138366.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/minxinwang/comments/commentRss/138366.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/minxinwang/services/trackbacks/138366.html</trackback:ping><description><![CDATA[
<div>C++ 内联函数和宏的区别</div><div>介绍内联函数之前，有必要介绍一下预处理宏。内联函数的功能和预处理宏的功能相似。相信大家都用过预处理宏，我们会经常定义一些宏，如</div><div>#define TABLE_COMP(x) ((x)&gt;0?(x):0)&nbsp;</div><div>　&nbsp;</div><div>就定义了一个宏。</div><div>&nbsp;&nbsp; &nbsp;为什么要使用宏呢？因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址，将函数的程序内容执行完后，再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址，转回后要恢复现场，并按原来保存地址继续执行。因此，函数调用要有一定的时间和空间方面的开销，于是将影响其效率。而宏只是在预处理的地方把代码展开，不需要额外的空间和时间方面的开销，所以调用一个宏比调用一个函数更有效率。&nbsp;</div><div><br></div><div>&nbsp;&nbsp; &nbsp;但是宏也有很多的不尽人意的地方。</div><div>&nbsp;&nbsp; &nbsp;1、宏不能访问对象的私有成员。</div><div>&nbsp;&nbsp; &nbsp;2、宏的定义很容易产生二意性。</div><div>&nbsp;&nbsp; &nbsp;我们举个例子：</div><div><br></div><div>#define TABLE_MULTI(x) (x*x)</div><div><br></div><div>&nbsp;&nbsp; &nbsp;我们用一个数字去调用它,TABLE_MULTI(10)，这样看上去没有什么错误，结果返回100,是正确的，但是如果我们用TABLE_MULTI(10+10)去调用的话，我们期望的结果是４００，而宏的调用结果是(10+10*10+10),结果是120，这显然不是我们要得到的结果。避免这些错误的方法，一是给宏的参数都加上括号。</div><div>#define TABLE_MULTI(x) ((x)*(x))</div><div><br></div><div>&nbsp;&nbsp; &nbsp;这样可以确保不会出错，但是，即使使用了这种定义，这个宏依然有可能出错，例如使用TABLE_MULTI(a++)调用它，他们本意是希望得到(a+1)*(a+1)的结果，而实际上呢？我们可以看看宏的展开结果: (a++)*(a++)，如果a的值是４，我们得到的结果是5*6=30。而我们期望的结果是5*5=25,这又出现了问题。事实上，在一些C的库函数中也有这些问题。例如: Toupper(*pChar++)就会对pChar执行两次++操作，因为Toupper实际上也是一个宏。&nbsp;</div><div>&nbsp;&nbsp; &nbsp;我们可以看到宏有一些难以避免的问题，怎么解决呢？</div><div><br></div><div>&nbsp;&nbsp; &nbsp;下面就是用我要介绍的内联函数来解决这些问题，我们可以使用内联函数来取代宏的定义。而且事实上我们可以用内联函数完全取代预处理宏。</div><div>&nbsp;&nbsp; &nbsp;内联函数和宏的区别在于，宏是由预处理器对宏进行替代，而内联函数是通过编译器控制来实现的。而且内联函数是真正的函数，只是在需要用到的时候，内联函数像宏一样的展开，所以取消了函数的参数压栈，减少了调用的开销。你可以象调用函数一样来调用内联函数，而不必担心会产生于处理宏的一些问题。</div><div>&nbsp;&nbsp; &nbsp;我们可以用Inline来定义内联函数，不过，任何在类的说明部分定义的函数都会被自动的认为是内联函数。</div><div><br></div><div>&nbsp;&nbsp; &nbsp;下面我们来介绍一下内联函数的用法。</div><div>&nbsp;&nbsp; &nbsp;内联函数必须是和函数体申明在一起，才有效。像这样的申明Inline Tablefunction(int I)是没有效果的，编译器只是把函数作为普通的函数申明，我们必须定义函数体。</div><div><br></div><div>Inline tablefunction(int I) {return I*I};</div><div>&nbsp;&nbsp; &nbsp;这样我们才算定义了一个内联函数。我们可以把它作为一般的函数一样调用。但是执行速度确比一般函数的执行速度要快。</div><div>&nbsp;&nbsp; &nbsp;我们也可以将定义在类的外部的函数定义为内联函数，比如：</div><div><br></div><div>Class TableClass{</div><div>　Private:</div><div>　　Int I,j;</div><div>　Public:&nbsp;</div><div>　　Int add() ;</div><div>　　Inline int dec()&nbsp;</div><div>　　Int GetNum();</div><div>}</div><div>inline int tableclass::GetNum(){</div><div>return I;</div><div>}</div><div><br></div><div>&nbsp;&nbsp; &nbsp;上面申明的三个函数都是内联函数。在C++中，在类的内部定义了函数体的函数，被默认为是内联函数。而不管你是否有inline关键字。</div><div>&nbsp;&nbsp; &nbsp;内联函数在C++类中，应用最广的，应该是用来定义存取函数。我们定义的类中一般会把数据成员定义成私有的或者保护的，这样，外界就不能直接读写我们类成员的数据了。对于私有或者保护成员的读写就必须使用成员接口函数来进行。如果我们把这些读写成员函数定义成内联函数的话，将会获得比较好的效率。</div><div><br></div><div>Class sample{</div><div>　Private:</div><div>　　Int nTest;</div><div>　Public:</div><div>　　Int readtest(){ return nTest;}</div><div>　Void settest(int I) {nTest=I;}</div><div>}&nbsp;</div><div>&nbsp;&nbsp; &nbsp;当然，内联函数也有一定的局限性。就是函数中的执行代码不能太多了，如果，内联函数的函数体过大，一般的编译器会放弃内联方式，而采用普通的方式调用函数。这样，内联函数就和普通函数执行效率一样了。</div><div><br></div>
<img src ="http://www.cppblog.com/minxinwang/aggbug/138366.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/minxinwang/" target="_blank">Mr.wang</a> 2011-01-11 23:07 <a href="http://www.cppblog.com/minxinwang/archive/2011/01/11/138366.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>