<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Blog of Felix021]]></title> 
<link>http://www.19880711.com/blog/index.php</link> 
<description><![CDATA[做人不能太CNN]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Blog of Felix021]]></copyright>
<item>
<link>http://www.19880711.com/blog/read.php?1108</link>
<title><![CDATA[zz脑子脱线时的暴笑举动~~~~哈哈！]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[搞笑]]></category>
<pubDate>Tue, 26 Aug 2008 04:11:50 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1108</guid> 
<description>
<![CDATA[ 
	发信人: owenronger (owenronger), 信区: Humor<br/>标&nbsp;&nbsp;题: 脑子脱线时的暴笑举动~~~~哈哈！<br/>发信站: BBS 珞珈山水站 (Tue Aug 26 10:13:33 2008)<br/><br/>洗衣服时想吐痰，旁边是马桶，结果一口痰吐洗衣机里了，于是先用手洗的衣服。。。<br/><br/>　　有一次坐公交拿了IC卡排队上车，前面一个人是扔硬币的，我大脑短路跟着把IC卡扔<br/>进去了。。。。。。。。<br/><br/>　　有一次肚子饿正在想要吃什么，结果舍友从厕所里出来说好舒服拉了好大一泡粑粑，<br/>结果我想着自己几天没拉了，就脑子短路的对她说，哎哟你好爽，我都好久没有吃屎了~~<br/>~~<br/><br/>　　早上要戴隐型眼睛,结果把盖打开直接把眼镜倒马桶里,然后镇定的倒入新的护理液,准<br/>备摘眼镜....半天摘不下来<br/><br/>　　刷牙时溅到衣服, 拿纸擦了一下, 擦完把牙刷给扔到垃圾桶了<br/><br/>　　有次叫了外卖pizza, 算了算时间坐在门口阶梯等, 跟朋友聊起电话来了, 外卖到了问<br/>我, 小姐是你们订的pizza吗? 我说不是. 他说的确是你们这个地址订的, 你肯定吗? 我<br/><br/><br/>　　说肯定. 他又说你们这房子几户人家? 我说都说没有了, 不好意思, 我在讲电话, 你<br/>能不能... 然后他很郁闷的回车子里打电话给店里, 我才想起.. 狂追..<br/><br/>　　我最记得有一次，也是下楼扔垃圾，<br/><br/>　　锁门的时候觉得拿在手上很麻烦，<br/><br/>　　居然鬼使神差的把垃圾袋装进我华丽丽的大包包里了。<br/><br/>　　我汗。<br/><br/>　　更郁闷的是，<br/><br/>　　还一直把它背到公司！！！<br/><br/>　　幸好没什么汤汤水水的东西！！！<br/><br/>　　有次去KFC，进门之前边走边把钱和优惠券拿在手里，当时手里还有张纸巾，手里拿了<br/>三样东西觉得碍事，打算把纸巾丢掉，随手把什么东西丢垃圾筒里了，准备进KFC门的时候<br/>发现手里握着优惠券和纸巾，百元大钞不见了，扭头奔回垃圾筒伸手从垃圾筒里把钱拣回<br/>来了。幸亏那垃圾筒就在门口。<br/><br/>　　有一次发高烧，早上不得不起来洗漱去上班，本来打算挤牙膏的，结果拿起洗面奶就<br/>挤在了牙刷上，一遍刷还一边想：今天牙膏的味道有点奇怪。<br/><br/>　　曾经邻居忘了带钥匙，从我家阳台翻过去，在屋里找到钥匙后，又HLL地翻回来，再淡<br/>定地打开自家房门。更令人纠结的是，我自始至终在阳台接应着，未觉有不妥之处。<br/><br/>　　唉，我俩的脑袋肯定被同一个门缝挤过。<br/><br/>　　我昨天觉得浴缸上有水垢，就拿威猛先生刷浴缸，刷完随手就放到浴缸的台子上了。<br/>等晚上洗澡的时候抓起威猛先生就往身上倒，边倒还边想，这沐浴露怎么这么稀呢，谁兑<br/>水了啊。。回过神来猛拿水冲啊。不知道是不是我皮厚，居然到今天还没掉皮<br/><br/>　　小时候有次边写作业边吃糖，哗啦把糖豆都堆在边上，看也不看就往嘴里扔。后来吃<br/>一颗的时候觉得没什么味道，当时也没在意。等到写错字的时候找不到橡皮，这才想起来<br/>刚才嚼的那个没味道的'糖'是橡皮擦。<br/><br/>　　这个我同事干过，说是早上左手一个塑料袋里面满满是零食，右手一个塑料袋是垃圾<br/>，早上打开垃圾箱“梆”一下扔了个袋子。然后提着另一个施施然到了公司，中午饿了要<br/>吃零食的时候打开柜子才发现里面是一袋垃圾。<br/><br/>　　坐地铁进闸，拿手机在闸上狂刷，还一直和后面等我的人说怎么刷不出来呢，机器坏<br/>了吧。。。汗。。。<br/><br/>　　二十几年前俺老妈洋洋洒洒骑着二十八寸的凤凰男式自行车送我一岁多的妹妹上幼儿<br/>园，到了幼儿园她极度潇洒的使了招螳螂后摆腿，感觉磕着了啥。她也不为意推着车就往<br/>前走，走没几步后面有人在大喊“同志，这位同志……”俺老妈扭头一看，俺一岁多滴小<br/>妹妹保持坐姿吓呆袅横倒在地上，至此之后的二十几年，俺滴妹妹死活都不肯坐俺老妈滴<br/>自行车，这个恨也恨二十多年……<br/><br/>　　喜欢把瓜子全部嗑了吃<br/><br/>　　鬼使神猜，全部嗑好后，把盘子里的瓜子仁一古脑倒到垃圾桶，<br/><br/>　　看这另一盘瓜子壳发呆<br/><br/>　　俺老妈也经常干这么华丽的事,想当年,俺家的门锁还是那种挂锁,有一天她老人家上早<br/>班,5:30从家里出发,不知她是怎么想的,顺手就把门锁,把我和我老爹锁在家里面了,而且还<br/>是个工作日,早起我爹开门的时候,发现门打不开了相当郁闷,幸亏俺邻居家有俺家钥匙,于<br/>是俺老爹给邻居奶奶打电话,让邻居奶奶连给俺们开门,当时我还没起床,在床上听俺爹打电<br/>话,我都笑疯了!晚上回家跟俺娘说,她不相信,还说:'我能干那事?'后来问了俺邻居她才相<br/>信了!这件事成了现在我们笑话她的大事件!<br/><br/>　　某日发现手机不见了，翻遍包包以及屋中各个角落，未果。遂郁闷跌坐地上，从口袋<br/>掏出手机，给大家群发短信：我手机丢了。。。。。。。<br/><br/>　　显示器待机，去晃鼠标，结果还是待机，使劲晃了半天，发现自己晃的是手机……<br/><br/>　　骑车去买东西，到商店车没锁就进商店了。买完东西出来，把车锁上，骑车准备走。<br/>。。<br/><br/>　　小时候喜欢咬钢笔头，有天咬着觉得不对劲，特别咸，然后发现吸了一嘴墨水<br/><br/>　　有次削完苹果，长长的批没有断，非常得意，顺手把苹果扔到垃圾桶里，拿着皮就往<br/>嘴里送！<br/><br/>　　炒鸡蛋西红柿的时候拿着煮熟的鸡蛋在碗边磕了好久都不烂，还对老婆说鸡蛋坏了。<br/><br/><br/>　　上次感冒打针，护士让脱裤子结果差点脱到底～<br/><br/>　　公司里有次犯晕了，想去上厕所的，不知不觉走到到纯净水的机器面前，看着大半桶<br/>的水，居然也没反应过来，“兹”的一声把裤裆拉链拉开...忽然间冥冥中猛的反应过来，<br/>“兹”的一声又把拉链拉上，什么都没发生似的回座位。还好旁边没人。后来想想，估计<br/>那阵子是工作太忙了。。。<br/><br/>　　野炊时摸出烟盒中最后一支烟点上，直接把zippo丢大火堆里把烟盒放回包里，仍旧烤<br/>肉，后炸出一堆火花烫坏2人衣服还毁了2碗饺子<br/><br/>　　拿着手机当火机点烟、拿着手机当电视遥控器一顿按。<br/><br/>　　炒菜的时候电话响了·接完电话直接把电话放菜盆里面·结果和菜一起到锅里了·然<br/>后看着锅里的手机楞了半天才赶忙拿出来·还好当时炒的是莴笋··要是麻婆豆腐···<br/>就完了···<br/><br/>　　大学的时候和室友一起回家，进门后一起换衣服，突然看到一只小强，她就上去pia了<br/>，然后拿着小强的尸体就来吓唬我，我很怕虫子，一紧张开门就跑出去了，她很兴奋地继<br/>续追我。。。都到电梯口了，才“醒悟”过来，发现我只穿了内衣，她。。。。。只穿了<br/>小裤裤。。。。幸好楼道里没有人。。。。<br/><br/>　　一路撑着一大伞 到公司进大堂的时候还很绅士的和门卫点了一下头又走了十几步才发<br/>现自己还举着伞 明显感到背后迷惑的目光幸亏来的早人少 不然就是大笑话了<br/><br/>　　有一次吃饭前去卫生间洗手 一看见镜子大脑突然短路很熟练的拿杯子牙刷哼着小曲刷<br/>了个牙出来了<br/><br/>　　第一天上班，有人电话找经理（女的），把电话给经理顺便说了声，妈有人找你，接<br/>电话。<br/><br/>　　有一次上PHOTOSHOP课，我一边给男朋友发信息，一边很勇敢的大声对老师喊：“老公<br/>！我的电脑没连上！”闹嚷嚷的教室瞬间安静了。5秒之后全体爆笑。老师是个50多岁的小<br/>老头。
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1107</link>
<title><![CDATA[CET6 - 六级成绩]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[随手记下]]></category>
<pubDate>Tue, 26 Aug 2008 03:29:15 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1107</guid> 
<description>
<![CDATA[ 
	听力184<br/>阅读216<br/>综合51<br/>作文130<br/>总分581。<br/><br/>听力部分35%<br/>阅读理解为35%<br/>完型填空或改错部分为10%<br/>写作和翻译部分分值比例为20%，其中写作部分15%，翻译部分5%<br/>从各项所占分值来看，即听力249分，阅读249分，完型填空或改错70分，作文142分，各单项分相加之和为总分710分
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1106</link>
<title><![CDATA[zz清华校长顾秉林－－中国大学教育就是往脑子里灌屎 ]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[杂文-未分类]]></category>
<pubDate>Mon, 25 Aug 2008 17:39:00 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1106</guid> 
<description>
<![CDATA[ 
	清华校长顾秉林－－中国大学教育就是往脑子里灌屎 <br/><br/>来源：网易教育论坛　 <br/><br/>　　昨天下午，清华大学校长顾秉林先生在接受学生记者采访的时候，表达了他对现在大<br/>学教育状况的担心，他表示，说得直白一点，现行的大学教育制度就是“在往学生们的脑<br/>子里灌屎”。 <br/><br/>　　顾秉林校长表示，在二十世纪初至40年代，可以说是中国教育界的黄金时期，在这段<br/>时间以内中国的大学为社会培养出了大批的优秀人才，他们中有伟大的思想家、教育家，<br/>有革命义士、抗日英雄，有科学骨干、民族精英。而这种盛况自从解放后尤其是九十年代<br/>开始衰落。现在的各高校，包括清华与北大在内，已经没有将培养人才作为大学教育的目<br/>标。严重的学术腐败，枯燥且与社会脱节的课程，死记硬背的教育方式，将导致学生们的<br/>思想僵化，对课程失去兴趣，对大学乃至整个中国的教育失去信心，退学正是表达他们对<br/>大学教育失望的最极端方式。 <br/><br/>　　他进一步表示，至少有80％的学生在刚进入大学的时候是酬躇满志，报着努力学习的<br/>决心的，可是在四年大学生涯的消磨与侵蚀下，能将这一决心坚持到毕业的学生恐怕不到<br/>20％。逃课，考试作弊已经被很多学生当成了家常便饭。上大学的目的由最初的学习知识<br/>变成了纯粹的混文凭。而那些在恶劣的环境下坚持认真学习的学生，他们的学习能力和创<br/>新能力却正在被逐渐磨灭。若这种情况持续下去，大学最终培养出来的成品，将是一具具<br/>没有灵魂的行尸走肉。 <br/><br/>　　“如果一直这样下去，20年后，中国大学生的思想状态和精神水平将会是什么样子？<br/>我简直不敢想象！” <br/><br/>　　古板的教学方式和教材让社会丢失了许多的达芬奇，比尔盖茨。对于这样损失,我们是<br/>否要反省下呢？在这样的教育模式之下，学生们的精神受到极大的伤害，创造性和独立思<br/>考能力受到无可挽回的扼杀，中国至今没有诺贝尔奖获得者，与这种教育模式有很大的关<br/>系。 <br/><br/>　　以下是顾秉林先生的原话： <br/><br/>　　作为一个大学校长，我认为真正的高校应该培养学生的独立技能、独特的思考方式和<br/>敢于权威挑战的精神。 <br/><br/>　　1、什么是独立的技能？ <br/><br/>　　不是拘泥于课本上的，如果你对某东西有深入研究，可以考虑研究成果作为成绩。我<br/>们要鼓励和发扬这样的模式，因为市场和学生需要这样的鼓励！ <br/><br/>　　2、什么是独特的思考方式？ <br/><br/>　　独特的思考方式不代表爆炸式的思考，而是多种寻根问底的思想，抓住一条线一直往<br/>前摸，有这样的科学精神，这条线一定能通往诺贝尔。独特的思考方式是在不断学习的过<br/>程中产生的，学生得注意研究的方式、研究的目的以及合理性。当然，诺贝尔奖不应该成<br/>为教育的最终目标，教育的最终目标是为社会培养以及输送人才，但是这毕竟是国际上对<br/>最顶尖人才认可的标志。 <br/><br/>　　3、什么是敢于挑战权威？ <br/><br/>　　这个相信学生们都了解，羽毛和石头哪个能先着地？ <br/><br/>　　这个是众人皆知的，为什么那个时候全世界只有1个人提出了不相同的结论并用事实证<br/>明了？原因就是权威的威慑。教授：这个名词是一个长辈的名词，我不介意别人叫我同学<br/>，叫我兄弟，或者学生。因为弟子不必不如师，师不必贤于弟子，闻道有先后，术业有专<br/>攻。你研究的成果比老是的好,你就是老师,我可以为一个同学“无聊”的问题而停下上课<br/>,动员大家参与这个问题的讨论，原因为什么?这个问题的隔壁很可能就是诺贝尔奖…… <br/><br/>　　当然，以上的能力，在中国现行的教育体制下，是不可能被赋予学生的。所以顾秉林<br/>先生表示，中国的高等教育体制改革势在必行，“应该停止再扼杀人才了！应该停止再向<br/>学生们的脑子里灌屎了！”当然，改革会涉及很多未知的因素，以及牵扯很多人的利益，<br/>势必受到极大的阻力，可是为了学生以及中国的未来着想，这些阻力都必须被克服。<br/><br/><a href="http://news.tsinghua.edu.cn/new/news.php?id=18735" target="_blank">http://news.tsinghua.edu.cn/new/news.php?id=18735</a><br/><br/><br/>清华大学新闻中心声明<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;8月24日晚23时47分，清华新闻网遭到恶意攻击，被恶意篡改，假冒新闻，传播谣言。清华大学新闻中心对此表示强烈愤慨和谴责！&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;清华大学新闻中心<br/><br/>&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2008年8月25日
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1105</link>
<title><![CDATA[向量积（叉积）及其计算]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[学习]]></category>
<pubDate>Sat, 23 Aug 2008 18:14:34 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1105</guid> 
<description>
<![CDATA[ 
	矬到死～～～今天要用到向量的叉积，居然一点印象都没有了！查了下资料，贴出来，BS自己。<br/><br/>向量积 a x b = (^n) * &#124;a&#124; * &#124;b&#124; * sin&lt;a, b&gt;, 其中^n是同时垂直于a/b且符合右手定则的单位向量。<br/>若已知向量a = (ax, ay, az), b = (bx, by, bz); <br/>则 a x b = (ay * bz - by * az, az * bx - ax * bz, ax * by - ay * bx);<br/>可以把i, j, k和a，b的坐标分别循环写成一行如下:<br/>i&nbsp;&nbsp;~~~~&nbsp;&nbsp;j&nbsp;&nbsp;~~~~ k&nbsp;&nbsp;~~~~&nbsp;&nbsp;i&nbsp;&nbsp;~~~~ j ...<br/>ax&nbsp;&nbsp;~~&nbsp;&nbsp;ay&nbsp;&nbsp;~~~ az ~~~~ ax ~~~~ ay ...<br/>bx&nbsp;&nbsp;~~&nbsp;&nbsp;by&nbsp;&nbsp;~~~ bz ~~~~ bx ~~~~ by ..<br/><br/>斜向右下方向可以找出三条线分别串起<br/>i-ay-bz, j-az-bx, k-ax-by<br/>斜向左下方向可以找出三条线分别串起<br/>i-az-by, j-ax-bz, k-ay-bx<br/>将每条线中的三个数相乘，(前三条线的和)减去(后三条线的和)，就是向量a, b的叉积。<br/><br/>如果向量是二维的(e. g. a =&nbsp;&nbsp;(ax, by) , b = (bx, by)&nbsp;&nbsp;)，那么<br/>a x b = ax * by - ay * bx = &#124;a&#124; * &#124;b&#124; * sin&lt;a, b&gt;<br/>可以用来判断两条线段之间的夹角是顺时针还是逆时针的。
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1104</link>
<title><![CDATA[zz: fstab详解]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[操作系统]]></category>
<pubDate>Fri, 22 Aug 2008 14:34:04 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1104</guid> 
<description>
<![CDATA[ 
	from <a href="http://www.5dlinux.com/article/1/2007/linux_10628.html" target="_blank">http://www.5dlinux.com/article/1/2007/linux_10628.html</a><br/><br/>可能玩Linux的朋友都知道fstab这个文件，如果要用好linux，熟悉linux的一些核心配置文件是必要的，而fstab则是其中之一。这个文件描述系统中各种文件系统的信息，应用程序读取这个文件，然后根据其内容进行自动挂载的工作。因此，我们需要理解其中的内容，了解它如何与 mount命令配合工作，并能够针对自己的情况进行修改。<br/><br/>作为系统配置文件，fstab通常都位于/etc目录下，它包括了所有分区和存储设备的信息，以及它们应该挂载到哪里，以什么样子的方式挂载。如果遇到一些类似于无法挂载你的windows分区阿，无法使用你的光驱阿，无法对某个分区进行写入操作阿什么的，那么基本上可以断定，你的fstab内容有问题了。也就是说，你可以通过修改它来搞定这些问题，而不用去论坛冰天雪地裸体跪求答案了。<br/><br/>说了半天，/etc/fstab其实就是一个文本文件，用gedit或者vi都可以打开，当然，前提是root权限。在这个文件中，每个文件系统（包括分区或者设备）用一行来描述，在每一行中，用空格或TAB符号来分隔各个字段，文件中以*开头的行是注释信息。Fstab文件中的纪录的排序十分重要。因为 fsck，mount或umount等程序在做它们的工作时会按此顺序进行本。下面进行详细的讲解，本文假设读者已经有挂载文件系统和分区的基础知识。<br/><br/>在讲解之前要说一下，每个人所使用的系统情况都是不同的，包括硬件种类，所用系统等，因此fstab文件肯定是有所差异的。但是其基本结构，如上所述，都不会变。所以我们先以一个fstab内容作为模板进行讲解。<br/><br/>首先请看下面这个例子：<br/>/dev/hda2 / ext2 defaults 1 1<br/>/dev/hdb1 /home ext2 defaults 1 2<br/>/dev/cdrom /media/cdrom auto ro,noauto,user,exec 0 0<br/>/dev/fd0 /media/floppy auto rw,noauto,user,sync 0 0<br/>proc /proc proc defaults 0 0<br/>/dev/hda1 swap swap pri=42 0 0<br/><br/>这些看起来毫无意义的字符代表了什么？在对应相应分区或者存储设备信息的每一行中，每一列又是什么意思？先大体讲一下，第一列表示设备的名称，第二列表示该设备的挂载点，第三列是文件系统，第四列是挂载选项，第五列是dump选项（用一个数字表示），第六列（接下来的数字）表示文件系统检查选项。好了，接下来，就要详细介绍这些参数的具体含义了。<br/><br/>第一、二列：设备和默认挂载点<br/><br/><br/>说实话，第一列和第二列的内容是最简单最直接的，它们的作用就是告诉mount命令，我想挂载什么分区或者什么设备，以及我所希望的挂载点在哪里。在fstab中为某一个设备指定的挂载点是其默认挂载点，也就是当你在挂载目录的时候没有手工指定其他目录的话，系统就将该设备挂载到这个目录。大多数 Linux发行版都会为挂载点创建专门的目录，大多数是在/mnt下，但是一些发行版（比如SUSE或者ubuntu）是在/media下。笔者使用的是 ubuntu，所以示例信息中也是用的/media目录。<br/><br/>按照我们给出的fstab示例，如果你敲入命令<br/><br/>$ mount /dev/fd0<br/><br/>你的软驱就将挂载到/media/floppy，因为这是你告诉系统的软驱默认挂载点。如果没有这个信息，当你敲入mount命令时，mount 会感到很困惑：该死的，你想让我把这玩意挂载到哪里去呢？当然，如果你看fstab中发行版给你指定的默认挂载点不顺眼，也可以自由修改它，修改成任何一个你希望的目录都可以。如果还不存在，就首先创建这个目录。要知道，fstab是不会把所有工作都给你包干的哦。<br/><br/>另外，有一些分区和存储设备是在Linux系统启动的时候就自动挂载的，比如，让我们看看刚才列出来的fstab示例信息，有两行是这样的：<br/>/dev/hda2 / ext2 defaults 1 1<br/>/dev/hdb1 /home ext2 defaults 1 2<br/><br/>正如刚才我们讲到的那样，这两行表示/dev/hda2默认挂载到/根目录，而 /dev/hdb1则默认挂载到/home目录，。这些工作在你Linux系统启动的时候就会通过读取fstab自动完成，否则的话……想象你会遭受什么样的折磨吧，所有的程序都在/根目录下，而你却无法使用，因为你没有挂载/根目录！恩，我保证，这将是一次让人沮丧的系统使用经历。<br/><br/>除了显式的使用设备名，你可以使用设备的UUID或设备的卷标签，例如，你可以在这个字段写成“LABAL=root”或“UUID= 3e6be9de- 8139-11d1-9106-a43f08d823a6”，这将使系统更具伸缩性。例如，如果你的系统添加或移除了一个SCSI硬盘，这有可以改变你的设备名，但它不会修改你的卷标签。<br/><br/>对于NFS mount操作，这个字段应该包含host:dir格式的信息，例如:knuth.aeb.nl:/，对于进程文件系统procfs，使用proc。<br/><br/>第三列：文件系统类型<br/><br/>fstab中的第三列指示了设备或者分区的文件系统类型。它支持很多种类的文件系统，我们在这里只介绍最为常用的。如果想了解你的kernel目前支持哪些文件系统，可以查看/proc/filesystems的内容。如果这个字段定义为swap，这条纪录将关联到一个用于交换目的的文件或分区。如果这个字段定义为ignored，这行将被忽略。这对于显示目前没有使用的分区非常有用。<br/><br/>ext2 和 ext3： Linux下的Ext2文件系统，是 GNU/Linux 系统中标准的文件系统，其特点为存取文件的性能极好，对于中小型的文件更显示出优势，这主要得利于其簇快取层的优良设计。至于Ext3文件系统，它属于一种日志文件系统，是对ext2系统的扩展。日志式文件系统的优越性在于，它会将整个磁盘的写入动作完整记录在磁盘的某个区域上，以便有需要时可以回朔追踪。由于详细纪录了每个细节，故当在某个过程中被中断时，系统可以根据这些记录直接回朔并重整被中断的部分，而不必花时间去检查其他的部分，故文件系统检测不一致时，重整的工作速度相当快，几乎不需要花时间。<br/><br/>reiserfs： ReiserFS是一个非常优秀的文件系统。也是最早用于Linux的日志文件系统之一，其机制比Ext3要先进得多，风雷小弟一直使用的就是它，很多发行版现在也把它作为默认文件系统了。可惜其作者前段时间出事了……具体情况就不说了，也不知道下一代reiserfs4还能不能出来，因为ext4都有了。<br/><br/>swap： Swap，即交换区，把它想象成虚拟内存就行了。<br/><br/>vfat 和 ntfs：一看就知道是Windows分区格式了，呵呵。98，me等系统都是使用的vfat，也就是最流行的fat32格式，而NT系列则多使用 NTFS，当然也不是固定的，因此2000或者XP系统要具体情况具体分析。当初Linux对NTFS的写入支持不好，所以大多数资料都建议用户使用 vfat格式，但是现在支持已经很好了，即使不重新编译内核，也可以通过ntfs-3g来进行写入支持，因此不用太在意这个了。<br/><br/>auto：当然，这不是一个文件系统类型。auto只是表示，文件系统的类型将被自动检测。在上面的示例中，你会发现软驱和光驱的文件系统类型都是auto，为什么呢？因为它们的文件系统类型随时都可能改变，比如软驱，优盘这种设备，可能今天是vfat格式，明天你就把它格式化成了 ntfs，因此，最明智的做法就是告诉系统，我没法确定这东西的当前类型，还是你自己检测吧。<br/><br/>udf：由于刻录光驱越来越流行，现在很多发行版自带的fstab中，光驱的文件格式类型是UDF，UDF是Universal Disc Format的缩写，与ISO 9660格式相容。它采用标准的封装写入技术（PW，Packet Writing）将CD-R/CD-RW当作硬盘使用，用户可以在光盘上修改和删除文件。利用UDF格式进行刻录时，刻录软件将数据打包，并在内存中临时建立一个特殊文件目录表，同时接管系统对光盘的访问。<br/><br/>iso9660：很多光驱也使用的这个选项。ISO9660是一种描述适合CD盘片的电脑文件结构的国际标准。采用此标准的盘片可以在不同的操作系统上使用，如MAC和Windows。<br/><br/>第四列：挂载选项<br/><br/>fstab 中的第四列表示设备或者分区所需要的挂载选项。这一列也是fstab中最复杂最容易出错的一列，当然，只要你能知道一些最常用的选项是什么意思，就可以让你从头疼中解脱出来。如果要把可用的选项一项一项介绍……恩，我估计我会写到明天，所以，我还是只是分析最常用的一些选项，如果你想知道更多的东西，还是求助于man吧。<br/><br/>auto 和 noauto：这是控制设备是否自动挂载的选项。auto是默认选择的选项，这样，设备会在启动或者你使用mount -a命令时按照fstab的内容自动挂载。如果你不希望这样，就使用noauto选项，如果这样的话，你就只能明确地通过手工来挂载设备。<br/><br/>user 和 nouser：这是一个非常有用的选项，user选项允许普通用户也能挂载设备，而nouser则只允许root用户挂载。nouser是默认选项，这也是让很多 Linux新手头疼的东西，因为他们发现没有办法正常挂载光驱，Windows分区等。如果你作为普通身份用户遇到类似问题，或者别的其他问题，就请把 user属性增加到fstab中。<br/><br/>exec 和 noexec： exec允许你执行对应分区中的可执行二进制程序，同理，noexec的作用刚好相反。如果你拥有一个分区，分区上有一些可执行程序，而恰好你又不愿意，或者不能在你的系统中执行他们，就可以使用noexec属性。这种情况多发生于挂载Windows分区时。exec是默认选项，理由很简单，如果 noexec变成了你/根分区的默认选项的话……<br/><br/>ro： 以只读来挂载文件系统。<br/><br/>rw： 以可读可写的属性来挂载系统。<br/><br/>sync 和 async：对于该文件系统的输入输出应该以什么方式完成。sync的意思就是同步完成，通俗点讲，就是当你拷贝一个东西到设备或者分区中时，所有的写入变化将在你输入cp命令后立即生效，这个东西应该立马就开始往设备或者分区里面拷贝了。而如果是async，也就是输入输出异步完成的话，当你拷贝一个东西到设备或者分区中时，可能在你敲击cp命令后很久，实际的写入操作才会执行，换句话说，就是进行了缓冲处理。<br/><br/>有时候这种机制蛮不错的，因为sync会影响你系统的运行速度，但是这也会带来一些问题。想一想，当你希望将一个文件拷贝到u盘上时，你执行了 cp 命令，却忘记执行umount命令（它会强行将缓冲区内容写入），那么你拷贝的文件实际上并没有在u盘上面。如果你是使用的mv命令，而你又很快将u盘拔出……恭喜你，文件会从这个星球上消失的。因此，虽然async是默认属性，但是对于u盘，移动硬盘这种可移动存储设备，最好还是让他们使用sync选项。<br/><br/>defaults： 所有选项全部使用默认配置，包括rw, suid, dev, exec, auto, nouser, 和 async。<br/><br/>一般用户没有特殊需求，直接使用defaults就可以了。看完介绍，我们再回过头去看看前面的示例内容，以光驱为例，主要关注挂载选项这里，可以看到，光驱和其他分区设备的不同是ro，因为普通光驱是只读的。而exec则让你可以从光驱上直接执行某些程序。<br/><br/>第五、六列：dump和fsck选项<br/><br/>Dump和fsck？这是什么东西？恩，dump是一个备份工具，而fsck是一个文件系统扫描检查工具。我不会在这里详细介绍它们，因为用man或者google都可以获得更加详细的信息。<br/><br/>fstab 的第五列是表示dump选项，dump工具通过这个选项位置上的数字来决定文件系统是否需要备份。如果是0，dump就会被忽略，事实上，大多数的 dump设置都是0。而第六列是fsck选项，fsck命令通过检测该字段来决定文件系统通过什么顺序来扫描检查，根文件系统/对应该字段的值应该为1，其他文件系统应该为2。若文件系统无需在启动时扫描检查，则设置该字段为0。<br/>Tags - <a href="http://www.19880711.com/blog/tag.php?tag=linux" rel="tag">linux</a>
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1102</link>
<title><![CDATA[C++ STL整理v1 v2 v3 v4都搞定了]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[程序设计]]></category>
<pubDate>Thu, 21 Aug 2008 20:25:11 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1102</guid> 
<description>
<![CDATA[ 
	花了挺多的时间整理出了C++ STL的各种标准容器以及标准的C++非STL容器，包括stack, queue, priority_queue, string, vector, deque, list, map, multimap, set, multiset, 在整理的同时测试过去，感觉对这些容器的使用都比较熟悉了，而且对泛型编程也有了比较深的理解。现在也整理出了STL的算法这一部分，花了一整个晚上。。。真累阿。发现STL的算法部分其实也是非常值得看看的。比如next_permutation这个算法，可以产生某序列的下一个排列，效率竟然是自己写的DFS的2倍还高些！省了代码，保证了正确性，还提高了效率，何乐而不为呢！<br/><br/>花了这么多时间整理出来，不仅仅是希望自己能用上，也希望所有有需要的人可以看到，参考。或许有些错误，如果谁发现了，还望告知～～<br/><br/>在整理的时候查看了很多资料，最重要的一些是是The C++ Standard Library,&nbsp;&nbsp;<a href="http://cppreference.com" target="_blank">http://cppreference.com</a> ,&nbsp;&nbsp;C++ Programmer&#039;s Guide,&nbsp;&nbsp;Effective STL , 都是非常好的书/网站，如果有不明白的，或者需要更详细的，建议去翻翻这些资料。<br/><br/>Felix021 @ 2008.08.22 4:24<br/><br/><a href="attachment.php?fid=180">点击这里下载文件</a><br/><br/>Tags - <a href="http://www.19880711.com/blog/tag.php?tag=c%252B%252B" rel="tag">c++</a> , <a href="http://www.19880711.com/blog/tag.php?tag=stl" rel="tag">stl</a>
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1103</link>
<title><![CDATA[Linux下取得精确的时间，精确到10^(-6)秒]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[操作系统]]></category>
<pubDate>Thu, 21 Aug 2008 18:39:47 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1103</guid> 
<description>
<![CDATA[ 
	因为需要测试算法的效率，所以专门找了一下在Linux下C/C++如何取得精确的时间来进行判断。<br/>有两个办法，<br/>1. 调用系统命令data +%s.%N，可以取得当前的Unix时间戳，格式为 秒数.毫秒数<br/>FILE *pipe = popen("data +%s.%N", "r");<br/>fscanf(pipe, "%d.%d", &s, &ns);<br/>这样就取得了精确的时间。<br/>2. 使用gettimeofday()函数<br/>struct timeval &#123; long tv_sec, tv_usec; &#125;; //这个结构体保存秒数和毫秒数(0~1000000)<br/>int gettimeofday(struct timeval *tv,struct timezone *tz); //调用时tz一般用NULL代替<br/><br/>下面对第二种方法给出样例程序：Linux下测试程序运行时间的一个类<br/><br/><div class="code">#include&lt;iostream&gt;<br/>#include&lt;sys/time.h&gt;<br/>using namespace std;<br/>struct timer&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public:<br/>&nbsp;&nbsp;&nbsp;&nbsp;struct timeval begin, end;<br/>&nbsp;&nbsp;&nbsp;&nbsp;timer()&#123; gettimeofday(&amp;begin, NULL); &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;void start()&#123; gettimeofday(&amp;begin, NULL); &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;void finish()&#123; gettimeofday(&amp;end, NULL); &#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;friend inline ostream &amp; operator&lt;&lt;(ostream &amp;os, timer &amp;a)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double use = 1000000 * (a.end.tv_sec - a.begin.tv_sec) + a.end.tv_usec - a.begin.tv_usec;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use /= 1000000.0;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os &lt;&lt; use;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return os;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&#125;;<br/><br/>int main()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;timer timer1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;timer1.start();<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(int i = 0; i &lt; 100000000; i++);<br/>&nbsp;&nbsp;&nbsp;&nbsp;timer1.finish();<br/>&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; timer1;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>&#125;<br/><br/></div>
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1101</link>
<title><![CDATA[C++ String的find()成员函数]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[程序设计]]></category>
<pubDate>Thu, 21 Aug 2008 06:53:28 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1101</guid> 
<description>
<![CDATA[ 
	摘自boost库的文档： <br/>Currently&nbsp;&nbsp; the&nbsp;&nbsp; library&nbsp;&nbsp; contains&nbsp;&nbsp; only&nbsp;&nbsp; naive&nbsp;&nbsp; implementation&nbsp;&nbsp; of&nbsp;&nbsp; find&nbsp;&nbsp; algorithms&nbsp;&nbsp; with&nbsp;&nbsp; complexity&nbsp;&nbsp; O(n&nbsp;&nbsp; *&nbsp;&nbsp; m)&nbsp;&nbsp; where&nbsp;&nbsp; n&nbsp;&nbsp; is&nbsp;&nbsp; the&nbsp;&nbsp; size&nbsp;&nbsp; of&nbsp;&nbsp; the&nbsp;&nbsp; input&nbsp;&nbsp; sequence&nbsp;&nbsp; and&nbsp;&nbsp; m&nbsp;&nbsp; is&nbsp;&nbsp; the&nbsp;&nbsp; size&nbsp;&nbsp; of&nbsp;&nbsp; the&nbsp;&nbsp; search&nbsp;&nbsp; sequence.&nbsp;&nbsp; There&nbsp;&nbsp; are&nbsp;&nbsp; algorithms&nbsp;&nbsp; with&nbsp;&nbsp; complexity&nbsp;&nbsp; O(n),&nbsp;&nbsp; but&nbsp;&nbsp; for&nbsp;&nbsp; smaller&nbsp;&nbsp; sequence&nbsp;&nbsp; a&nbsp;&nbsp; constant&nbsp;&nbsp; overhead&nbsp;&nbsp; is&nbsp;&nbsp; rather&nbsp;&nbsp; big.&nbsp;&nbsp; For&nbsp;&nbsp; small&nbsp;&nbsp; m&nbsp;&nbsp; < <&nbsp;&nbsp; n&nbsp;&nbsp; (m&nbsp;&nbsp; by&nbsp;&nbsp; magnitude&nbsp;&nbsp; smaller&nbsp;&nbsp; than&nbsp;&nbsp; n)&nbsp;&nbsp; the&nbsp;&nbsp; current&nbsp;&nbsp; implementation&nbsp;&nbsp; provides&nbsp;&nbsp; acceptable&nbsp;&nbsp; efficiency.&nbsp;&nbsp; Even&nbsp;&nbsp; the&nbsp;&nbsp; C++&nbsp;&nbsp; standard&nbsp;&nbsp; defines&nbsp;&nbsp; the&nbsp;&nbsp; required&nbsp;&nbsp; complexity&nbsp;&nbsp; for&nbsp;&nbsp; search&nbsp;&nbsp; algorithm&nbsp;&nbsp; as&nbsp;&nbsp; O(n&nbsp;&nbsp; *&nbsp;&nbsp; m).&nbsp;&nbsp; It&nbsp;&nbsp; is&nbsp;&nbsp; possible&nbsp;&nbsp; that&nbsp;&nbsp; a&nbsp;&nbsp; future&nbsp;&nbsp; version&nbsp;&nbsp; of&nbsp;&nbsp; library&nbsp;&nbsp; will&nbsp;&nbsp; also&nbsp;&nbsp; contain&nbsp;&nbsp; algorithms&nbsp;&nbsp; with&nbsp;&nbsp; linear&nbsp;&nbsp; complexity&nbsp;&nbsp; as&nbsp;&nbsp; an&nbsp;&nbsp; option。<br/><br/>也就是说string::find()提供的是O(m*n)的效率，不是KMP的O(n)，很汗。。。<br/>Tags - <a href="http://www.19880711.com/blog/tag.php?tag=c%252B%252B" rel="tag">c++</a>
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1100</link>
<title><![CDATA[解决交换技巧引起的对匿名变量生存周期de疑问..]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[程序设计]]></category>
<pubDate>Thu, 21 Aug 2008 05:03:52 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1100</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;在C++里，STL中string和vector的空间是可以自动增长的，但是有一个问题是，当你将它们中的元素删除(甚至是使用clear函数)时，多余的空间不会被释放，这时候可以用一个交换技巧(详见Effective STL)来清空多余的元素：<br/>&nbsp;&nbsp;&nbsp;&nbsp;释放vt中的多余元素占用空间：vector&lt;int&gt;(vt).swap(vt);<br/>&nbsp;&nbsp;&nbsp;&nbsp;释放vt中的所有元素占用空间：vector&lt;int&gt;().swap(vt);<br/>&nbsp;&nbsp;&nbsp;&nbsp;这样一句话中其实执行了好几个步骤。在第一种方法里，vector&lt;int&gt;(vt)创建了一个匿名变量并用vt中的值对其初始化，然后调用它的swap()方法，和vt交换，这时vt中的大小就正好只有那么大；第二种方法里，vector&lt;int&gt;创建了一个空的匿名变量并和vt交换，于是vt就被清空了。同样的，对于string也可以string ().swap(str)或string (str).swap(str)。<br/>&nbsp;&nbsp;&nbsp;&nbsp;但是这带来另一个问题：那个匿名变量占用的空间怎么释放？看一个例程：<br/><br/><div class="code">#include&lt;iostream&gt;<br/>using namespace std;<br/>class temp&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;public:<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp()&#123;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~temp()&#123; cout &lt;&lt; &quot;~temp&quot; &lt;&lt; endl; &#125;<br/>&#125;;<br/>void f(temp a)&#123; cout &lt;&lt; &quot;f&quot; &lt;&lt; endl;&#125;;<br/><br/>int main()&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; &quot;0&quot; &lt;&lt; endl;<br/>&nbsp;&nbsp;&nbsp;&nbsp;f(temp());<br/>&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; &quot;1&quot; &lt;&lt; endl;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br/>&#125;</div><br/><br/>运行后的输出为<br/>0<br/>f<br/>~temp<br/>1<br/><br/>也就是说，在一般情况下匿名变量的生存周期仅仅只是它所在的那一行而已。<br/>但是可以通过常引用使得匿名变量继续存在，比如对上面的程序，定义一个常引用：<br/>const temp &amp;a = temp(); <br/>可以使得匿名变量存在到a的生存周期结束。<br/>但是如果不是常引用，则是错误的，比如<br/>temp &amp;b = temp();<br/>编译器给出的错误提示是：不能将类型为‘temp&amp;’的非 const 引用初始化为类型为‘temp’的临时变量<br/>OVER.<br/>Tags - <a href="http://www.19880711.com/blog/tag.php?tag=c%252B%252B" rel="tag">c++</a>
]]>
</description>
</item><item>
<link>http://www.19880711.com/blog/read.php?1099</link>
<title><![CDATA[Effective STL学习记录小整理]]></title> 
<author>felix021 &lt;felix021 [at] gmail.com&gt;</author>
<category><![CDATA[程序设计]]></category>
<pubDate>Wed, 20 Aug 2008 17:02:31 +0000</pubDate> 
<guid>http://www.19880711.com/blog/read.php?1099</guid> 
<description>
<![CDATA[ 
	这些天花了不少时间看STL，当然也少不了看《Effective STL》这本书。<br/>这本书讲了很多内容，我只记下了对于初学者比较容易理解和需要记住的一些重要条款：<br/><br/>条款4：用empty()来代替检查size()是否为0<br/>因为size()可能需要O(n)的时间，但是empty()只需要O(1)<br/><br/>条款5：尽量使用区间成员函数代替它们的单元素兄弟<br/>对于插入已知数量或已知区间的元素，使用区间版的成员函数效率高。<br/>比如vt.insert(a, a+100000)效率将显然高于for(i=0;i&lt;100000;i++)vt.insert(a[i]);<br/>因为后者需要反复调用insert()并可能多次重新分配空间<br/><br/>条款7：当使用new得指针的容器时，记得在销毁容器前delete那些指针<br/>容器被删除的时候指针被删除，但是指针指向的内存空间并不会被释放<br/><br/>条款17：使用“交换技巧”来修整过剩容量<br/>注意！在vector里面删除元素的时候，多余的空间不会自动释放<br/>vector&lt;type&gt;(vt).swap(vt);<br/>释放vt占用的多余容量<br/>vector&lt;type&gt;().swap(vt);<br/>清空vt并释放其占用的容量<br/><br/>条款19：了解相等和等价的区别<br/>相等：基于operator==，xy相等即x==y<br/>等价：基于operator&lt;，xy等价是!(x&lt;y) &amp;&amp; !(y&lt;x)，这是所有排序和插入时执行的比较！<br/>等价是基于在一个有序区间中对象值的相对位置。等价一般在每种标准关联容器（比如，set、multiset、map和multimap）的一部分——排序顺序方面有意义。两个对象x和y如果在关联容器c的排序顺序中没有哪个排在另一个之前，那么它们关于c使用的排序顺序有等价的值。所以要遵循条款21——<br/><br/>条款21: 永远让比较函数对相等的值返回false<br/>比如对于下面这个node类型的结构体<br/>struct node&#123;<br/>&nbsp;&nbsp;int i; <br/>&nbsp;&nbsp;bool operator&lt;(const node &amp;b)const&#123;return i &lt;= b.i&#125;<br/>&#125;;<br/>如果结构体a和b的i值都为10，那么插入set或map的时候，根据等价的判断方式(!(a&lt;b) &amp;&amp; !(b&lt;a))，10和10是不相等的——这样会破坏set和map，使得他们无法再正确运行，同样对于multiset和multimap，find函数也无法返回正确的迭代器了。从技术上说，用于排序关联容器的比较函数必须在它们所比较的对象上定义一个“严格的弱序化(strict weak ordering)”。（传给sort等算法的比较函数也有同样的限制）。<br/><br/>条款22：避免原地修改set和multiset的键<br/>set和multiset保持它们的元素有序，这些容器的正确行为依赖于它们保持有序。 如果你改了关联容器里的一个元素的值（例如，把10变为1000），新值可能不在正确的位置，而且那将破坏容器的有序性。<br/>-&gt;对于map和multimap，标准规定不允许修改，所以试图修改的函数可能会被提示编译错误，最安全的解决办法是删除这个元素，再插入一个新的pair<br/><br/>条款24：当关乎效率时应该在map::operator[]和map-insert之间仔细选择<br/>给定 &#123;map&lt;K, V&gt;m;&#125;，这个表达式--&#123;m[k] = v;&#125; 检查键k是否已经在map里。如果不，就添加上，以v作为它的对应值。如果k已经在map里，它的关联值被更新成v。出于对效率的考虑，当给map添加一个元素时，我们断定insert比operator[]好；而从效率和美学考虑，当更新已经在map里的元素值时operator[]更好。<br/><br/>条款31：了解你的排序选择<br/>sort() 完全的nlogn的不稳定排序(随机化快速排序)<br/>stable_sort() 完全的nlog的稳定排序(归并，效率稍低)<br/>partial_sort() 部分排序，使得满足某顺序判断条件的前多少个元素有序地排在区间前面(不稳定)<br/>nth_element() 分区，使得大于满足某顺序判断条件的前多少个元素(不一定有序)排在区间前面(不稳定)，位置为n的元素是序列中按此顺序判断排列后的第n个元素。<br/><br/>条款32：如果你真的想删除东西的话就在类似remove的算法后接上erase<br/>remove(begin, end)只是把后面的元素覆盖到前面，并不真正删除最后多余的元素（无法使得容器的end()所返回迭代器产生的变化，具体做了什么，参见本条款），它只是将begin, end之间的元素排出移除他们后得到的有效的区间，然后返回有效区间的结尾，同样的是remove_if(begin, end, testfunc)和unique(begin, end)。所以将remove/remove_if/unique放在erase(begin, end)的begin位置，就能保证容器删除多余的元素并正确重置其end()返回迭代器（否则还是指向原先的位置，因为元素并未被删除）。<br/>比如vector&lt;int&gt;vt;<br/>vt.erase(remove(vt.begin(), vt.begin()+6), vt.end());<br/>vt.erase(remove_if(vt.begin(), vt.end(), testfunc), vt.end());<br/>vt.erase(unique(vt.begin(), vt.end()), vt.end());<br/><br/>条款33：提防在指针的容器上使用类似remove的算法<br/>因为remove会产生覆盖，如果你不事先将指针指向的内存删除，那么就会造成内存泄露。<br/><br/>条款34：注意哪个算法需要有序区间<br/>对于非有序区间，调用以下函数一般无法得到你想要的结果<br/>binary_search //二分查找<br/>lower_bound&nbsp;&nbsp;//下界<br/>upper_bound //上界<br/>equal_range //同时查找下届和上界<br/>set_union&nbsp;&nbsp;//集合的并<br/>set_intersection //集合的交<br/>set_difference //集合的差<br/>set_symmetric_difference //集合的对称差 <br/>merge //有序区间的合并<br/>unique //对于连续的重复元素只保留一个<br/><br/>条款43：尽量用算法调用代替手写循环<br/>有三个理由：<br/>效率：算法通常比程序员产生的循环更高效。 <br/>正确性：写循环时比调用算法更容易产生错误。 <br/>可维护性：算法通常使代码比相应的显式循环更干净、更直观。 <br/><br/>条款44：尽量用成员函数代替同名的算法<br/>有些容器拥有和STL算法同名的成员函数。关联容器提供了count、find、lower_bound、upper_bound和equal_range，而list提供了remove、remove_if、unique、sort、merge和reverse。大多数情况下，你应该用成员函数代替算法。这样做有两个理由。首先，成员函数更快。其次，比起算法来，它们与容器结合得更好（尤其是关联容器）。<br/><br/>条款45：注意count、find、binary_search、lower_bound、upper_bound和equal_range的区别<br/>---&gt;建议详读.<br/>count() 返回值等于指定值的元素的个数，O(n)<br/>&nbsp;&nbsp;count回答的问题是：“是否存在这个值，如果有，那么存在几份拷贝？”<br/>find() 返回第一个值等于指定值的元素的迭代器,如果没找到就返回end<br/>&nbsp;&nbsp;find回答的问题是：“是否存在，如果有，那么它在哪儿？”<br/>binary_search() 测试在有序区间中是否存在一个指定值,返回bool类型<br/>&nbsp;&nbsp;binary_search回答这个问题：“它在吗？”它的回答只能是是或者否。<br/>lower_bound() 返回第一个出现这个值的元素的迭代器（如果找到的话）到可以插入这个值的位置（如果没找到）。<br/>&nbsp;&nbsp;lower_bound回答这个问题：“它在吗？如果是，第一个拷贝在哪里？如果不是，它将在哪里？”<br/>upper_bound() 返回最后一次出现这个值的元素之后的位置。<br/>&nbsp;&nbsp;lower_bound回答这个问题：“不管现在有没有和它相等的元素，在保证区间有序的情况下，我要尽可能把它插入到最靠后的位置，这个位置在哪里？”<br/>equal_range() 返回一对迭代器,等于lower_bound返回的迭代器和upper_bound返回的迭代器。对于equal_range的返回值，有两个重要的地方。第一，如果这两个迭代器相同，就意味着对象的区间是空的；这个只没有找到；第二个要注意的是equal_range返回的东西是两个迭代器，对它们作distance就等于区间中对象的数：distance(p.first, p.second)<br/><br/>Tags - <a href="http://www.19880711.com/blog/tag.php?tag=c%252B%252B" rel="tag">c++</a> , <a href="http://www.19880711.com/blog/tag.php?tag=stl" rel="tag">stl</a>
]]>
</description>
</item>
</channel>
</rss>