level 3
<<insied the c++ object model>>看过后如一缕清风扫去一直以来你对语言的疑惑,你终于能明白compiler到底都背着你做了些什么了,这本书要细细回味,比较难啃,最好反复看几遍,加深印象
看完上一本之后,这本<<The design and evolution of c++>>会重演一次当年C++他爹在设计整个语言过程中的历程
level 4
<<the c++ standard library>>是stl的字典,要什么都可以查得到
学c++不能不学stl,那么首先是<<effective stl>>,它和圣经一样是你日常行为的规范
<<generic programming and the stl>>让你从oo向gp转变
光用不行,我们还有必要了解stl的工作原理,那么<<stl源码剖析>>会解决你所有的困惑
level 5
对于c++无非是oo和gp,想进一步提升oo,<<exeptional c++ style>>是一本主席这么多年的经验之谈,是很长esp的
一位stl高手是不能不去了解template的,<<c++ template>>是一本百科全书,足够你看完后对于gp游刃有余
<<modern c++ design>>是太过聪明的人写给明眼人看的
并且,Scott Meyers 在最 近的Top5系列文章中,评价C++历史里面最重要5本书中、把Modern C++ Design列入其中,另外四本是它自己的effective c ++、以及C++ Programming Language、甚至包括《设计模式》和《C++标准文档》。
显然,Scott Meyers已经作为一个顶尖大师的角度承认了<<modern c++ design>>的价值。
**1我有一篇文章寫過:「你看完一齣片長一小時的電影,其實你只看了30分鐘,因為影片在放映時,要捲片,捲片時快門是關閉的,快門在關閉的時間你什麼 也看不到,而這時間至少佔1/2……為什麼有30分鐘看不見任何東西,你卻絲毫不會察覺呢?很多人都說是因為視覺暫留,但很少人想到視覺暫留是雙向的,不 但看見的會延續到看不見之時,看不見的也會延續到看得見之時,因此30分鐘看成60分鐘的結果,就是亮度減半……」
x x x x x
**2 而在另一篇文章我也寫過:「電影雖然每秒連拍24格,但在放映時,為了減輕閃爍,每一格都會投映二次,然後捲片,再投映二次,由於捲片的動作是下拉,因此 每投映二次下拉一格便稱為2-2PullDown……」這些視覺現象正說明了電視系統採用間插掃瞄的經典與必要。
x x x x x
**3 如果看一場60分鐘電影事實只看了30分鐘,那麼不禁我又要說:一具42吋的電漿顯示幕,事實上我們大概也只能看到38吋,甚至還不到,因為它有一部分畫面被黑網給罩住了,這事絕對比看電影只看一半更嘔,因為那黑網你實在難以裝作沒看見。
x x x x x
**4 而與電影相反的,是液晶顯示幕,它總是一幕未去又疊一幕,每一格都是溶進又溶出,Dissolve的結果,使我們在一小時內,看了二小時的重疊畫面,這檔事其實也不見得好受,只是大多數人都見新且喜,以亮麗掩蓋真實。
x x x x x
**5 如果先有電腦再有電視,則電視一定不會是現在的電視,因為電視系統發明的初衷,便是將平面圖形轉成一條線,因為只有變成一條線才能用電來傳(現在的名詞叫 串流),而電視掃瞄成像的關鍵在”即時同步”,也就是說,除了電的傳送延遲外,基本上在家裡看到的電視畫面和電視台是完全”同時”的,但數位化後,這個” 即時同步”的特性就被摧毀了。無需”即時同步”固也有一些好處,卻也產生了一些新的問題。
x x x x x
**6 典型的問題之一,是將場同步變成頁同步後,必須併左腳右腳為一步,結果就失去了應有的平衡。許多人都說:電視的畫面是由60個圖場捉雙成對地組成30格畫 面顯示,事實上這個說法只是算數式的想當然爾。因為兩條腿走路,由左腳到右腳算一步,由右腳到左腳同樣算一步,左右交互而行的最大的好處就是平衡。換言 之,電視的60個圖場即使雙雙組成也是60格畫面,只不過影像如果是動的時候,電視將出現60格”半畫面(場)”,但絕非30格鋸齒狀的”全畫面”。
x x x x x
**6a CRT螢幕最妙的是景物呈現緩慢移動時(如湖上波光、噴泉流水及片尾徐徐上升的字幕….)最美,當影像一被凍結時,感覺就生硬了;相反的,LCD螢幕是在影像完全靜止時最美…..
x x x x x
**7 60 場並成30格的問題是在數位化後才產生的,第一個碰到這問題的是DVD,因為MPG壓縮必須以格進行,說來有點荒謬,因為它有點像強迫馬兒的四條腿雙雙綁 起,變成兩條腿走路一樣。許多人在人模人樣走路的時候,從來沒想過馬走路的方式,其實比人走路高明100倍。儘管馬沒有手,但教馬用只兩條腿走路,多出來 的腿也不可能變成手啊!
x x x x x
**8電視訊號原本是一條串一條串成一長條 的,每一短條間,都有一次同步,可稱為水平小同步,而在262.5個小同步後,更會有一次垂直大同步,同步的作用就是”中斷後從頭再來”。所以只要電視還 是電視,掃瞄線永遠是奇數的,而馬若仍然是馬,就一定用四條腿走路。525 / 625 / 1125條掃瞄線除2後,一定出現0.5條,在262.5條 處被垂直同步中斷後回到上方,自然也由半條處開始,這就形成左右交互而行的間插效果。除非你的雙腳變成輪子,千萬別說兩隻腳走路會搖擺……。
x x x x x
**9 電視訊號進到掃瞄型顯示器上,只要有同步訊號就可將所有的事情搞定,一切都是那麼自然,可是在數位型顯示器上,事情就不單純了。它當然也可以來一行掃(更 新)一行,這是早期大多數480×640液晶電視(通常用於車上)的作法,毋庸置疑的,其畫面品質實在相去NTSC電視應有的品質太遠。原因有兩個:一是 液晶的遲頓反應比起人類的視覺暫留時間要大上許多,因而形成粗糙的齒狀拖尾;另一是480×640的成像矩陣實在太粗糙了。
x x x x x
**10 理論上525條掃瞄線扣除垂直遮沒時間,大約只能看到480條,在A/D時當然就只需取樣480點,但取樣後的每一個點既非方又非圓,它只是一個數據,而 此數據再度成像時,究竟要以圓或方呈現就是個大問題,說得比較簡單一點,CRT的電子束在螢光幕上畫線除了濃淡之外還有粗細變化,可是用馬賽克拼圖,每一 個圖素都只能是一樣大小、一樣的形狀及一樣的間隔,這使得480點實際並拼不出480線。這問題十分有趣,因為總要有一行黑一行白才能形成一條線,但在掃 瞄型顯示器上,經由檢驗圖實測,480條的掃瞄線,居然可分辨出300~350條橫線條(垂直解析度),而在數位型顯示器上,若以相同的檢驗圖進行檢視 時,不只最多只能辨認240線,而且會出現難看的鋸齒。問題就出在馬賽克拼圖時,圖素與圖素間是驟然的變化的,一就是一,二就是二。用以解決鋸齒的方法是 邊緣模糊(True Type字型技術),但為補償邊緣模糊所造成的清晰度損失,必須將數位解析度提升,經實驗結果,將480點提升1.5倍也就是720 點,此時經由模糊後形成的視覺解析度大約和480線掃瞄相當。這也就是為什麼現在大多數數位顯示器的垂直像素多定為720的原因。而明白這點,也就會明白 720等級的顯示器,其成像解析度其實是與525線的CRT相當的。
x x x x x
**10a 相同的原理,也出現在音響上,有許多人不解CD原始取樣率就只有44.1K,播放時超取樣為88.2K甚至176.4K有何意義?事實上超取樣的用意在便於濾波,而濾波在視覺上的功能就是模糊化。
**10b 還有300dpi的熱昇華也遠超過2400dpi甚至4800dpi的噴墨……不過說來也悲哀,因為熱昇華已經慢慢不見了。
x x x x x
**11 繼DVD之後,在液晶顯示器所碰到的併場為格問題更是棘手,因為DVD在編碼時,可以人工設定是電影(24F/S)或電視(60f/S)、要不要去格?甚 至上場或下場優先,而這些資訊也會以旗標方式寫進數位化檔案,使得在播放時,得以順利還原為NTSC格式訊號。可是一架液晶顯示器通常會接上多個訊源,例 如DVD Player、有或無線電視,甚至同一訊源還參雜許多不同類型節目,尤其是電台節目總是電視、電影、廣告、插播胡接一通,再好的邏輯電路都難以 在瞬間辨認節目類型以進行不同的處理,即便是播放DVD也不只是電影,此時Y,Pb,Pr循序輸出,若不逐片設定,便會有錯綁馬腳學人走的尷尬場面出現。
如果有人說:我的電漿只用來看電影……那是他家的事(不要來這裡吵架)。
x x x x x
**12 最近又出現一個說法:《只有點對點的解析度才算真實解析度……》。這個簡單、想當然爾的說法,主要在提醒720等級顯示器的用戶們,如果你不升格到 1080等級,就不能看到HD的真實面貌。儘管現在市上1080等級的顯示器不多,但我不得不更進一步提醒您:480×640的液晶畫面相對於525線 4:3的畫面不也是點對點嗎?既然事實已經證明其畫面品質相去NTSC應有品質甚遠,當你準備升格為1920×1080之前,即使我不明說,你也該知道我 會說什麼啦!
<?php
function display_tree($root) {
// 获得$root节点的左边和右边的值
$result = mysql_query('SELECT lft, rgt FROM tree '.
'WHERE title="'.$root.'";');
$row = mysql_fetch_array($result);
// 以一个空的$right栈开始
$right = array();
// 现在,获得$root节点的所有后序
$result = mysql_query('SELECT title, lft, rgt FROM tree '.
'WHERE lft BETWEEN '.$row['lft'].' AND '.
$row['rgt'].' ORDER BY lft ASC;');
// 显示每一行
while ($row = mysql_fetch_array($result)) {
// 检查栈里面有没有元素
if (count($right)>0) {
// 检查我们是否需要从栈中删除一个节点
while ($right[count($right)-1]<$row['rgt']) {
array_pop($right);
}
}