﻿<?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++博客-zhangtao0048</title><link>http://www.cppblog.com/zhangtao0048/</link><description /><language>zh-cn</language><lastBuildDate>Thu, 09 Apr 2026 15:41:18 GMT</lastBuildDate><pubDate>Thu, 09 Apr 2026 15:41:18 GMT</pubDate><ttl>60</ttl><item><title>平衡二叉树 (Balanced binary tree)</title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/17/187482.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Fri, 17 Aug 2012 06:42:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/17/187482.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/187482.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/17/187482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/187482.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/187482.html</trackback:ping><description><![CDATA[<div class="postText">形态匀称的二叉树称为平衡二叉树 (Balanced binary tree) ，其严格定义是：<br />　　一棵空树是平衡二叉树；若 T 是一棵非空二叉树，其左、右子树为 TL 和 TR ，令 hl 和 hr 分别为左、右子树的深度。当且仅当<br />　　　&#9312;TL 、 TR 都是平衡二叉树； <br />　　　&#9313; ｜ hl － hr ｜&#8804; 1；<br />时，则 T 是平衡二叉树。<br />【例】如图 8.4 所示。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://sjjg.js.zwu.edu.cn/SFXX/chazhao/tupian/8.4.gif" width="328" height="205"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（a）平衡二叉树&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;（b）非平衡二叉树<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图8.3 平衡二叉树与非平衡二叉树<br />相应地定义 hl － hr 为二叉平衡树的平衡因子 (balance factor) 。因此，平衡二叉树上所有结点的平衡因子可能是 -1 ， 0 ， 1 。换言之，若一棵二叉树上任一结点的平衡因子的绝对值都不大于 1 ，则该树是就平衡二叉树。<br /><strong><font size="4">动态平衡技术</font></strong> <br /><strong>1.动态平衡技术</strong><br />Adelson-Velskii 和 Landis 提出了一个动态地保持二叉排序树平衡的方法，其基本思想是：<br />　　在构造二叉排序树的过程中，每当插入一个结点时，首先检查是否因插入而破坏了树的平衡性，如果是因插入结点而破坏了树的平衡性，则找出其中<strong>最小不平衡子树</strong>，在保持排序树特性的前提下，调整最小不平衡子树中各结点之间的连接关系，以达到新的平衡。通常将这样得到的平衡二叉排序树简称为<strong> AVL 树</strong>。<br /><strong>2.最小不平衡子树</strong><br />　　以离插入结点最近、且平衡因子绝对值大于 1 的结点作根结点的子树。为了简化讨论，不妨假设二叉排序树的最小不平衡子树的根结点为 A ，则调整该子树的规律可归纳为下列四种情况：<br /><font color="#0000ff">（1） LL 型：</font><br />　　新结点 X 插在 A 的左孩子的左子树里。调整方法见图 8.5(a) 。图中以 B 为轴心，将 A 结点从 B 的右上方转到 B 的右下侧，使 A 成为 B 的右孩子。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://sjjg.js.zwu.edu.cn/SFXX/chazhao/tupian/8.5.gif" width="408" height="383"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图8.5 平衡调整的4种基本类型（结点旁的数字是平衡因子）<br /><font color="#0000ff">（2）RR 型：</font><br />　　新结点 X 插在 A 的右孩子的右子树里。调整方法见图 8.5(b) 。图中以 B 为轴心，将 A 结点从 B 的左上方转到 B 的左下侧，使 A 成为 B 的左孩子。<br /><font color="#0000ff">（3）LR 型：</font><br />　　新结点 X 插在 A 的左孩子的右子树里。调整方法见图 8.5(c) 。分为两步进行：第一步以 X 为轴心，将 B 从 X 的左上方转到 X 的左下侧，使 B 成为 X 的左孩子， X 成为 A 的左孩子。第二步跟 LL 型一样处理 ( 应以 X 为轴心 ) 。 <br /><font color="#0000ff">（4）RL 型：</font><br />　　新结点 X 插在 A 的右孩子的左子树里。调整方法见图 8.5(d) 。分为两步进行：第一步以 X 为轴心，将 B 从 X 的右上方转到 X 的右下侧，使 B 成为 X 的右孩子， X 成为 A 的右孩子。第二步跟 RR 型一样处理 ( 应以 X 为轴心 ) 。<br />【例】<br />实际的插入情况，可能比图 8.5 要复杂。因为 A 、 B 结点可能还会有子树。现举一例说明，设一组记录的关键字按以下次序进行插入： 4 、 5 、 7 ， 2 、 1 、 3 、 6 ，其生成及调整成二叉平衡树的过程示于图 8.6 。 <br />　　在图 8.6 中，当插入关键字为 3 的结点后，由于离结点 3 最近的平衡因子为 2 的祖先是根结点 5 。所以，第一次旋转应以结点 4 为轴心，把结点 2 从结点 4 的左上方转到左下侧，从而结点 5 的左孩子是结点 4 ，结点 4 的左孩子是结点 2 ，原结点 4 的左孩子变成了结点 2 的右孩子。第二步再以结点 4 为轴心，按 LL 类型进行转换。这种插入与调整平衡的方法可以编成算法和程序，这里就不再讨论了。 <br /><img src="http://sjjg.js.zwu.edu.cn/SFXX/chazhao/tupian/8.6.gif" width="530" height="673"  alt="" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;图 8.6 二叉平衡树插入结点 ( 结点旁的数字为其平衡因子 )<br /></div><img src ="http://www.cppblog.com/zhangtao0048/aggbug/187482.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-17 14:42 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/17/187482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>指向函数的指针 </title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/15/187291.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Wed, 15 Aug 2012 07:42:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/15/187291.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/187291.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/15/187291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/187291.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/187291.html</trackback:ping><description><![CDATA[<strong>(一) 用函数指针变量调用函数</strong> 
<p>　　可以用指针变量指向整形变量、字符串、数组、结构体、也可以指向一个函数。一个函数在编译时被分配一个入口地址。这个入口地址就称为函数指针。可以用一个指针变量指向函数，然后通过该指针变量调用此函数。用简单的数值比较为例：</p>
<div class="cnblogs_code">
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" href="javascript:void(0);"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></span></div><pre><div><span style="color: #008080"> 1</span> <span style="color: #000000">#include </span><span style="color: #000000">&lt;</span><span style="color: #000000">stdio.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080"> 2</span> <span style="color: #000000">#include </span><span style="color: #000000">&lt;</span><span style="color: #000000">stdlib.h</span><span style="color: #000000">&gt;</span><span style="color: #000000"><br /></span><span style="color: #008080"> 3</span> <span style="color: #000000"><br /></span><span style="color: #008080"> 4</span> <span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000"> main()<br /></span><span style="color: #008080"> 5</span> <span style="color: #000000">{<br /></span><span style="color: #008080"> 6</span> <span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> max(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /></span><span style="color: #008080"> 7</span> <span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> (</span><span style="color: #000000">*</span><span style="color: #000000">p)(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /></span><span style="color: #008080"> 8</span> <span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> a,b,c;<br /></span><span style="color: #008080"> 9</span> <span style="color: #000000">    p </span><span style="color: #000000">=</span><span style="color: #000000"> max;<br /></span><span style="color: #008080">10</span> <span style="color: #000000">    scanf(</span><span style="color: #800000">"</span><span style="color: #800000">%d,%d</span><span style="color: #800000">"</span><span style="color: #000000">,</span><span style="color: #000000">&amp;</span><span style="color: #000000">a,</span><span style="color: #000000">&amp;</span><span style="color: #000000">b);<br /></span><span style="color: #008080">11</span> <span style="color: #000000">    c </span><span style="color: #000000">=</span><span style="color: #000000"> (</span><span style="color: #000000">*</span><span style="color: #000000">p)(a,b);<br /></span><span style="color: #008080">12</span> <span style="color: #000000">    printf(</span><span style="color: #800000">"</span><span style="color: #800000">a=%d,b=%d,max=%d\n</span><span style="color: #800000">"</span><span style="color: #000000">,a,b,c);<br /></span><span style="color: #008080">13</span> <span style="color: #000000">    </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #800080">0</span><span style="color: #000000">;<br /></span><span style="color: #008080">14</span> <span style="color: #000000">}<br /></span><span style="color: #008080">15</span> <span style="color: #000000"><br /></span><span style="color: #008080">16</span> <span style="color: #000000"></span><span style="color: #0000ff">int</span><span style="color: #000000"> max(</span><span style="color: #0000ff">int</span><span style="color: #000000"> x,</span><span style="color: #0000ff">int</span><span style="color: #000000"> y)<br /></span><span style="color: #008080">17</span> <span style="color: #000000">{<br /></span><span style="color: #008080">18</span> <span style="color: #000000">    </span><span style="color: #0000ff">int</span><span style="color: #000000"> z;<br /></span><span style="color: #008080">19</span> <span style="color: #000000">    </span><span style="color: #0000ff">if</span><span style="color: #000000">(x</span><span style="color: #000000">&gt;</span><span style="color: #000000">y) z </span><span style="color: #000000">=</span><span style="color: #000000"> x;<br /></span><span style="color: #008080">20</span> <span style="color: #000000">    </span><span style="color: #0000ff">else</span><span style="color: #000000"> z </span><span style="color: #000000">=</span><span style="color: #000000"> y;<br /></span><span style="color: #008080">21</span> <span style="color: #000000">    </span><span style="color: #0000ff">return</span><span style="color: #000000">(z);<br /></span><span style="color: #008080">22</span> <span style="color: #000000">}</span></div></pre>
<div class="cnblogs_code_toolbar"><span class="cnblogs_code_copy"><a title="复制代码" href="javascript:void(0);"><img alt="复制代码" src="http://common.cnblogs.com/images/copycode.gif" /></a></span></div></div>
<p>　　main函数中的" c = max(a,b); " 包括了一次函数的调用。每一个函数都占用一段内存单元。因此，可以用一个指针变量指向一个函数，通过指针变量来访问它指向的函数。</p>
<p>　　第7行：int （*p）( int,int );&nbsp; 用来定义 <strong>p 是一个指向函数的指针变量</strong>，该函数有两个整形参数，函数值为整形。注意 *p 两侧的括号不可省略，表示 p 先与 * 结合，是指针变量，然后再与后面的 ( ) 结合，表示此指针变量指向函数，这个函数值 (即函数的返回值) 是整形的。如果写成 int *p ( int,int ) ,由于( )的优先级高于 *，它就成了声明一个函数P( <strong>这个函数的返回值是指向整形变量的指针</strong>)。</p>
<p>　　赋值语句 p = max ; 作用是将函数 max 的入口地址赋给指针变量p。和数组名代表数组首元素地址类似，<strong>函数名代表该函数的入口地址</strong>。这时&nbsp;p 就是指向函数 max 的指针变量，此时 p 和 max都指向函数开头，调用 *p 就是调用 max 函数。但是p作为指向函数的指针变量，它只能指向函数入口处而不可能指向函数中间的某一处指令处，因此不能用 *(p + 1)来表示指向下一条指令。</p>
<p>　　注意:</p>
<p>　　(1) 指向函数的指针变量的一般定义形式为：</p>
<p>　　<strong>数据类型 （*指针变量名）（函数参数列表）</strong></p>
<p><strong>　</strong>　这里数据类型就是函数返回值的类型</p>
<p>　　(2) int (* p) ( int,int ); 它只是定义一个指向函数的指针变量 p, 它不是固定指向哪一个函数的，而只是表示定义<strong>这样一个类型的变量</strong>，它是专门用来存放函数的入口地址的。在程序中把哪一函数(该函数的值应该是整形的，且有两个整形参数)的地址赋给它，他就指向哪一个函数。在一个函数中，一个函数指针变量可以先后指向同类型的不同函数。</p>
<p>　　(3) p = max; 在给函数指针变量赋值时，只需给出函数名而不必给出函数参数，因为是将函数的入口地址赋给 p ，而不涉及 实参和形参的结合问题，不能写成 p = max(a,b);</p>
<p>　　(4) c = (*p)(a,b) 在函数调用时，只需将( *p ) 代替函数名即可，后面实参依旧。</p>
<p>　　(5) 对于指向函数的指针变量，像 p++ ,p+n.....是无意义的。</p>
<p>　　<strong>(二) 用指向函数的指针作为函数参数</strong></p>
<p><strong>　</strong>　<strong>函数指针变量通常的用途之一就是把指针作为参数传递到其他函数。</strong></p>
<p><strong>　　</strong>函数的参数可以是变量、指向变量的指针变量、数组名、指向数组的指针变量，也可以是<strong>指向函数的指针也可以作为参数，以实现函数地址的传递，这样就能够在被调用的函数中使用实参函数。</strong></p>
<p><strong>　　</strong>void&nbsp; sub ( int ( *x1) (int), int (*x2) (int,int) )</p>
<p>　　　　{</p>
<p>　　　　　　int a,b,i,j;</p>
<p>　　　　　　a = (*x1)(i);　　　　　 /* 调用 f1 函数 */</p>
<p>　　　　　　b = (*x2)(i)(j);　　　　/* 调用 f2 函数 */</p>
<p>　　　　}</p>
<p>　　如果实参为两个 函数名 f1 和 f2. 在函数首部定义x1、x2为函数指针变量，x1指向的函数有一个整形形参，x2指向的函数有两个形参。i 和 j 是函数f1 和 f2所要的参数。函数sub的形参 x1、x2(指针变量)在函数 sub 未被调用时并不占用内存单元，也不指向任何函数。在sub被调用时，把实参函数 f1 和 f2的入口地址传给形式指针变量 x1 和 x2.</p>
<p>　　既然在 sub 函数中要调用 f1 和 f2 函数，为什么不直接调用f1 和 f2而要用函数指针变量呢? 确实，如果只是用到f1 和 f2 函数，完全可以在sub函数中直接调用f1 和 f2,而不必设指针变量 x1 和 x2。 但是,如果在每次调用sub时，调用的函数不是固定的，下次是f3 和&nbsp;f4，再是f5 和 f6...这时用指针变量就比较方便了。<br /><br />我们在类里面会定义成员函数，同时我们也希望定义成员函数指针。因此需要解决3个问题，第一怎么定义类的函数指针，第二赋值，第三使用。<br />我定义一个类，<br /></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;add(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mul(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;div(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />};<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;A::add(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;b;<br />}<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;A::mul(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;b;<br />}<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;A::div(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;(b&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;a</span><span style="color: #000000">/</span><span style="color: #000000">b&nbsp;:&nbsp;a);<br />}</span></div>
<p>我现在想要定义一个指针，指向A类型中返回值为int，参数为两个int的函数指针。熟悉C的同学马上会写出typedef int (*oper)(int,int)。但是这个用到C++里就有问题了，<br />因为我们知道，类的非static成员方法实际上还有this指针的参数。比如add方法，它实际的定义可能会这样int add(A* this,int a,int b);因此，我们不能简单把C语言里的那套东西搬过来，我们需要重新定义这种类型的指针。正确做法是加上类型，typedef int (A::*Action)(int,int)<br /></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000">typedef&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;(A::</span><span style="color: #000000">*</span><span style="color: #000000">&nbsp;Action)(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;Action&nbsp;p&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">A::add;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;(a.</span><span style="color: #000000">*</span><span style="color: #000000">p)(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}</span></div>
<p>&nbsp;</p>
<div><span style="font-size: 13px"><span style="color: #000000">Action&nbsp;p&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">&amp;</span><span style="color: #000000">A::add;这个就是赋值语句<br />调用的时候注意，直接这样(*p)(1,2)是不行的，它必须绑定到一个对象上</span></span><span style="color: #000000">(a.</span><span style="color: #000000">*</span><span style="color: #000000">p)(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">);我们也可以把类的函数指针定义在类的声明里。<br />
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;add(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mul(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;div(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;(A::</span><span style="color: #000000">*</span><span style="color: #000000">oper)(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />};</span></div></span></div>
<p>上面这种方式是针对非static成员函数的，那么static成员函数的函数指针应该怎么定义呢，还能用上面这种方式吗？我们知道static成员函数是没有this指针的，所以不会加上的类的限定，它的函数指针定义方式和C里面的函数指针定义方式一样的。<br /></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;add(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mul(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;div(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;sub(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />};<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;A::sub(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;a,</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;b)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;a&nbsp;</span><span style="color: #000000">-</span><span style="color: #000000">&nbsp;b;<br />}<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">pp)(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">A::sub;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;(</span><span style="color: #000000">*</span><span style="color: #000000">pp)(</span><span style="color: #000000">10</span><span style="color: #000000">,</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 />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}</span></div>
<p>总结起来，非static成员函数的函数指针需要加上类名，而static的成员函数的函数指针和普通的函数指针一样，没有什么区别。<br />另外注意一点的是<br />如果函数指针定义在类中，调用的时候有点区别。<br /></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;A<br />{<br /></span><span style="color: #0000ff">public</span><span style="color: #000000">:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;add(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;mul(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;div(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;(A::</span><span style="color: #000000">*</span><span style="color: #000000">pfunc)(</span><span style="color: #0000ff">int</span><span style="color: #000000">,</span><span style="color: #0000ff">int</span><span style="color: #000000">);<br />};<br /><br /></span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;a;<br />&nbsp;&nbsp;&nbsp;&nbsp;a.pfunc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">&amp;</span><span style="color: #000000">A::add;<br />&nbsp;&nbsp;&nbsp;&nbsp;cout&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;(a.</span><span style="color: #000000">*</span><span style="color: #000000">(a.pfunc))(</span><span style="color: #000000">1</span><span style="color: #000000">,</span><span style="color: #000000">2</span><span style="color: #000000">)&nbsp;</span><span style="color: #000000">&lt;&lt;</span><span style="color: #000000">&nbsp;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;<br />}</span></div>
<p>&nbsp;</p><img src ="http://www.cppblog.com/zhangtao0048/aggbug/187291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-15 15:42 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/15/187291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>关于set中存放的元素的排列顺序</title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/13/187064.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Mon, 13 Aug 2012 05:37:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/13/187064.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/187064.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/13/187064.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/187064.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/187064.html</trackback:ping><description><![CDATA[<div>1. set中存放的为数（整数，浮点数......）<br />在set中会按从小到大排列这些数<br />例：
<p>#include &lt;iostream&gt;<br />#include &lt;set&gt;<br />using namespace std;</p>
<p>int main()<br />{<br />&nbsp;set&lt;float&gt; a;<br />&nbsp;a.insert(12.3);<br />&nbsp;a.insert(60.3);<br />&nbsp;a.insert(32.3);<br />&nbsp;a.insert(822.1);<br />&nbsp;a.insert(41140.1);<br />&nbsp;a.insert(44449.8);<br />&nbsp;set&lt;float&gt;::iterator p2a= a.begin();<br />&nbsp;while(p2a!= a.end())<br />&nbsp;{cout&lt;&lt; *p2a&lt;&lt; endl; ++p2a;}<br />&nbsp;return 0;<br />}</p>[142]stxtopt05: /remote/us01home37/taoz/works/testset/ &gt; g++ test.cc<br />[143]stxtopt05: /remote/us01home37/taoz/works/testset/ &gt; ./a.out<br />12.3<br />32.3<br />60.3<br />822.1<br />41140.1<br />44449.8<br /><br />2. set 中存放的为string<br />存入的string会按字母表顺序排列<br />例：<br />
<p>#include &lt;iostream&gt;<br />#include &lt;string&gt;<br />#include &lt;set&gt;<br />using namespace std;</p>
<p>int main()<br />{<br />&nbsp;set&lt;string&gt; a;<br />&nbsp;a.insert("bcdefg");<br />&nbsp;a.insert("acdefg");<br />&nbsp;a.insert("abdefg");<br />&nbsp;a.insert("dabcefg");<br />&nbsp;a.insert("bcdfg");<br />&nbsp;a.insert("fabcdeg");<br />&nbsp;set&lt;string&gt;::iterator p2a= a.begin();<br />&nbsp;while(p2a!= a.end())<br />&nbsp;{cout&lt;&lt; *p2a&lt;&lt; endl; ++p2a;}<br />&nbsp;return 0;<br />}<br /><br /></p>[147]stxtopt05: /remote/us01home37/taoz/works/testset/ &gt; g++ test.cc<br />[148]stxtopt05: /remote/us01home37/taoz/works/testset/ &gt; ./a.out<br />abdefg<br />acdefg<br />bcdefg<br />bcdfg<br />dabcefg<br />fabcdeg<br /><br />其他类型大家可以用上面的程序试试，至于存放类的话，还可以自己定义排列规则<br />所以，将数存入set中不仅可以去重，还可以排序哦<br /></div><img src ="http://www.cppblog.com/zhangtao0048/aggbug/187064.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-13 13:37 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/13/187064.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>map类型.</title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/13/187041.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Mon, 13 Aug 2012 02:03:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/13/187041.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/187041.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/13/187041.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/187041.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/187041.html</trackback:ping><description><![CDATA[<div class="postTitle"><strong><span style="font-size: 18px"><span style="color: rgb(0,0,255)">1。目录</span></span></strong></div>
<div>
<ol><li><span style="font-size: 16px">map简介</span></li><li><span style="font-size: 16px">map的功能</span></li><li><span style="font-size: 16px">map的定义</span></li><li><span style="font-size: 16px">在map中添加元素</span></li><li><span style="font-size: 16px">查找并获取map中的元素</span></li><li><span style="font-size: 16px">从map中删除元素</span></li><li><span style="font-size: 16px">map对象的迭代遍历&nbsp;</span></li></ol></div>
<p><strong><span style="color: rgb(0,0,255)"><span style="font-size: 18px">2。map简介</span></span></strong></p>
<p><span style="font-size: 16px">map是一类<span style="color: rgb(0,0,0)">关联式容器，它是模板类</span>。关联的本质在于元素的值与某个特定的键相关联，而并非通过元素在数组中的位置类获取。它的特点是<span style="color: rgb(155,187,89)">增加和删除节点对迭代器的影响很小</span>，除了操作节点，对其他的节点都没有什么影响。对于迭代器来说，不可以修改键值，只能修改其对应的实值。</span></p>
<p>&nbsp;</p>
<p><strong><span style="color: rgb(0,0,255)"><span style="font-size: 18px">3。map的功能</span></span></strong></p>
<ol><li><span style="font-size: 16px">自动建立Key － value的对应。key 和 value可以是任意你需要的类型，但是<span style="color: rgb(255,0,0)">需要注意的是对于key的类型，唯一的约束就是必须支持&lt;操作符</span>。</span></li><li><span style="font-size: 16px">根据key值快速查找记录，<span style="color: rgb(255,0,0)">查找的复杂度基本是Log(N</span><span style="color: rgb(255,0,0)">)</span>，如果有1000个记录，最多查找10次，1,000,000个记录，最多查找20次。</span></li><li><span style="font-size: 16px">快速插入Key - Value 记录。</span></li><li><span style="font-size: 16px">快速删除记录</span></li><li><span style="font-size: 16px">根据Key 修改value记录。</span></li><li><span style="font-size: 16px">遍历所有记录。</span></li></ol>
<p><strong><span style="color: rgb(0,0,255)"><span style="font-size: 18px">4。map的定义</span></span></strong></p>
<p><span style="font-size: 16px">使用map得包含map类所在的头文件：#include &lt;map&gt; //注意，<span style="color: rgb(255,0,0)">STL头文件没有扩展名.h</span></span></p>
<p><span style="font-size: 16px">map对象是模板类，需要关键字和存储对象两个模板参数，基本的定义模式如下：</span></p>
<p><br /><span style="font-size: 16px">std:map&lt;int, string&gt; personnel;</span></p>
<p><br /><span style="font-size: 16px">这样就定义了一个以int为键，值为string的map对象personnel。</span></p>
<p><span style="font-size: 16px">&nbsp;</span></p>
<p><span style="font-size: 16px">map中定义了以下三个类型：</span></p>
<ul><li><span style="font-size: 16px">map&lt;K, V&gt;::key_type : 表示map容器中，索引的类型；</span></li><li><span style="font-size: 16px">map&lt;K, V&gt;::mapped_type : 表示map容器中，键所关联的值的类型；</span></li><li><span style="font-size: 16px">map&lt;K, V&gt;::value_type : 表示一个pair类型，它的first元素具有const map&lt;K, V&gt;::key_type类型，而second元素则有map&lt;K, V&gt;::mapped_type类型</span></li></ul>
<p><span style="font-size: 16px">对迭代器进行解引用时，将获得一个引用，指向容器中一个value_type类型的值，对于map容器，其value_type是pair类型。</span></p>
<p><span style="font-size: 16px">&nbsp;</span></p>
<p><span style="font-size: 16px">为了使用方便，可以对模板类进行一下类型定义，</span></p>
<p style="margin-left: 11pt"><span style="font-size: 16px">typedef map&lt;int, CString&gt; UDT_MAP_INT_CSTRING;&nbsp;<br />UDT_MAP_INT_CSTRING enumMap;</span></p>
<p style="margin-left: 11pt"><span style="font-size: 16px">&nbsp;</span></p>
<p><strong><span style="color: rgb(0,0,255)"><span style="font-size: 18px">5。在map中添加元素</span></span></strong></p>
<p><span style="color: rgb(0,0,255)"></span>&nbsp;</p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">给map中添加元素主要有两种方法：</span></span></span></span></p>
<ul><li><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp; 使用下标操作符获取元素，然后给元素赋值</span></span></span></span></li></ul>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<em>&nbsp;<span style="color: rgb(0,0,255)">For example:</span></em></span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map&lt;string, int&gt; word_count; // 定义了一个空的map对象word_count;</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; word_count["Anna"] = 1;</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;程序说明：</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.在word_count中查找键为Anna的元素，没有找到.</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.将一个新的键-值对插入到word_count中，他的键是const string类型的对象，保存Anna。而他的值则采用直初始化，这就意味着在本例中指为0.</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.将这个新的键-值对插入到word_count中</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.读取新插入的元素，并将她的值赋为1.</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: rgb(255,0,0)">&nbsp;使用下标访问map与使用下标访问数组或者vector的行为是截然不同的：使用下标访问不存在的元素将导致在map容器中添加一个新的元素，他的键即为该下标值。</span></span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"></span></span></span></p>
<ul><li><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">使用map::insert方法添加元素</span></span></span></span></li></ul>
<p><span style="color: rgb(0,0,255)"></span><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; map容器提供的insert操作：</span></p>
<p><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1. map.insert(e) : e是一个用在map中的value_type类型的值。如果键不存在，则插入一个值为e.second的新元素；如果键在map中已经存在，那么不进行任何操作。该函数返回一个pair类型，该pair类型的first元素为当前插入e的map迭代器，pair的second类型是一个bool类型，表示是否插入了该元素。</span></p>
<p><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2. map.insert(beg, end) : beg和end是迭代器，返回void类型</span></p>
<p><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3. map.insert(iter, e) : e是value_type类型的值，如果e.first不在map中，则创建新元素，并以迭代器iter为起点搜索新元素存储的位置，返回一个迭代器，指向map中具有给定键的元素。</span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="color: rgb(0,0,0)"><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></span></p>
<p><span style="color: rgb(0,0,255)"></span><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; For example:</span></p>
<p><span style="font-size: 16px">&nbsp;</span></p>
<p><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; word_count.insert(map&lt;sting, int&gt;::value_type("Anna", 1));</span></p>
<p><span style="font-size: 16px">&nbsp;</span></p>
<p><strong></strong><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; word_count.insert(make_pair("Anna", 1));&nbsp;</span></p>
<p><span style="font-size: 16px">&nbsp;</span></p>
<p><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 返回值：如果该键已在容器中，则其关联的值保持不变，返回的bool值为true。</span></p>
<p><strong><span style="color: rgb(0,0,255)"><span style="font-size: 18px">6。查找并获取map中的元素</span></span></strong></p>
<p><span style="font-size: 16px">使用下标获取元素存在一个很危险的副作用：如果该键不在map容器中，那么下标操作会插入一个具有该键的新元素。</span></p>
<p><span style="font-size: 16px">因此引入map对象的查询操作：</span></p>
<p><span style="font-size: 16px">map.count(k) : 返回map中键k的出现次数(对于map而言，由于一个key对应一个value，因此返回只有0和1，因此可以用此函数判断k是否在map中)</span></p>
<p><span style="font-size: 16px">map.find(k) :&nbsp;&nbsp;返回map中指向键k的迭代器，如果不存在键k，则返回超出末端迭代器。</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 16px">For example:</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 16px">int occurs = 0;</span></p>
<p><span style="font-size: 16px">if(&nbsp;word_count.cout("foobar") )</span></p>
<p><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp; occurs = word_count["foobar"];</span></p>
<p>&nbsp;</p>
<p><span style="font-size: 16px">int occurs = 0;</span></p>
<p><span style="font-size: 16px">map&lt;string, int&gt;::iterator it = word_count.find("foobar");</span></p>
<p><span style="font-size: 16px">if(&nbsp;it != word_count.end()&nbsp;)</span></p>
<p><span style="font-size: 16px">&nbsp;&nbsp;&nbsp;&nbsp; occurs = it -&gt;second;</span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong><span style="color: rgb(0,0,255)"><span style="font-size: 18px">7。从map中删除元素</span></span></strong></p>
<p><span style="font-size: 16px">移除某个map中某个条目用<span style="color: rgb(247,150,70)">erase()</span></span></p>
<p><span style="font-size: 16px">该成员方法的定义如下:</span></p>
<ol><li><span style="font-size: 16px">iterator erase(iterator it); //通过一个条目对象删除</span></li><li><span style="font-size: 16px">iterator erase(iterator first, iterator last);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//删除一个范围</span></li><li><span style="font-size: 16px">size_type erase(const Key&amp; key); //通过关键字删除</span></li></ol>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><strong>8. map对象的迭代遍历</strong></span></span></p>
<p><span style="color: rgb(0,0,255)"><span style="font-size: 18px"><span style="font-size: 16px"><span style="color: rgb(0,0,0)">与其他容器一样，map同样提供begin和end运算，以生成用于遍历整个容器的迭代器。</span></span></span></span></p><img src ="http://www.cppblog.com/zhangtao0048/aggbug/187041.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-13 10:03 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/13/187041.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>float与double的范围和精度 </title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/10/186799.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Fri, 10 Aug 2012 01:05:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/10/186799.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/186799.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/10/186799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/186799.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/186799.html</trackback:ping><description><![CDATA[<div class="postTitle"><a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/BradMiller/archive/2010/11/25/1887945.html">float与double的范围和精度</a> </div>
<div id="cnblogs_post_body">
<p>1. 范围<br />&nbsp;&nbsp;float和double的范围是由指数的位数来决定的。<br />&nbsp;&nbsp;float的指数位有8位，而double的指数位有11位，分布如下：<br />&nbsp;&nbsp;float：<br />&nbsp;&nbsp;1bit（符号位） 8bits（指数位） 23bits（尾数位）<br />&nbsp;&nbsp;double：<br />&nbsp;&nbsp;1bit（符号位） 11bits（指数位） 52bits（尾数位）<br />&nbsp;&nbsp;于是，float的指数范围为-127~+128，而double的指数范围为-1023~+1024，并且指数位是按补码的形式来划分的。<br />&nbsp;&nbsp;其中负指数决定了浮点数所能表达的绝对值最小的非零数；而正指数决定了浮点数所能表达的绝对值最大的数，也即决定了浮点数的取值范围。<br />&nbsp;&nbsp;float的范围为-2^128 ~ +2^128，也即-3.40E+38 ~ +3.40E+38；double的范围为-2^1024 ~ +2^1024，也即-1.79E+308 ~ +1.79E+308。</p>
<p>2. &nbsp;精度<br />&nbsp;&nbsp;float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的，其整数部分始终是一个隐含着的&#8220;1&#8221;，由于它是不变的，故不能对精度造成影响。<br />&nbsp;&nbsp;float：2^23 = 8388608，一共七位，这意味着最多能有7位有效数字，但绝对能保证的为6位，也即float的精度为6~7位有效数字；<br />&nbsp;&nbsp;double：2^52 = 4503599627370496，一共16位，同理，double的精度为15~16位。</p>
<p>3.Oracle中Number类型</p>
<p>在Oracle中Number类型可以用来存储0，正负定点或者浮点数，可表示的数据范围在<br />1.0 * 10(-130) &#8212;&#8212; 9.9...9 * 10(125) {38个9后边带88个0}<br />的数字，当Oracle中的数学表达式的值&gt;=1.0*10(126)时，Oracle就会报错。<br />Number的数据声明如下：<br />表示&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作用&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 说明<br />Number(p, s)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 声明一个定点数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p(precision)为精度，s(scale)表示小数点右边的数字个数，精度最大值为38，<br />Number(p)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 声明一个整数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 相当于Number(p, 0)<br />Number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 声明一个浮点数&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其精度为38，要注意的是scale的值没有应用，也就是说scale的指不能简单的理解为0，或者其他的数。</p>
<p>定点数的精度(p)和刻度(s)遵循以下规则：<br />?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个数的整数部分的长度 &gt; p-s 时，Oracle就会报错<br />?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当一个数的小数部分的长度 &gt; s 时，Oracle就会舍入。<br />?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s(scale)为负数时，Oracle就对小数点左边的s个数字进行舍入。<br />?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当s &gt; p 时, p表示小数点后第s位向左最多可以有多少位数字，如果大于p则Oracle报错，小数点后s位向右的数字被舍入 </p>
<p>4.验证<br />create or replace function&nbsp; func_test(p_type number) return number<br />is<br />/*<br />&nbsp;功能：基于警度图数据同步<br />*/<br />&nbsp;l_cnt number;<br />begin<br />&nbsp;select p_type into l_cnt from dual;<br />&nbsp;return l_cnt;<br />end func_test;<br />/<br />show err;</p>
<p>5.结论</p>
<p>number 的总长度是40位，其中可能包括：小数点，负号位。</p>
<p>select to_char(func_test(-987.1234567891234567891234567891234567891234)) from dual;<br />-987.12345678912345678912345678912345679&nbsp;&nbsp; //包括小数点及负号位共40位<br />select to_char(func_test(9876.1234567891234567891234567891234567891234)) from dual;<br />9876.12345678912345678912345678912345679&nbsp;&nbsp; //4位整数+小数点+35位小数=40位<br />select to_char(func_test(987.1234567891234567891234567891234567891234)) from dual;<br />987.123456789123456789123456789123456789&nbsp;&nbsp; //3位整数+小数点+36位小数=40位<br />select to_char(func_test(1234567891234567891234567891234567891234)) from dual;<br />1234567891234567891234567891234567891234&nbsp;&nbsp; //40位整数<br />select to_char(func_test(12345678912345678912345678912345678912345)) from dual;<br />1.2345678912345678912345678912345679E+40&nbsp;&nbsp; //41位时精度发生丢失<br />1.2345678912345678912345678912345679&#215;10^40 即 12345678912345678912345678912345678900000</p></div><img src ="http://www.cppblog.com/zhangtao0048/aggbug/186799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-10 09:05 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/10/186799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>文件结束标志符</title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186762.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Thu, 09 Aug 2012 11:38:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186762.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/186762.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186762.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/186762.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/186762.html</trackback:ping><description><![CDATA[cin.eof()返回流结束位，即按键 ctrl 和 z 键<br />如：<br />char gc;<br />while(!cin.eof()) //直至按ctrl+z键退出！<br />{<br />&nbsp; cin&gt;&gt;gc;<br />&nbsp; cout&lt;&lt;gc&lt;&lt;endl; <br />} <br /><br />上面的是按ctrl+z退出<br />要自动退出可按下面的写：<br />char gc;<br />istream fin(....);<br />while(!fin.eof()) //读完文件自己退出！<br />{<br />&nbsp; cin&gt;&gt;gc;<br />&nbsp; cout&lt;&lt;gc&lt;&lt;endl; <br />} <br /><br /><br /><img src ="http://www.cppblog.com/zhangtao0048/aggbug/186762.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-09 19:38 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186762.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>这是一个linux常见命令的列表</title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186754.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Thu, 09 Aug 2012 09:25:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186754.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/186754.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186754.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/186754.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/186754.html</trackback:ping><description><![CDATA[那些有&#8226; 标记的条目，你可以直接拷贝到终端上而不需要任何修改，因此你最好开一个终端边读边<a href="http://www.pixelbeat.org/docs/xclipboard.html">剪切&amp;拷贝</a>。<br />所有的命令已在Fedora和Ubuntu下做了测试<br /><br />
<table class="pixelbeat">
<tbody>
<tr id="misc" class="pbtitle">
<td colspan="2">命令</td>
<td>描述</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">apropos whatis</td>
<td>显示和word相关的命令。 参见<a href="http://www.pixelbeat.org/scripts/threadsafe">线程安全</a></td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/lkdb/less.html">man</a> -t man | ps2pdf - &gt; man.pdf</td>
<td>生成一个PDF格式的帮助文件</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">which command</td>
<td>显示命令的完整路径名</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">time command</td>
<td>计算命令运行的时间</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">time cat</td>
<td>开始计时. Ctrl-d停止。参见<a href="http://www.pixelbeat.org/scripts/sw">sw</a></td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">nice <a href="http://www.pixelbeat.org/lkdb/info.html">info</a></td>
<td>运行一个低优先级命令（这里是info）</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">renice 19 -p $$</td>
<td>使脚本运行于低优先级。用于非交互任务。</td></tr>
<tr id="dirs" class="pbtitle">
<td colspan="3">目录操作</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">cd -</td>
<td>回到前一目录</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">cd</td>
<td>回到用户目录</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">(cd dir &amp;&amp; command)</td>
<td>进入目录dir，执行命令command然后回到当前目录</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">pushd <strong>.</strong></td>
<td>将当前目录压入栈，以后你可以使用popd回到此目录</td></tr>
<tr id="file_search" class="pbtitle">
<td colspan="3">文件搜索</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/settings/.bashrc">alias</a> l='ls -l --color=auto'</td>
<td>单字符文件列表命令</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ls -lrt</td>
<td>按日期显示文件. 参见<a href="http://www.pixelbeat.org/scripts/newest">newest</a></td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ls /usr/bin | pr -T9 -W$COLUMNS</td>
<td>在当前终端宽度上打印9列输出</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">find -name '*.[ch]' | xargs grep -E 'expr'</td>
<td>在当前目录及其子目录下所有.c和.h文件中寻找'expr'. 参见<a href="http://www.pixelbeat.org/scripts/findrepo">findrepo</a></td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">find -type f -print0 | xargs -r0 grep -F 'example'</td>
<td>在当前目录及其子目录中的常规文件中查找字符串'example'</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">find -maxdepth 1 -type f | xargs grep -F 'example'</td>
<td>在当前目录下查找字符串'example'</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">find -maxdepth 1 -type d | while <a href="http://www.pixelbeat.org/programming/readline/">read</a> dir; do echo $dir; echo cmd2; done</td>
<td>对每一个找到的文件执行多个命令(使用while循环)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">find -type f ! -perm -444</td>
<td>寻找所有不可读的文件(对网站有用)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">find -type d ! -perm -111</td>
<td>寻找不可访问的目录(对网站有用)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">locate -r 'file[^/]*\.txt'</td>
<td>使用locate 查找所有符合*file*.txt的文件</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">look reference</td>
<td>在（有序）字典中快速查找</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">grep <a href="http://www.pixelbeat.org/settings/.bashrc">--color</a> reference /usr/share/dict/words</td>
<td>使字典中匹配的正则表达式高亮</td></tr>
<tr id="archives" class="pbtitle">
<td colspan="3">归档 and compression</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">gpg -c file</td>
<td>文件加密</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">gpg file.gpg</td>
<td>文件解密</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">tar -c dir/ | bzip2 &gt; dir.tar.bz2</td>
<td>将目录dir/压缩打包</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">bzip2 -dc dir.tar.bz2 | tar -x</td>
<td>展开压缩包 (对tar.gz文件使用gzip而不是bzip2)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">tar -c dir/ | gzip | gpg -c | ssh user@remote 'dd of=dir.tar.gz.gpg'</td>
<td>目录dir/压缩打包并放到远程机器上</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">find dir/ -name '*.txt' | tar -c --files-from=- | bzip2 &gt; dir_txt.tar.bz2</td>
<td>将目录dir/及其子目录下所有.txt文件打包</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">find dir/ -name '*.txt' | xargs cp -a --target-directory=dir_txt/ --parents</td>
<td>将目录dir/及其子目录下所有.txt按照目录结构拷贝到dir_txt/</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">( tar -c /dir/to/copy ) | ( cd /where/to/ &amp;&amp; tar -x -p )</td>
<td>拷贝目录copy/到目录/where/to/并保持文件属性</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">( cd /dir/to/copy &amp;&amp; tar -c <strong>.</strong> ) | ( cd /where/to/ &amp;&amp; tar -x -p )</td>
<td>拷贝目录copy/下的所有文件到目录/where/to/并保持文件属性</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">( tar -c /dir/to/copy ) | ssh -C user@remote 'cd /where/to/ &amp;&amp; tar -x -p' </td>
<td>拷贝目录copy/到远程目录/where/to/并保持文件属性</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">dd bs=1M if=/dev/sda | gzip | ssh user@remote 'dd of=sda.gz'</td>
<td>将整个硬盘备份到远程机器上</td></tr>
<tr id="rsync" class="pbtitle">
<td colspan="3">rsync (使用 --dry-run选项进行测试)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">rsync -P rsync://rsync.server.com/path/to/file file</td>
<td>只获取diffs.当下载有问题时可以作多次</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">rsync --bwlimit=1000 fromfile tofile</td>
<td>有速度限制的本地拷贝，对I/O有利</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">rsync -az -e ssh --delete ~/public_html/ remote.com:'~/public_html'</td>
<td>镜像网站(使用压缩和加密)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">rsync -auz -e ssh remote:/dir/ <strong>.</strong> &amp;&amp; rsync -auz -e ssh <strong>.</strong> remote:/dir/</td>
<td>同步当前目录和远程目录</td></tr>
<tr id="ssh" class="pbtitle">
<td colspan="3"><strong>ssh</strong> (安全 Shell)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">ssh $USER@$HOST command</td>
<td>在$Host主机上以$User用户运行命令(默认命令为Shell)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ssh -f -Y $USER@$HOSTNAME xeyes</td>
<td>在名为$HOSTNAME的主机上以$USER用户运行GUI命令</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">scp -p -r $USER@$HOST: file dir/</td>
<td>拷贝到$HOST主机$USER'用户的目录下</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">ssh -g -L 8080:localhost:80 root@$HOST</td>
<td>由本地主机的8080端口转发到$HOST主机的80端口</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">ssh -R 1434:imap:143 root@$HOST</td>
<td>由主机的1434端口转发到imap的143端口</td></tr>
<tr id="wget" class="pbtitle">
<td colspan="3">wget (多用途下载工具)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">(cd cmdline &amp;&amp; wget -nd -pHEKk http://www.pixelbeat.org/cmdline.html)</td>
<td>在当前目录中下载指定网页及其相关的文件使其可完全浏览</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">wget -c http://www.example.com/large.file</td>
<td>继续上次未完的下载</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">wget -r -nd -np -l1 -A '*.jpg' http://www.example.com/</td>
<td>批量下载文件到当前目录中</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">wget ftp://remote/file[1-9].iso/</td>
<td>下载FTP站上的整个目录</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">wget -q -O- http://www.pixelbeat.org/timeline.html | grep 'a href' | head</td>
<td>直接处理输出</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">echo 'wget url' | at 01:00</td>
<td>在下午一点钟下载指定文件到当前目录</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">wget --limit-rate=20k url</td>
<td>限制下载速度(这里限制到20<a href="http://www.pixelbeat.org/speeds.html">KB/s</a>)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">wget -nv --spider --force-html -i bookmarks.html</td>
<td>检查文件中的链接是否存在</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">wget --mirror http://www.example.com/</td>
<td>更新网站的本地拷贝(可以方便地用于cron)</td></tr>
<tr id="net" class="pbtitle">
<td colspan="3">网络(ifconfig, route, mii-tool, nslookup 命令皆已过时)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw"><acronym title="usually in /sbin/">ethtool</acronym> eth0</td>
<td>显示网卡eth0的状态</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">ethtool --change eth0 autoneg off speed 100 duplex full</td>
<td>手动设制网卡速度</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw"><acronym title="usually in /sbin/">iwconfig</acronym> eth1</td>
<td>显示无线网卡eth1的状态</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">iwconfig eth1 rate 1Mb/s fixed</td>
<td>手动设制无线网卡速度</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><acronym title="usually in /sbin/">iwlist</acronym> scan</td>
<td>显示无线网络列表</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><acronym title="通常在目录/sbin/中">ip</acronym> link show</td>
<td>显示interface列表</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">ip link set dev eth0 name wan</td>
<td>重命名eth0为wan</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">ip link set dev eth0 up</td>
<td>启动interface eth0(或关闭)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ip addr show</td>
<td>显示网卡的IP地址</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">ip addr add 1.2.3.4/24 brd + dev eth0</td>
<td>添加ip和掩码(255.255.255.0)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ip route show</td>
<td>显示路由列表</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">ip route add default via 1.2.3.254</td>
<td>设置默认网关1.2.3.254</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><acronym title="通常在目录/sbin/下">tc</acronym> qdisc add dev lo root handle 1:0 netem delay 20msec</td>
<td>增加20ms传输时间到loopback设备(调试用)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">tc qdisc del dev lo root</td>
<td>移除上面添加的传输时间</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">host pixelbeat.org</td>
<td>查寻主机的DNS IP地址</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">hostname -i</td>
<td>查寻本地主机的IP地址(同等于host `hostname`)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">whois pixelbeat.org</td>
<td>查寻某主机或莫IP地址的whois信息</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">netstat -tupl</td>
<td>列出系统中的internet服务</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">netstat -tup</td>
<td>列出活跃的连接</td></tr>
<tr id="windows" class="pbtitle">
<td colspan="3">windows networking (samba提供所有windows相关的网络支持)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">smbtree</td>
<td>寻找一个windows主机. 参见findsmb</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">nmblookup -A 1.2.3.4</td>
<td>寻找一个指定ip的windows (netbios)名</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">smbclient -L windows_box</td>
<td>显示在windows主机或samba服务器上的所有共享</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">mount -t smbfs -o fmask=666,guest //windows_box/share /mnt/share</td>
<td>挂载一个windows共享</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">echo 'message' | smbclient -M windows_box</td>
<td>发送一个弹出信息到windows主机(XP sp2默认关闭此功能)</td></tr>
<tr id="text" class="pbtitle">
<td colspan="3">文本操作 (sed使用标准输入和标准输出，如果想要编辑文件，则需添加<em>&lt;oldfile &gt;newfile</em>)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed 's/string1/string2/g'</td>
<td>使用string2替换string1</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed 's/\(.*\)1/\12/g'</td>
<td>将任何以1结尾的字符串替换为以2结尾的字符串</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed '/ *#/d; /^ *$/d'</td>
<td>删除注释和空白行</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed ':a; /\\$/N; s/\\\n//; ta'</td>
<td>连接结尾有\的行和其下一行</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed 's/[ \t]*$//'</td>
<td>删除每行后的空白</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed 's/\([\\`\\"$\\\\]\)/\\\1/g'</td>
<td>将所有转义字符之前加上\</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">seq 10 | sed "s/^/&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/; s/ *\(.\{7,\}\)/\1/"</td>
<td>向右排N(任意数)列</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed -n '1000p;<acronym title="quit ASAP">1000q</acronym>'</td>
<td>输出第一千行</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed -n '10,20p;<acronym title="quit ASAP">20q</acronym>'</td>
<td>输出第10-20行</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sed -n 's/.*&lt;title&gt;\(.*\)&lt;\/title&gt;.*/\1/ip;<acronym title="quit after match">T;q</acronym>'</td>
<td>输出HTML文件的&lt;title&gt;&lt;/title&gt;字段中的 内容</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sort -t. -k1,1n -k2,2n -k3,3n -k4,4n</td>
<td>排序IPV4地址</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo 'Test' | tr '[:lower:]' '[:upper:]'</td>
<td>转换成大写</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">tr -dc '[:print:]' &lt; /dev/urandom</td>
<td>过滤掉不能打印的字符</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">history | wc -l</td>
<td>计算指定单词出现的次数</td></tr>
<tr id="sets" class="pbtitle">
<td colspan="3">集合操作 (如果是英文文本的话<a href="http://www.pixelbeat.org/docs/env.html">export LANG=C</a>可以提高速度)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sort file1 file2 | uniq</td>
<td>两个未排序文件的<acronym title="在file1或file2中">并集</acronym></td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sort file1 file2 | uniq -d</td>
<td>两个未排序文件的<acronym title="在file1和file2中">交集</acronym> </td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sort file1 file1 file2 | uniq -u</td>
<td>两个未排序文件的<acronym title="在file2中但不在file1中">差 集</acronym> </td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">sort file1 file2 | uniq -u</td>
<td>两个未排序文件的<acronym title="只在一个文件中">对称差集</acronym></td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">join <acronym title="process whole line (assuming no NUL characters present)">-t'\0'</acronym> -a1 -a2 file1 file2</td>
<td>两个有序文件的并集</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">join -t'\0' file1 file2</td>
<td>两个有序文件的交集</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">join -t'\0' -v2 file1 file2</td>
<td>两个有序文件的差集</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">join -t'\0' -v1 -v2 file1 file2</td>
<td>两个有序文件的对称差集</td></tr>
<tr id="math" class="pbtitle">
<td colspan="3">数学</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo '(1 + sqrt(5))/2' | bc -l</td>
<td>方便的计算器(计算 &#966;)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo 'pad=20; min=64; (100*10^6)/((pad+min)*8)' | bc</td>
<td>更复杂地计算，这里计算了最大的FastE包率</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo 'pad=20; min=64; print (100E6)/((pad+min)*8)' | python</td>
<td>Python处理数值的科学表示法</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo 'pad=20; plot [64:1518] (100*10**6)/((pad+x)*8)' | gnuplot -persist</td>
<td>显示FastE包率相对于包大小的图形</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo 'obase=16; ibase=10; 64206' | bc</td>
<td>进制转换(十进制到十六进制)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo $((0x2dec))</td>
<td>进制转换(十六进制到十进制)((shell数学扩展))</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">units -t '100m/<a href="http://www.pixelbeat.org/misc/usain_bolt.html">9.58s</a>' 'miles/hour'</td>
<td>单位转换(公尺到英尺)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">units -t '500GB' 'GiB'</td>
<td>单位转换(<acronym title="powers of 10">SI</acronym> 到<acronym title="powers of 2">IEC</acronym> 前缀)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">units -t '1 googol'</td>
<td>定义查找</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">seq 100 | (tr '\n' +; echo 0) | bc</td>
<td>加N(任意数)列. 参见 <a href="http://www.pixelbeat.org/scripts/add">add</a> and <a href="http://www.pixelbeat.org/scripts/funcpy">funcpy</a></td></tr>
<tr id="dates" class="pbtitle">
<td colspan="3">日历</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">cal -3</td>
<td>显示一日历</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">cal 9 1752</td>
<td>显示指定月，年的日历</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">date -d fri</td>
<td>这个星期五是几号. 参见<a href="http://www.pixelbeat.org/scripts/day">day</a></td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">date --date='25 Dec' +%A</td>
<td>今年的圣诞节是星期几</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">date --date '1970-01-01 UTC 2147483647 seconds'</td>
<td>将一相对于1970-01-01 00：00的秒数转换成时间</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">TZ=':America/Los_Angeles' date</td>
<td>显示当前的美国西岸时间(使用tzselect寻找时区)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">echo "mail -s 'get the train' P@draigBrady.com &lt; /dev/null" | at 17:45</td>
<td>在指定的时间发送邮件</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo "DISPLAY=$DISPLAY xmessage cooker" | at "NOW + 30 minutes"</td>
<td>在给定的时间弹出对话框</td></tr>
<tr id="locale" class="pbtitle">
<td colspan="3">locales</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">printf "%'d\n" 1234</td>
<td>根据locale输出正确的数字分隔</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">BLOCK_SIZE=\'1 ls -l</td>
<td>用ls命令作类适于locale()文件分组</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo "I live in `locale territory`"</td>
<td>从locale数据库中展开信息</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">LANG=en_IE.utf8 locale int_prefix</td>
<td>查找指定地区的locale信息。参见<a href="http://www.pixelbeat.org/scripts/ccodes">ccodes</a></td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">locale | cut -d= -f1 | xargs locale -kc | less</td>
<td>显示在locale数据库中的所有字段</td></tr>
<tr id="recode" class="pbtitle">
<td colspan="3">recode (iconv, dos2unix, unix2dos 已经过时了)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">recode -l | less</td>
<td>显示所有有效的字符集及其别名</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">recode windows-1252.. file_to_change.txt</td>
<td>转换Windows下的ansi文件到当前的字符集(自动进行回车换行符的转换)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">recode utf-8/CRLF.. file_to_change.txt</td>
<td>转换Windows下的ansi文件到当前的字符集</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">recode iso-8859-15..utf8 file_to_change.txt</td>
<td>转换Latin9（西欧）字符集文件到utf8</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">recode ../b64 &lt; file.txt &gt; file.b64</td>
<td>Base64编码</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">recode /qp.. &lt; file.txt &gt; file.qp</td>
<td>Quoted-printable格式解码</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">recode ..HTML &lt; file.txt &gt; file.html</td>
<td>将文本文件转换成HTML</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">recode -lf windows-1252 | grep euro</td>
<td>在<a href="http://www.pixelbeat.org/docs/utf8.html">字符表</a>中查找欧元符号</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo -n 0x80 | recode latin-9/x1..dump</td>
<td>显示字符在latin-9中的字符映射</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo -n 0x20AC | recode ucs-2/x2..latin-9/x</td>
<td>显示latin-9编码</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">echo -n 0x20AC | recode ucs-2/x2..utf-8/x</td>
<td>显示utf-8编码</td></tr>
<tr id="CDs" class="pbtitle">
<td colspan="3">光盘</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">gzip &lt; /dev/cdrom &gt; cdrom.iso.gz</td>
<td>保存光盘拷贝</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">mkisofs -V LABEL -r dir | gzip &gt; cdrom.iso.gz</td>
<td>建立目录dir的光盘镜像</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">mount -o loop cdrom.iso /mnt/dir</td>
<td>将光盘镜像挂载到 /mnt/dir (只读)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">cdrecord -v dev=/dev/cdrom blank=fast</td>
<td>清空一张CDRW</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">gzip -dc cdrom.iso.gz | cdrecord -v dev=/dev/cdrom -</td>
<td>烧录光盘镜像 (使用 dev=ATAPI -scanbus 来确认该使用的 dev)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">cdparanoia -B</td>
<td>在当前目录下将光盘音轨转录成wav文件</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">cdrecord -v dev=/dev/cdrom -audio *.wav</td>
<td>将当前目录下的wav文件烧成音乐光盘 (参见cdrdao)</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">oggenc --tracknum='track' track.cdda.wav -o 'track.ogg'</td>
<td>将wav文件转换成ogg格式</td></tr>
<tr id="disk_space" class="pbtitle">
<td colspan="3">磁盘空间 (参见<a href="http://www.pixelbeat.org/fslint/">FSlint</a>)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ls -lSr</td>
<td>按文件大小降序显示文件</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">du -s * | sort -k1,1rn | head</td>
<td>显示当前目录下占用空间最大的一批文件. 参见<a href="http://www.pixelbeat.org/scripts/dutop">dutop</a></td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">df -h</td>
<td>显示空余的磁盘空间</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">df -i</td>
<td>显示空余的inode</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><acronym title="通常在目录/sbin/中">fdisk</acronym> -l</td>
<td>显示磁盘分区大小和类型（在root下执行）</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/docs/packaging.html">rpm</a> -q -a --qf '%10{SIZE}\t%{NAME}\n' | sort -k1,1n</td>
<td>显示所有在rpm发布版上安装的<a href="http://www.pixelbeat.org/docs/packaging.html">包</a>，并以包字节大小为序</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/docs/packaging.html">dpkg</a>-query -W -f='${Installed-Size;10}\t${Package}\n' | sort -k1,1n</td>
<td>显示所有在deb发布版上安装的<a href="http://www.pixelbeat.org/docs/packaging.html">包</a>，并以KB包大小为序</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">dd bs=1 seek=2TB if=/dev/null of=ext3.test</td>
<td>建立一个大的测试文件（不占用空间）. 参见<a href="http://www.pixelbeat.org/scripts/truncate">truncate</a></td></tr>
<tr id="monitor" class="pbtitle">
<td colspan="3">监视/调试</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">tail -f /var/log/messages</td>
<td><a href="http://www.pixelbeat.org/docs/web/access_log/monitoring.html">监视Messages</a>日志文件</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">strace -c ls &gt;/dev/null</td>
<td>总结/剖析命令进行的系统调用</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">strace -f -e open ls &gt;/dev/null</td>
<td>显示命令进行的系统调用</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ltrace -f -e getenv ls &gt;/dev/null</td>
<td>显示命令调用的库函数</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><acronym title="通常在目录/usr/sbin/中">lsof</acronym> -p <acronym title="process id of current shell">$$</acronym></td>
<td>显示当前进程打开的文件</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">lsof ~</td>
<td>显示打开用户目录的进程</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">tcpdump not port 22</td>
<td>显示除了ssh外的网络交通. 参见<a href="http://www.pixelbeat.org/scripts/tcpdump_not_me">tcpdump_not_me</a></td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ps -e -o pid,args --forest</td>
<td>以树状结构显示进程</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ps -e -o pcpu,cpu,nice,state,cputime,args --sort pcpu | sed '/^ 0.0 /d'</td>
<td>以CPU占用率为序显示进程</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ps -e -orss=,args= | sort -b -k1,1n | pr -TW$COLUMNS</td>
<td>以内存使用量为序显示进程. 参见<a href="http://www.pixelbeat.org/scripts/ps_mem.py">ps_mem.py</a></td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ps -C firefox-bin -L -o pid,tid,pcpu,state</td>
<td>显示指定进程的所有线程信息</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">ps -p 1,2</td>
<td>显示指定进程ID的进程信息</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">last reboot</td>
<td>显示系统重启记录</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">free -m</td>
<td>显示(剩余的)内存总量(-m以MB为单位显示)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">watch -n.1 'cat /proc/interrupts'</td>
<td>监测文件/proc/interrupts的变化</td></tr>
<tr id="sysinfo" class="pbtitle">
<td colspan="3">系统信息 (参见<a href="http://www.pixelbeat.org/scripts/sysinfo">sysinfo</a>)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">uname -a</td>
<td>查看内核/操作系统/CPU信息</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">head -n1 /etc/issue</td>
<td>查看操作系统版本</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">cat /proc/partitions</td>
<td>显示所有在系统中注册的分区</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">grep MemTotal /proc/meminfo</td>
<td>显示系统可见的内存总量</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">grep "model name" /proc/cpuinfo</td>
<td>显示CPU信息</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><acronym title="通常在目录/sbin/中">lspci</acronym> -tv</td>
<td>显示PCI信息</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><acronym title="通常在目录/sbin/中">lsusb</acronym> -tv</td>
<td>显示USB信息</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">mount | column -t</td>
<td>显示所有挂载的文件系统并对齐输出</td></tr>
<tr>
<td>#</td>
<td class="nw">dmidecode -q | less</td>
<td>显示SMBIOS/DMI 信息</td></tr>
<tr>
<td>#</td>
<td class="nw">smartctl -A /dev/sda | grep Power_On_Hours</td>
<td>系统开机的总体时间</td></tr>
<tr>
<td>#</td>
<td class="nw">hdparm -i /dev/sda</td>
<td>显示关于磁盘sda的信息</td></tr>
<tr>
<td>#</td>
<td class="nw">hdparm -tT /dev/sda</td>
<td>检测磁盘sda的读取速度</td></tr>
<tr>
<td>#</td>
<td class="nw">badblocks -s /dev/sda</td>
<td>检测磁盘sda上所有的坏扇区</td></tr>
<tr id="interactive" class="pbtitle">
<td colspan="3">交互 (参见<a href="http://www.pixelbeat.org/lkdb/">linux keyboard shortcut database</a>)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/lkdb/readline.html">readline</a></td>
<td>Line editor used by bash, python, bc, gnuplot, ...</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/lkdb/screen.html">screen</a></td>
<td>多窗口的虚拟终端, ...</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/lkdb/mc.html">mc</a></td>
<td>强大的文件管理器，可以浏览rpm, tar, ftp, ssh, ...</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/docs/web/access_log/analyzing.html">gnuplot</a></td>
<td>交互式并可进行脚本编程的画图工具</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">links</td>
<td>网页浏览器</td></tr>
<tr id="misc" class="pbtitle">
<td colspan="3">miscellaneous</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/settings/.bashrc">alias</a> hd='od -Ax -tx1z -v'</td>
<td>方便的十六进制输出。 (用法举例: &#8226; hd /proc/self/cmdline | less)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw"><a href="http://www.pixelbeat.org/settings/.bashrc">alias</a> realpath='readlink -f'</td>
<td>显示符号链接指向的真实路径((用法举例: &#8226; realpath ~/../$USER)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">set | grep $USER</td>
<td>在当前<a href="http://www.pixelbeat.org/docs/env.html">环境</a>中查找</td></tr>
<tr>
<td>&nbsp;</td>
<td class="nw">touch -c -t 0304050607 file</td>
<td>改变文件的时间标签 (YYMMDDhhmm)</td></tr>
<tr>
<td>&#8226;</td>
<td class="nw">python -m SimpleHTTPServer</td>
<td>Serve current directory tree at http://$HOSTNAME:8000/</td></tr></tbody></table><img src ="http://www.cppblog.com/zhangtao0048/aggbug/186754.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-09 17:25 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186754.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个类的对象作为另一个类的数据成员</title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186742.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Thu, 09 Aug 2012 07:25:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186742.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/186742.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/186742.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/186742.html</trackback:ping><description><![CDATA[<h2 class="title content-title">一个类的对象作为另一个类的数据成员</h2>
<div id="content" class="content text-content clearfix">
<p>一个类的对象作为另一个类的数据成员<br />如果一个类A的对象作为另一个类B的数据成员，则在类B的对象创建过程中，调用其构造函数的过程中，数据成员（类A的对象）会自动调用类A的构造函数。<br />但应注意：如果类A的构造函数为有参函数时，则在程序中必须在类B的构造函数的括号后面加一&#8220;：&#8221;和被调用的类A的构造函数，且调用类A的构造函数时的实参值必须来自类B的形参表中的形参。这种方法称为初始化表的方式调用构造函数。如：以上面定义的类X为例，在对类X的对象进行初始化时，必须首先初始化其中的子对象，即必须首先调用这些子对象的构造函数。因此，类X的构造函数的定义格式应为：<br />X：：X（参数表0）：成员1（参数表1），成员2（参数表2），&#8230;，成员n(参数表n)<br />{ &#8230;&#8230;}<br />其中，参数表1提供初始化成员1所需的参数，参数表2提供初始化成员2所需的参数，依此类推。并且这几个参数表的中的参数均来自参数表0，另外，初始化X的非对象成员所需的参数，也由参数表0提供。<br />在构造新类的对象过程中，系统首先调用其子对象的构造函数，初始化子对象；然后才执行类X自己的构造函数，初始化类中的非对象成员。对于同一类中的不同子对象，系统按照它们在类中的说明顺序调用相应的构造函数进行初始化，而不是按照初始化表的顺序。</p>
<p>试分析以下程序的执行结果:<br />#include &lt;iostream.h&gt;<br />#include &lt;string.h&gt;<br />class Student<br />{ public:<br />&nbsp;&nbsp; Student(char *pName="No name")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { cout&lt;&lt;"构造新同学："&lt;&lt;pName&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strncpy(name,pName,sizeof(name));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name[sizeof(name)-1]='\0';&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;Student(Student &amp;s)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { cout&lt;&lt;"构造copy of "&lt;&lt;s.name&lt;&lt;endl;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcpy(name, " copy of ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; strcat(name,s.name);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />~Student()<br />&nbsp;{ cout&lt;&lt;"析构 "&lt;&lt;name&lt;&lt;endl; }<br />&nbsp;&nbsp;&nbsp; protected:<br />&nbsp;&nbsp;&nbsp; char name[40];&nbsp; };<br />class Tutor<br />{ public: <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tutor(Student &amp;s):student(s)//此为初始化表，调用<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Student的拷贝构造函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { cout&lt;&lt;"构造指导教师 \n";&nbsp; }<br />&nbsp;&nbsp; protected:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Student student;<br />&nbsp;};<br />void main()<br />{&nbsp; Student st1;&nbsp;&nbsp; //此处调用Student的构造函数Student(char&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *pName="No name")<br />&nbsp;&nbsp; Student st2("zhang"); //同上<br />&nbsp;&nbsp; Tutor tutor(st2); //此处调用Tutor的构造函数Tutor(Student &amp;s)<br />&nbsp;&nbsp; //在构造tutor对象的过程中，用初始化表调用<br />&nbsp;&nbsp; //Student类的拷贝构造函数Student(Student &amp;s)<br />}<br />执行结果如下：<br />构造新同学：No name<br />构造新同学：zhang<br />构造copy of zhang<br />构造指导教师<br />析构&nbsp; copy of zhang<br />析构 zhang<br />析构 No name</p></div><img src ="http://www.cppblog.com/zhangtao0048/aggbug/186742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-09 15:25 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++中string---&gt;char[] / char[]---&gt;string</title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186723.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Thu, 09 Aug 2012 02:12:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186723.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/186723.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186723.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/186723.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/186723.html</trackback:ping><description><![CDATA[<font color="#000000" face="Verdana">string---&gt;char[]<br /></font><br />string str = "abcd";<br />char *ch = str.c_str();<br /><br /><font color="#000000" face="Verdana">char[]---&gt;string</font><br /><br />#include &lt;iostream&gt;<br />#include &lt;string&gt;<br />using namespace std;<br />int main(void)<br />{<br />char str[]="hello";<br />//方法1<br />string ss1(str);<br />//方法2<br />string ss2;<br />ss2=str;<br />//方法3<br />string ss3;<br />ss3.insert(0,str);<br />cout&lt;&lt;ss1&lt;&lt;endl&lt;&lt;ss2&lt;&lt;endl&lt;&lt;ss3&lt;&lt;endl;<br />return 0;<br />} <br />语法: <br />const char *c_str();<br />c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同. <br />这是为了与c语言兼容，在c语言中没有string类型，故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。<br />注意：一定要使用strcpy()函数 等来操作方法c_str()返回的指针 <br />比如：最好不要这样: <br />char* c; <br />string s="1234"; <br />c = s.c_str(); //c最后指向的内容是垃圾，因为s对象被析构，其内容被处理<br /><br />应该这样用： <br />char c[20]; <br />string s="1234"; <br />strcpy(c,s.c_str()); <br />这样才不会出错，c_str()返回的是一个临时指针，不能对其进行操作<br /><br />再举个例子<br />c_str() 以 char* 形式传回 string 内含字符串<br />如果一个函数要求char*参数，可以使用c_str()方法： <br />string s = "Hello World!";<br />printf("%s", s.c_str()); //输出 "Hello World!"<br /><br /><img src ="http://www.cppblog.com/zhangtao0048/aggbug/186723.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-09 10:12 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/09/186723.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>C++数据结构之单链表</title><link>http://www.cppblog.com/zhangtao0048/archive/2012/08/02/186032.html</link><dc:creator>章涛</dc:creator><author>章涛</author><pubDate>Thu, 02 Aug 2012 06:58:00 GMT</pubDate><guid>http://www.cppblog.com/zhangtao0048/archive/2012/08/02/186032.html</guid><wfw:comment>http://www.cppblog.com/zhangtao0048/comments/186032.html</wfw:comment><comments>http://www.cppblog.com/zhangtao0048/archive/2012/08/02/186032.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/zhangtao0048/comments/commentRss/186032.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/zhangtao0048/services/trackbacks/186032.html</trackback:ping><description><![CDATA[<p class="f14 green">线性表包含数据域和指针域。单链表用一组地址任意的存储单元存放线性表中的数据元素。<br /></p>
<p>线性表包含 数据域和指针域 其中，data存储数据本身的值，next存储后继元素的地址 下面的图表示的是一个数据节点</p>
<p align="center"><img class="fit-image" alt="" src="http://images.51cto.com/files/uploadimg/20120202/1048520.jpg" /></p>
<p class="pictext" align="center">单链表的结构示意图（包括空的单链表）：</p>
<p align="center"><img class="fit-image" alt="" src="http://images.51cto.com/files/uploadimg/20120202/1048521.jpg" width="498" /></p>
<p class="pictext" align="center">单链表的节点类:</p><pre><ol class="dp-c"><li class="alt"><span>　template&lt;classT&gt; &nbsp;</span></li><li><span>classNode &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span></span><span class="keyword">public</span><span>: &nbsp;</span></li><li class="alt"><span>T&nbsp;data;</span><span class="comment">//数据 </span><span>&nbsp;</span></li><li><span>Node&lt;T&gt;&nbsp;*next;</span><span class="comment">//next指针 </span><span>&nbsp;</span></li><li class="alt"><span>Node() &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span></span><span class="keyword">this</span><span>-&gt;next=NULL;</span><span class="comment">//构造空的节点 </span><span>&nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>Node(T&nbsp;data,Node&lt;T&gt;&nbsp;*next=NULL)</span><span class="comment">//构造一个节点 </span><span>&nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span></span><span class="keyword">this</span><span>-&gt;data=data; &nbsp;</span></li><li><span></span><span class="keyword">this</span><span>-&gt;next=next; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>};&nbsp;</span></li></ol></pre>
<p>&nbsp;</p>
<p>单链表类声明如下：</p>
<p>&nbsp;</p><pre><ol class="dp-c"><li class="alt"><span>#include&lt;iostream&gt; &nbsp;</span></li><li><span>#include&nbsp;</span><span class="string">"Node.h"</span><span class="comment">//单链表节点类 </span><span>&nbsp;</span></li><li class="alt"><span>template&lt;classT&gt; &nbsp;</span></li><li><span>classSinglyLinkedList&nbsp;</span><span class="comment">//单链表类 </span><span>&nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span></span><span class="keyword">public</span><span>: &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;&nbsp;*head;</span><span class="comment">//单链表的头指针。 </span><span>&nbsp;</span></li><li><span>SinglyLinkedList();</span><span class="comment">//构造空的单链表。 </span><span>&nbsp;</span></li><li class="alt"><span>SinglyLinkedList(T&nbsp;value[],&nbsp;intn);</span><span class="comment">//构造由指定的数组提供的单链表 </span><span>&nbsp;</span></li><li><span>~SinglyLinkedList();</span><span class="comment">//析构 </span><span>&nbsp;</span></li><li class="alt"><span>boolisEmpty();</span><span class="comment">//判断是否为空。 </span><span>&nbsp;</span></li><li><span>intlength();</span><span class="comment">//获取长度 </span><span>&nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;*&nbsp;getNode(inti);</span><span class="comment">//返回第i(i&gt;=0)个节点指针 </span><span>&nbsp;</span></li><li><span>T&nbsp;</span><span class="keyword">get</span><span>(inti);</span><span class="comment">//返回第i个元素 </span><span>&nbsp;</span></li><li class="alt"><span>boolset(inti,T&nbsp;x);</span><span class="comment">//设置第i个元素为x </span><span>&nbsp;</span></li><li><span>template&lt;classT&gt;&nbsp;friend&nbsp;std::ostream&amp;&nbsp;</span><span class="keyword">operator</span><span>&lt;&lt;(std::ostream&amp;&nbsp;</span><span class="keyword">out</span><span>,SinglyLinkedList&lt;T&gt;&nbsp;&amp;list); &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;*&nbsp;insert(inti,T&nbsp;x);</span><span class="comment">//插入第I个节点并返回第i个节点的指针 </span><span>&nbsp;</span></li><li><span>boolremove(inti,T&amp;&nbsp;old);</span><span class="comment">//删除第i个元素，将删除的元素存放到old </span><span>&nbsp;</span></li><li class="alt"><span>voidclear();</span><span class="comment">//清空单链表 </span><span>&nbsp;</span></li><li><span>voidconcat(SinglyLinkedList&lt;T&gt;&nbsp;&amp;list);</span><span class="comment">//将List链接在当前单链表之后 </span><span>&nbsp;</span></li><li class="alt"><span>};&nbsp;</span></li></ol></pre>
<p>&nbsp;</p>
<p>单链表部分如构造空的链表对象，析构，判断为空的实现，没有要讲的算法，实现如下：</p>
<p>&nbsp;</p><pre><ol class="dp-c"><li class="alt"><span>template&lt;classT&gt; &nbsp;</span></li><li><span>SinglyLinkedList&lt;T&gt;::SinglyLinkedList()</span><span class="comment">//构造空的单链表 </span><span>&nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span></span><span class="keyword">this</span><span>-&gt;head=NULL; &nbsp;</span></li><li class="alt"><span>　} &nbsp;</span></li><li><span>template&lt;classT&gt; &nbsp;</span></li><li class="alt"><span>SinglyLinkedList&lt;T&gt;::~SinglyLinkedList()</span><span class="comment">//析构 </span><span>&nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>clear(); &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>template&lt;classT&gt; &nbsp;</span></li><li><span>boolSinglyLinkedList&lt;T&gt;::isEmpty()</span><span class="comment">//判断链表是否为空 </span><span>&nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>returnthis-&gt;head==NULL; &nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p>&nbsp;</p>
<p>单链表的遍历操作，遍历单链表是指从第一个节点开始访问，沿着节点的Next可依次访问单链表中的各个节点，并且各个节点只被访问一次。实现的单链表遍历的基本算法如下：</p>
<p>&nbsp;</p><pre><ol class="dp-c"><li class="alt"><span>intj=0; &nbsp;</span></li><li><span>Node&lt;T&gt;&nbsp;*p=head; &nbsp;</span></li><li class="alt"><span></span><span class="keyword">while</span><span>(p!=NULL&amp;&amp;j&lt;i) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>j++; &nbsp;</span></li><li><span>p=p-&gt;next; &nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p>&nbsp;</p>
<p>单链表的length(),get(),set(),clear()和输出等操作都基于以上算法。</p><pre><ol class="dp-c"><li class="alt"><span>template&lt;classT&gt; &nbsp;</span></li><li><span>intSinglyLinkedList&lt;T&gt;::length() &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>　inti=0; &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;&nbsp;*p=head;</span><span class="comment">//创建一个用于遍的变量 </span><span>&nbsp;</span></li><li><span></span><span class="keyword">while</span><span>(p!=NULL) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>i++; &nbsp;</span></li><li class="alt"><span>std::cout&lt;&lt;p-&gt;data; &nbsp;</span></li><li><span>p=p-&gt;next; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>　returni; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>template&lt;classT&gt; &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;*&nbsp;SinglyLinkedList&lt;T&gt;::getNode(inti) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span></span><span class="keyword">if</span><span>(i&lt;0) &nbsp;</span></li><li><span>returnNULL; &nbsp;</span></li><li class="alt"><span>intj=0; &nbsp;</span></li><li><span>Node&lt;T&gt;&nbsp;*p=head; &nbsp;</span></li><li class="alt"><span></span><span class="keyword">while</span><span>(p!=NULL&amp;&amp;j&lt;i) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>j++; &nbsp;</span></li><li><span>p=p-&gt;next; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>returnp; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>template&lt;classT&gt; &nbsp;</span></li><li class="alt"><span>T&nbsp;SinglyLinkedList&lt;T&gt;::</span><span class="keyword">get</span><span>(inti) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;&nbsp;*p=getNode(i); &nbsp;</span></li><li><span></span><span class="keyword">if</span><span>(p!=NULL) &nbsp;</span></li><li class="alt"><span>returnp-&gt;data; &nbsp;</span></li><li><span>T&nbsp;d; &nbsp;</span></li><li class="alt"><span>returnd; &nbsp;</span></li><li><span></span><span class="comment">//throw&nbsp;"单链表为空或者参数指定的元素不存在"; </span><span>&nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>template&lt;classT&gt; &nbsp;</span></li><li class="alt"><span>boolSinglyLinkedList&lt;T&gt;::</span><span class="keyword">set</span><span>(inti,T&nbsp;x) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;&nbsp;*p=getNode(i); &nbsp;</span></li><li><span></span><span class="keyword">if</span><span>(p!=NULL) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>p-&gt;data=x; &nbsp;</span></li><li class="alt"><span>returntrue; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>returnfalse; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>template&lt;classT&gt; &nbsp;</span></li><li><span>std::ostream&amp;&nbsp;</span><span class="keyword">operator</span><span>&lt;&lt;(std::ostream&amp;&nbsp;</span><span class="keyword">out</span><span>,SinglyLinkedList&lt;T&gt;&nbsp;&amp;list) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>Node&lt;T&gt;&nbsp;*p=list.head; &nbsp;</span></li><li class="alt"><span></span><span class="keyword">out</span><span>&lt;&lt;</span><span class="string">"("</span><span>; &nbsp;</span></li><li><span></span><span class="keyword">while</span><span>(p!=NULL) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span></span><span class="keyword">out</span><span>&lt;&lt;p-&gt;data; &nbsp;</span></li><li class="alt"><span>p=p-&gt;next; &nbsp;</span></li><li><span></span><span class="keyword">if</span><span>(p!=NULL) &nbsp;</span></li><li class="alt"><span></span><span class="keyword">out</span><span>&lt;&lt;</span><span class="string">","</span><span>; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span></span><span class="keyword">out</span><span>&lt;&lt;</span><span class="string">")&nbsp;"</span><span>; &nbsp;</span></li><li><span>returnout; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>template&lt;classT&gt; &nbsp;</span></li><li class="alt"><span>voidSinglyLinkedList&lt;T&gt;::clear() &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;&nbsp;*p=head; &nbsp;</span></li><li><span></span><span class="keyword">while</span><span>(p!=NULL) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>Node&lt;T&gt;&nbsp;*q=p; &nbsp;</span></li><li class="alt"><span>p=p-&gt;next; &nbsp;</span></li><li><span>delete&nbsp;q; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>head=NULL; &nbsp;</span></li><li class="alt"><span>　}&nbsp;</span></li></ol></pre>
<p>单链表的插入操作，单链表不像顺序表，对与表的插入和删除很简单：</p>
<p>空表插入/头插入</p><pre><ol class="dp-c"><li class="alt"><span>Node&lt;T&gt;&nbsp;*q=NULL; &nbsp;</span></li><li><span></span><span class="keyword">if</span><span>(head==NULL||i&lt;0)</span><span class="comment">//头插入(单链表为空或者) </span><span>&nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>q=newNode&lt;T&gt;(x,head); &nbsp;</span></li><li class="alt"><span>head=q; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>中间插入/尾插入 &nbsp;</span></li><li><span>p-&gt;next=newNode&lt;T&gt;(x,p-&gt;next); &nbsp;</span></li><li class="alt"><span>单链表insert()以及参数构造函数： &nbsp;</span></li><li><span>　template&lt;classT&gt; &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;*&nbsp;SinglyLinkedList&lt;T&gt;::insert(inti,T&nbsp;x) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;&nbsp;*q=NULL; &nbsp;</span></li><li><span></span><span class="keyword">if</span><span>(head==NULL||i&lt;0)</span><span class="comment">//头插入(单链表为空或者) </span><span>&nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>q=newNode&lt;T&gt;(x,head); &nbsp;</span></li><li class="alt"><span>head=q; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span></span><span class="keyword">else</span><span>&nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>intj=0; &nbsp;</span></li><li><span>Node&lt;T&gt;&nbsp;*p=head; &nbsp;</span></li><li class="alt"><span></span><span class="keyword">while</span><span>(p-&gt;next!=NULL&amp;&amp;j&lt;i-1) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>j++; &nbsp;</span></li><li><span>p=p-&gt;next; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>q=newNode&lt;T&gt;(x,p-&gt;next); &nbsp;</span></li><li class="alt"><span>　p-&gt;next=q; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>returnq; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>　template&lt;classT&gt; &nbsp;</span></li><li><span>SinglyLinkedList&lt;T&gt;::SinglyLinkedList(T&nbsp;table[],intn) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>head=NULL; &nbsp;</span></li><li class="alt"><span></span><span class="keyword">if</span><span>(n&gt;0) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>head=newNode&lt;T&gt;(table[0]);</span><span class="comment">//创建节点 </span><span>&nbsp;</span></li><li><span>　Node&lt;T&gt;&nbsp;*rear=head;</span><span class="comment">//创建一个指向头节点的指针 </span><span>&nbsp;</span></li><li class="alt"><span>inti=1; &nbsp;</span></li><li><span>　</span><span class="keyword">while</span><span>(i&lt;n) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>rear-&gt;next=newNode&lt;T&gt;(table[i++]); &nbsp;</span></li><li class="alt"><span>rear=rear-&gt;next; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>}&nbsp;</span></li></ol></pre>
<p>　单链表的删除操作也分两类：</p>
<p>头删除</p><pre><ol class="dp-c"><li class="alt"><span>Node&lt;T&gt;&nbsp;*q=head; &nbsp;</span></li><li><span>head=head-&gt;next; &nbsp;</span></li><li class="alt"><span>delete&nbsp;q;&nbsp;</span></li></ol></pre>
<p>中间/尾删除</p><pre><ol class="dp-c"><li class="alt"><span>Node&lt;T&gt;&nbsp;*q=p-&gt;next; &nbsp;</span></li><li><span></span><span class="keyword">if</span><span>(q!=NULL)</span><span class="comment">//判断删除节点 </span><span>&nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>p-&gt;next=q-&gt;next;</span><span class="comment">//让删除节点的前驱Next指针下一节点 </span><span>&nbsp;</span></li><li class="alt"><span>delete&nbsp;q;</span><span class="comment">//删除该节点 </span><span>&nbsp;</span></li><li><span>}&nbsp;</span></li></ol></pre>
<p>单链表的删除函数remove（）实现：</p><pre><ol class="dp-c"><li class="alt"><span>template&lt;classT&gt; &nbsp;</span></li><li><span>boolSinglyLinkedList&lt;T&gt;::remove(inti,T&nbsp;&amp;old) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span></span><span class="keyword">if</span><span>(i&lt;0||head==NULL) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>Node&lt;T&gt;&nbsp;*q=head; &nbsp;</span></li><li class="alt"><span>old=q-&gt;data; &nbsp;</span></li><li><span>head=head-&gt;next; &nbsp;</span></li><li class="alt"><span>delete&nbsp;q; &nbsp;</span></li><li><span>　} &nbsp;</span></li><li class="alt"><span></span><span class="keyword">else</span><span>&nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;&nbsp;*p=getNode(i-1);</span><span class="comment">//获取删除节点的前驱 </span><span>&nbsp;</span></li><li><span>　</span><span class="keyword">if</span><span>(p!=NULL&amp;&amp;p-&gt;next!=NULL)</span><span class="comment">//判断删除节点和删除节点是否为空 </span><span>&nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>Node&lt;T&gt;&nbsp;*q=p-&gt;next;</span><span class="comment">//新建一个节点指针，将删除接点复制过去 </span><span>&nbsp;</span></li><li class="alt"><span>old=q-&gt;data; &nbsp;</span></li><li><span>p-&gt;next=q-&gt;next;</span><span class="comment">//让删除节点的前驱Next指针下一节点 </span><span>&nbsp;</span></li><li class="alt"><span>delete&nbsp;q;</span><span class="comment">//删除该节点 </span><span>&nbsp;</span></li><li><span>　returntrue; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>　} &nbsp;</span></li><li class="alt"><span>returnfalse; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span>单链表的链接函数：concat() &nbsp;</span></li><li><span>template&lt;classT&gt; &nbsp;</span></li><li class="alt"><span>voidSinglyLinkedList&lt;T&gt;::concat(SinglyLinkedList&lt;T&gt;&nbsp;&amp;list) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span></span><span class="keyword">if</span><span>(</span><span class="keyword">this</span><span>-&gt;head==NULL) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span></span><span class="keyword">this</span><span>-&gt;head=list-&gt;head; &nbsp;</span></li><li><span>} &nbsp;</span></li><li class="alt"><span></span><span class="keyword">else</span><span>&nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>Node&lt;T&gt;&nbsp;*p=head; &nbsp;</span></li><li><span></span><span class="keyword">while</span><span>(p-&gt;next!=NULL) &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>p=p-&gt;next; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>p=list-&gt;head; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>list-&gt;head=NULL;</span><span class="comment">//设置单链表为空，否则运行出错 </span><span>&nbsp;</span></li><li class="alt"><span>}&nbsp;</span></li></ol></pre>
<p>以上对C++单链表的分析 添加一个学生结构和一个测试函数：</p><pre><ol class="dp-c"><li class="alt"><span>Student.h &nbsp;</span></li><li><span>structStudent &nbsp;</span></li><li class="alt"><span>{ &nbsp;</span></li><li><span>charnumber[10];&nbsp;</span><span class="comment">//学号 </span><span>&nbsp;</span></li><li class="alt"><span>charname[20];&nbsp;</span><span class="comment">//姓名 </span><span>&nbsp;</span></li><li><span>doublescore;&nbsp;</span><span class="comment">//得分 </span><span>&nbsp;</span></li><li class="alt"><span>friend&nbsp;std::ostream&amp;&nbsp;</span><span class="keyword">operator</span><span>&lt;&lt;(std::ostream&amp;&nbsp;</span><span class="keyword">out</span><span>,Student&nbsp;&amp;stu) &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span></span><span class="keyword">out</span><span>&lt;&lt;</span><span class="string">"学号："</span><span>&lt;&lt;stu.number&lt;&lt;</span><span class="string">"姓名："</span><span>&lt;&lt;stu.name&lt;&lt;</span><span class="string">"得分："</span><span>&lt;&lt;stu.score; &nbsp;</span></li><li><span>returnout; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>}; &nbsp;</span></li><li class="alt"><span>主函数： &nbsp;</span></li><li><span>#include&lt;iostream&gt; &nbsp;</span></li><li class="alt"><span>#include&nbsp;</span><span class="string">"SinglyLinkedList.h"</span><span>&nbsp;</span></li><li><span>#include&nbsp;</span><span class="string">"Student.h"</span><span>&nbsp;</span></li><li class="alt"><span>void_TestToSinglyLinkedList() &nbsp;</span></li><li><span>{ &nbsp;</span></li><li class="alt"><span>Student&nbsp;data[]={{</span><span class="string">"090313018"</span><span>,</span><span class="string">"Silvester"</span><span>,45.4},{</span><span class="string">"090313018"</span><span>,</span><span class="string">"捐赠"</span><span>,45.4},{</span><span class="string">"090313018"</span><span>,</span><span class="string">"版主"</span><span>,45.6}}; &nbsp;</span></li><li><span>SinglyLinkedList&lt;Student&gt;&nbsp;m(data,3); &nbsp;</span></li><li class="alt"><span>Student&nbsp;t; &nbsp;</span></li><li><span>std::cout&lt;&lt;(m.isEmpty()?</span><span class="string">"不为空！"</span><span>:</span><span class="string">"该链表为空！"</span><span>)&lt;&lt;std::endl; &nbsp;</span></li><li class="alt"><span>std::cout&lt;&lt;</span><span class="string">"长度："</span><span>&lt;&lt;m.length()&lt;&lt;std::endl; &nbsp;</span></li><li><span>std::cout&lt;&lt;</span><span class="string">"移除2个学生"</span><span>&lt;&lt;m.remove(1,t)&lt;&lt;std::endl; &nbsp;</span></li><li class="alt"><span>std::cout&lt;&lt;</span><span class="string">"t:"</span><span>&lt;&lt;t&lt;&lt;std::endl; &nbsp;</span></li><li><span>std::cout&lt;&lt;</span><span class="string">"2个学生信息"</span><span>&lt;&lt;m.getNode(1)&lt;&lt;std::endl; &nbsp;</span></li><li class="alt"><span>Student&nbsp;s={</span><span class="string">"415646"</span><span>,</span><span class="string">"fdsfs"</span><span>,453.1}; &nbsp;</span></li><li><span>std::cout&lt;&lt;m.</span><span class="keyword">get</span><span>(1)&lt;&lt;m.</span><span class="keyword">set</span><span>(1,s)&lt;&lt;m.insert(5,s)&lt;&lt;std::endl; &nbsp;</span></li><li class="alt"><span>} &nbsp;</span></li><li><span>voidmain() &nbsp;</span></li><li class="alt"><span>　{ &nbsp;</span></li><li><span>_TestToSinglyLinkedList(); &nbsp;</span></li><li class="alt"><span>system(</span><span class="string">"pause"</span><span>); &nbsp;</span></li><li><span>}&nbsp;</span></li></ol></pre>
<p><img class="fit-image" alt="" src="http://images.51cto.com/files/uploadimg/20120202/1048522.png" width="498" /></p>
<p>提供源代码下载地址：http://39327.42la.com.cn/DataFile/Code/C++/SinglyLinkedList.zip</p>
<p>原文地址：<a href="http://www.cnblogs.com/Arrays/archive/2012/02/01/2335164.html">http://www.cnblogs.com/Arrays/archive/2012/02/01/2335164.html</a></p>
<p class="f14 green"></p><img src ="http://www.cppblog.com/zhangtao0048/aggbug/186032.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/zhangtao0048/" target="_blank">章涛</a> 2012-08-02 14:58 <a href="http://www.cppblog.com/zhangtao0048/archive/2012/08/02/186032.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>