轉(zhuǎn)自:http://www.douban.com/group/topic/14551517/中科院大博士是如何進(jìn)行文獻(xiàn)檢索和閱讀的(好習(xí)慣受益終生) 一.如何進(jìn)行文獻(xiàn)檢索 我是學(xué)自然科學(xué)的,平時(shí)確實(shí)需要不少外文文獻(xiàn),對(duì)于自然科學(xué)來講英文文獻(xiàn)檢索首推Elsevier,Springer等。雖然這些數(shù)據(jù)庫里面文獻(xiàn)已經(jīng)不算少了。但是有時(shí)還會(huì)碰到查不到的文獻(xiàn),而這些文獻(xiàn)的數(shù)據(jù)庫我們所在研究所或大學(xué)又沒有買,怎么辦?我基本通過以下向個(gè)途徑來得到文獻(xiàn)。 1.首先在Google 學(xué)術(shù)搜索里進(jìn)行搜索,里面一般會(huì)搜出來你要找的文獻(xiàn),在Google學(xué)術(shù)搜索里通常情況會(huì)出現(xiàn)“每組幾個(gè)”等字樣,然后進(jìn)入后,分別點(diǎn)擊,里面的其中一個(gè)就有可能會(huì)下到全文,當(dāng)然這只是碰運(yùn)氣,不是萬能的,因?yàn)槲页3E龅竭@種情況,所以也算是得到全文文獻(xiàn)的一條途徑吧。可以試一下。同時(shí),大家有沒有發(fā)現(xiàn),從Google學(xué)術(shù)搜索中,還可以得到一些信息,Google學(xué)術(shù)搜索中會(huì)顯示出你搜索文章的引用次數(shù),不過這個(gè)引用次數(shù)不準(zhǔn)確,但是從側(cè)面反應(yīng)了這篇文章的質(zhì)量,經(jīng)典文章的引用次數(shù)絕對(duì)很高的.同時(shí)如果你用作者進(jìn)行搜索時(shí),會(huì)按引用次數(shù)出現(xiàn)他寫的全部的文章,就可以知道作者的哪些文章比較經(jīng)典,在沒有太多時(shí)間的情況下,就可以只看經(jīng)典的. 2.如果上面的方法找不到全文,就把文章作者的名字或者文章的title在Google 里搜索(不是Google 學(xué)術(shù)搜索),用作者的名字來搜索,是因?yàn)槲野l(fā)現(xiàn)很多國外作者都喜歡把文章的全文(PDF)直接掛在網(wǎng)上,一般情況下他們會(huì)把自己的文章掛在自己的個(gè)人主頁(home page)上,這樣可能也是為了讓別的研究者更加了解自己的學(xué)術(shù)領(lǐng)域,順便推銷自己吧。這樣你就有可能下到你想要的文獻(xiàn)的全文了。甚至可以下到那個(gè)作者相近的內(nèi)容的其它文章。如果文獻(xiàn)是由多個(gè)作者寫的,第一作者查不到個(gè)人主頁,就接上面的方法查第二作者,以此類推。用文章的title來搜索,是因?yàn)樵趪庥械木W(wǎng)站上,例如有的國外大學(xué)的圖書館可能會(huì)把本校一年或近幾年的學(xué)術(shù)成果的Publication的PDF全文獻(xiàn)掛在網(wǎng)上,或者在這個(gè)大學(xué)的ftp上也有可能會(huì)有這樣類似的全文.這樣就很可能會(huì)免費(fèi)下到你想要的全文了. 3.如果上面兩個(gè)方法都沒有查到你要的文獻(xiàn),那你就直接寫郵件向作者要。一般情況下作者都喜歡把自己的文獻(xiàn)給別人,因?yàn)樗堰@些文獻(xiàn)給別人,也相當(dāng)于在傳播他自己的學(xué)術(shù)思想。下面是本人向老外作者要文獻(xiàn)的一個(gè)常用的模板: Dear Professor ××× I am in ××× Institute of ×××, Chinese Academy of Sciences. I am writing to request your assistance. I search one of your papers: 。。。。。。。。。。。。。。。。。(你的文獻(xiàn)題目) but I can not read full-text content, would you mind sending your papers by E-mail? Thank you for your assistance. Best wishes !(or best regards) ××× 本人的經(jīng)驗(yàn)是講英語的國家的作者給文章的機(jī)率會(huì)大,一般你要就會(huì)給,其它不講英語的國家,如德國,法國,日本等國家的作者可能不會(huì)給。出于禮貌,如果你要的文獻(xiàn)作者E-mail給你了,千萬別忘記回信致謝. 4.最后一種方法其實(shí)大家都熟悉,就是發(fā)貼在小木蟲上求助。我還用另一種方法,就是直接讓我所在的研究所圖書館的管理員幫我從外面的圖書館文獻(xiàn)傳遞。不過有的文獻(xiàn)可能是要錢的。一頁0.3元,由于我們看文獻(xiàn)的錢都是由課題出,所以也就不太考慮錢的問題了。 二.如何快速而準(zhǔn)確地獲得最新的科研信息. 如何快速準(zhǔn)確地從浩如煙海的信息海洋中獲取所需的信息,并學(xué)會(huì)分析、利用信息資源已經(jīng)成為人們立足于信息社會(huì)的一個(gè)重要技能.提高自己在當(dāng)今復(fù)雜的信息世界中準(zhǔn)確、快速地獲取信息的能力,對(duì)我們科研人員是至關(guān)重要的.我們要時(shí)時(shí)刻刻了解最新的科研成果,最主要的途徑還是要了解最新的科研文獻(xiàn),但是對(duì)于我們常用的數(shù)據(jù)庫,我們又不可能每天都去訪問一次數(shù)據(jù)庫來查看是否有最新的文獻(xiàn)出來,而對(duì)于許多國外的數(shù)據(jù)庫.文章的出版效率非常高,有的是每周出幾篇新的文章,有的是每半月出一次,還有一月出一次的,所以大家發(fā)現(xiàn)很難有精力保持每天都去瀏覽數(shù)據(jù)庫.但是大家有沒有發(fā)現(xiàn),國外的數(shù)據(jù)庫有個(gè)很好的服務(wù)功能就是如果你在其數(shù)據(jù)庫的網(wǎng)站上注冊(cè)了郵箱,數(shù)據(jù)庫就會(huì)自動(dòng)在每期有新的文章出來時(shí)把文章的內(nèi)容及鏈接發(fā)到你的郵箱里,直接通知你.這樣就對(duì)我們獲取到最新的信息提供了方便.以Elsevier為例,在數(shù)據(jù)庫網(wǎng)站上有"Alerts"點(diǎn)點(diǎn)擊進(jìn)入,要求你輸入"User Name"和"Password",這是對(duì)已經(jīng)注冊(cè)了郵箱的人進(jìn)行的.如果你還沒有注冊(cè),同樣會(huì)看到右邊有一行英語"If not, Register Now. It's FREE and allows you to"這時(shí)點(diǎn)擊右邊的"Register Now",就可以進(jìn)入進(jìn)行注冊(cè),選擇你要求的期刊以及你所研究的領(lǐng)域等等,當(dāng)然還要填好你接受郵件的郵箱,注冊(cè)成功后,以后就可以收到最新的文獻(xiàn)了,同時(shí)你可以隨時(shí)修改你的接受郵件的郵箱.不僅是象Elsevier這樣的數(shù)據(jù)庫有這個(gè)功能.幾呼所有的外文數(shù)據(jù)庫都有"Email-Alert"這一功能.大家可以試試. 三.如何進(jìn)行文獻(xiàn)閱讀 其實(shí)做科研,不看文獻(xiàn)要做好科研,可以說一點(diǎn)可能都沒有。只有廣看論文,深入學(xué)習(xí),才能厚積薄發(fā),寫出響當(dāng)當(dāng)?shù)奈恼鲁鰜怼Wx文獻(xiàn)一定不要心浮氣躁,或者就是想著混個(gè)畢業(yè)。相反我們要沉下心來,大量閱讀文獻(xiàn),在讀的過程中有的文獻(xiàn)看懂了,但是看不懂的文獻(xiàn)也可能會(huì)居多。看懂的認(rèn)真學(xué)習(xí)借鑒,看不懂的 深入探索,實(shí)在不行就暫時(shí)放下,過一段時(shí)間,隨著知識(shí)和能力的提高慢慢也就弄明白了一些。即使還是看不懂,但是心里知道有那么回事,為將來的繼續(xù)深造做了鋪墊。另外千萬不要只是為看文獻(xiàn)而看文獻(xiàn),我們看的目的是為了能為我們自己的科研所用,所以看的過程中一定要和你自己的數(shù)據(jù)相結(jié)合,當(dāng)看完一篇文獻(xiàn)后,要好好總結(jié),如果用自己的數(shù)據(jù),又該怎么樣解釋。還有一些牛刊物上的文章,不但要學(xué)習(xí)文章里面的知識(shí),還要學(xué)習(xí)牛人寫文章的文風(fēng)。好的文章肯定會(huì)有好的文風(fēng),這些都是我們將來寫文章要學(xué)習(xí)的。 另外相信很多搞科研的同行會(huì)有個(gè)感覺,就是看過的文獻(xiàn),如果只是做做標(biāo)記,劃下劃線,還是很容易忘記,過段時(shí)間要查詢起來也費(fèi)事。尤其是看過的文獻(xiàn)有幾百,上千篇時(shí),雖然可以歸類整理,但效果還是不好。 我建議大家邊看一篇文獻(xiàn)時(shí),邊打開word文檔,邊整理文章出彩和重要的部分,然后復(fù)制過去,標(biāo)上文獻(xiàn)的標(biāo)題和作者等相關(guān)信息,把每一類文獻(xiàn)歸為一組。 方法操作簡單,將來要查詢和反復(fù)的時(shí)候會(huì)有很大幫助,尤其在寫文章時(shí),相關(guān)文獻(xiàn)及其亮點(diǎn)都一目了然。這個(gè)方法積累久了,對(duì)提升寫作和閱讀都有很大幫助,除了這樣,我還有時(shí)把一些很經(jīng)典的段落或都語句翻譯成中文,專門整理在一個(gè)本本上,這樣不但在以后寫文章時(shí)直接拿出來看,省事省時(shí)間,還能錘煉英漢互譯的能力,很有利于以后你和老外交流時(shí)的口語表達(dá)。 最后,請(qǐng)大家始終記住,我們查文獻(xiàn)都是為了科研,千萬不要只查不看,費(fèi)了那么大勁查到了就一定要看完.就算是你大概的看了一下也是有用的.同樣對(duì)科學(xué)問題要辯證的看待,文獻(xiàn)上別人的觀點(diǎn)也只是一家之言,而且不要迷信權(quán)威. “ 科學(xué)本身是人類的一種實(shí)踐。科學(xué)研究是一個(gè)思考過程。科學(xué)行動(dòng)則是推行某種思考過程的活動(dòng),其目的是為了檢驗(yàn)這些思考過程的有效性,進(jìn)而修正和改善這些思考過程,以期達(dá)到最高的認(rèn)識(shí)。像一切科學(xué)實(shí)踐一樣,科學(xué)的判斷力取決于個(gè)人的經(jīng)驗(yàn)、信仰和情緒。 我們中間的許多人,或者說我們?nèi)w,在我們的專業(yè)經(jīng)歷中,都犯過這樣或那樣的錯(cuò)誤。科學(xué)工作者應(yīng)當(dāng)有虛懷若谷的精神,敢于摒棄先入之見,敢于擺脫對(duì)錯(cuò)誤思想感情上的依附. NO.2 這是一位出國留學(xué)博士生的學(xué)習(xí)體會(huì),放到師生互動(dòng)欄目里與大家交流、分享。 這是我受網(wǎng)上一篇文章的啟發(fā)并結(jié)合我們專業(yè)的特點(diǎn),寫的一點(diǎn)個(gè)人體會(huì),希望對(duì)大家有所裨益。 要在高起點(diǎn)上開展學(xué)術(shù)研究,閱讀英文原文是不可或缺的環(huán)節(jié)。英文文獻(xiàn)閱讀的重要性不需贅述,國內(nèi)多數(shù)理工科院校的研究已經(jīng)實(shí)現(xiàn)了和國際的接軌,管理和經(jīng)濟(jì)學(xué)科相對(duì)滯后,但是部分團(tuán)隊(duì)已經(jīng)走在前列。 中文文獻(xiàn)看多了之后就會(huì)發(fā)現(xiàn)很多內(nèi)容似曾相識(shí),英文文獻(xiàn)在內(nèi)容的廣度和深度方面更勝一籌。閱讀英文文獻(xiàn)的目的不是為了論文增加幾個(gè)參考文獻(xiàn)而看上去好看,當(dāng)然國內(nèi)有些人是這么做的,更有甚者為了增加英文參考文獻(xiàn)而引用二手或者三手文獻(xiàn),在轉(zhuǎn)引過程中漏洞百出。廣泛閱讀英文文獻(xiàn)是提高綜合能力及水平,優(yōu)化知識(shí)結(jié)構(gòu),轉(zhuǎn)換思維方式,拓展研究視野的必由之路,當(dāng)然最重要的是將國際先進(jìn)和中國實(shí)際相結(jié)合。 (1)英文原文讀不懂怎么辦? 其實(shí)我以前也根本沒讀過原文,也看不懂。這兒有個(gè)好辦法:找一本中文經(jīng)典的書籍,僅看某一節(jié)你感興趣或與你相關(guān)的內(nèi)容,然后先找一兩篇英文的綜述(review)認(rèn)真閱讀一下,不會(huì)的單詞可用金山詞霸查一查,也許你讀第一篇文章需要花兩天,你過兩天再讀第2遍時(shí),你也許只要一天;然后你再讀第2篇時(shí)也許你只要半天!然后你一定會(huì)真正發(fā)現(xiàn)讀英文文獻(xiàn)的快感!(引用部分) 我和這位作者有相同的體會(huì),剛開始閱讀的時(shí)候可能有些困難,當(dāng)你經(jīng)過一個(gè)時(shí)期的訓(xùn)練之后,就會(huì)很快進(jìn)入狀態(tài),并且感覺受益良多。 (2)我們需要閱讀什么樣的文獻(xiàn)? 雖然英文文獻(xiàn)總體上水平比較高,但并不是所有的文獻(xiàn)都值得閱讀,閱讀文獻(xiàn)的前提是能夠檢索到對(duì)你有價(jià)值的文獻(xiàn)。第一步知道如何檢索文獻(xiàn),現(xiàn)在學(xué)校的英文數(shù)據(jù)庫平臺(tái)很多,可以嘗試檢索和合理利用。當(dāng)然機(jī)器檢索不能完全找到和主題相關(guān)的文章,需要擴(kuò)大檢索范圍,然后認(rèn)真閱讀摘要,篩選和自己工作相關(guān)的文獻(xiàn)。第二步知道如何確定文章的價(jià)值,這和中文文獻(xiàn)閱讀具有相似之處,首先是重要期刊的文章,其次是著名學(xué)者的文章。例如在國家創(chuàng)新體系領(lǐng)域,Lundvall\Freeman\Nalson\OECD\Porter等這些重要的作者和機(jī)構(gòu)的文獻(xiàn)是必讀的,不僅要精讀他們的經(jīng)典文獻(xiàn),而且要追蹤其最新研究成果,包括工作論文、討論稿等。通過對(duì)重要作者的研究和經(jīng)典文獻(xiàn)的閱讀能給你打開一扇門,讓你進(jìn)入一個(gè)由核心作者、相關(guān)作者、主要期刊和主要研究機(jī)構(gòu)形成的學(xué)術(shù)網(wǎng)絡(luò)。 (3)閱讀英文文獻(xiàn)需要持之以恒 英文文獻(xiàn)的閱讀需要持之以恒。不只是為了寫文章或者做項(xiàng)目才去檢索和閱讀文獻(xiàn),而是需要貫穿于研究生學(xué)習(xí)的全過程。這是選題和把握前沿領(lǐng)域的重要途徑,同時(shí)也可以提高自己的英文閱讀能力。當(dāng)然,文獻(xiàn)閱讀的效果不會(huì)在短期內(nèi)顯現(xiàn)出來,不能說讀了幾篇英文文獻(xiàn)就怎么樣,但是當(dāng)你把英文文獻(xiàn)作為主要閱讀對(duì)象時(shí),可能會(huì)漸漸發(fā)生變化。 有些中文文獻(xiàn)存在不足之處,例如,數(shù)據(jù)可靠性差、觀點(diǎn)(判斷)不可檢驗(yàn);方法運(yùn)用存在缺陷;文獻(xiàn)綜述不全面等。對(duì)于多數(shù)社會(huì)科學(xué)而言我們最終還是要研究中國問題,中文文獻(xiàn)是入門的基礎(chǔ),國內(nèi)重要期刊的文章仍然需要有一個(gè)全面的了解。 如果平時(shí)讀得多了,自然會(huì)有感覺,找更高級(jí)別雜志的文章讀。國外著名的科學(xué)家一般都有一個(gè)習(xí)慣,即每周都認(rèn)真讀1-2篇Science, Nature, Cell等高級(jí)別文章。這個(gè)習(xí)慣希望每個(gè)人都能保持!而且Science對(duì)中國人是免費(fèi)的!Nature中也有許多內(nèi)容是免費(fèi)的,即使沒有密碼之類,也能得到大量有用的信息呀。臨床的同志一定要讀讀The lancet和新英格蘭雜志!這兩本簡直太經(jīng)典了! NO.3 如何閱讀外文文獻(xiàn)? 本人是學(xué)經(jīng)濟(jì)的.看了大量的外文文獻(xiàn).開始時(shí)也覺得效率低,不是單詞不認(rèn)識(shí),而是看了后面忘了前面.后來摸索出了一些方法,和大家共享. 三步驟: 首先,通讀各個(gè)小標(biāo)題.通常英文文獻(xiàn)都很長.拿來文獻(xiàn),先把各個(gè)小標(biāo)題串一串.弄清楚內(nèi)在的聯(lián)系. 其次,跳進(jìn)去讀各個(gè)小標(biāo)題內(nèi)的內(nèi)容.標(biāo)注是必不可少的,就是在必要的段落標(biāo)示出作者的觀點(diǎn).這是為了第三步做準(zhǔn)備. 最后,跳出來,再把全文串一遍.根據(jù)做好的標(biāo)示做好閱讀摘要. 這樣就完成了. 【轉(zhuǎn)帖:讀外文文獻(xiàn)的一點(diǎn)體會(huì)】 PS:一直不會(huì)看外文文獻(xiàn),學(xué)學(xué)人家。 本人英語基礎(chǔ)不好,沒過六級(jí),所以在碩士的時(shí)候基本上看的外文文獻(xiàn)很少,現(xiàn)在想想很后悔,2年的時(shí)間少學(xué)了很多東西。上了博士,自己給自己的定位也高一些了,開始打算硬著頭皮咬著牙很不情愿的也要多看些外文文獻(xiàn),一開始看比較慢,有些很難理解,到現(xiàn)在大約仔細(xì)閱讀了100篇外文文獻(xiàn),泛讀了100篇外文文章,受益匪淺,現(xiàn)在基本不怎么看中文的了,確實(shí)也覺得外文的質(zhì)量就是高(也有湊數(shù)的爛文章),現(xiàn)在自己寫外文的也很順手了。談幾點(diǎn)自己的體會(huì)。 1.先找5篇跟自己論文最相關(guān)的外文文章,花一個(gè)月的時(shí)間認(rèn)認(rèn)真真的看,反復(fù)看,要求全部讀懂,不懂的地方可以和同學(xué)和老師交流一下。一個(gè)月以后你已經(jīng)上路了。 2.如何讀標(biāo)題:不要忽視一篇論文的標(biāo)題,看完標(biāo)題以后想想要是讓你寫你怎么用一句話來表達(dá)這個(gè)標(biāo)題,根據(jù)標(biāo)題推測一下作者論文可能是什么內(nèi)容。有時(shí)候一句比較長的標(biāo)題讓你寫,你可能還不會(huì)表達(dá)。下次你寫的時(shí)候就可以借鑒了 3.如何讀摘要:快速瀏覽一遍,這里主要介紹這篇文章做了些什么。也許初看起來不好理解,看不懂,這時(shí)候不要?dú)怵H,不管它往下看,等你看完這篇文章的時(shí)候也許你都明白了。因?yàn)檎獙懙暮芎啙崳÷粤撕芏嗲疤岷蜅l件,在你第一眼看到摘要而不明白作者意圖的時(shí)候看不懂是正常的。 4.如何讀引言(前言):當(dāng)你了解了你的研究領(lǐng)域的一些情況,看引言應(yīng)該是一件很容易的事情了,都是介紹性的東西,寫的應(yīng)該都差不多,所以看文獻(xiàn)多了以后看這部分的內(nèi)容就很快了,一掃而過。有些老外寫得很經(jīng)典得句子要記下了,下次你寫就可以用了。 5.如何讀材料及試驗(yàn):當(dāng)你文獻(xiàn)看多了以后,這部分內(nèi)容也很簡單了,無非就是介紹試驗(yàn)方法,自己怎么做試驗(yàn)的。很快就能把它看完了吧 6.如何看試驗(yàn)結(jié)果:看結(jié)果這部分一定要結(jié)合結(jié)果中的圖和表看,這樣看的快。主要看懂試驗(yàn)的結(jié)果,體會(huì)作者的表達(dá)方法(例如作者用不同的句子結(jié)構(gòu)描述一些數(shù)字的結(jié)果)。有時(shí)看完以后再想想:就這么一點(diǎn)結(jié)果,別人居然可以大篇幅的寫這么多,要是我可能半頁就說完了? 7.如何看分析與討論:這是一篇文章的重點(diǎn),也是最花時(shí)間的。我一般把前面部分看完以后不急于看分析討論。我會(huì)想要是我做出來這些結(jié)果我會(huì)怎么來寫這部分分析與討論呢?然后慢慢看作者的分析與討論,仔細(xì)體會(huì)作者觀點(diǎn),為我所用。當(dāng)然有時(shí)候別人的觀點(diǎn)比較新,分析比較深刻,偶爾看不懂也是情理之中。當(dāng)你看的多了,你肯定會(huì)看的越來越懂,自己的idea越來越多 8.如何看結(jié)論:這個(gè)時(shí)候看結(jié)論就一目了然了,作后再反過去看看摘要,其實(shí)差不多 9.把下載的論文打印出來,根據(jù)與自己課題的相關(guān)性分三類,一類要精讀,二類要泛讀,三類要選擇性的讀。分別裝訂在一起 10.看完的文獻(xiàn)千萬不要丟在一邊不管,3-4個(gè)月一定要溫習(xí)一遍,可以根據(jù)需要,對(duì)比自己的試驗(yàn)結(jié)果來看 11.學(xué)會(huì)記筆記,重要的結(jié)論,經(jīng)典的句子,精巧的試驗(yàn)方案一定要記下來,供參考和學(xué)習(xí) 12.有些試驗(yàn)方法相同,結(jié)論不同的文獻(xiàn),可以批判性的閱讀。我想要是你自己做試驗(yàn)多的話,你應(yīng)該有這個(gè)能力判斷誰的更對(duì)一點(diǎn)。出現(xiàn)試驗(yàn)方法相同,結(jié)論不同的原因有下:試驗(yàn)方法描述不詳細(xì),可能方法有差別;試驗(yàn)條件不一樣;某些作者夸大結(jié)果,瞎編數(shù)據(jù) 13.有時(shí)間還是多看點(diǎn)文獻(xiàn)吧,最好定個(gè)目標(biāo):在學(xué)術(shù)上超過自己的老板。因?yàn)槔习逡话悴豢次墨I(xiàn),他們都是憑經(jīng)驗(yàn)做事,很多新東西他們都不知道,慢慢的你老板會(huì)覺得你很厲害。 反正我覺得多讀了,讀起來就快了,而且也會(huì)慢慢喜歡上看外文文獻(xiàn),收獲自然也就多了。 可能寫得有點(diǎn)亂,湊合看吧,我們一起奮斗!!!
posted @
2012-05-21 21:16 mengkai 閱讀(335) |
評(píng)論 (0) |
編輯 收藏
摘要: 源地址:http://blog.csdn.net/v_july_v/article/details/7577684http://blog.csdn.net/v_july_v/article/details/6142146
數(shù)據(jù)挖掘領(lǐng)域十大經(jīng)典算法初探
第一篇:從決策樹學(xué)習(xí)談到貝葉斯分類算法、EM、HMM
引言
最近在面...
閱讀全文
posted @
2012-05-21 20:14 mengkai 閱讀(723) |
評(píng)論 (0) |
編輯 收藏
最近在學(xué)opencv,先用vc6.0+opencv1.0,可以根據(jù)opencv論壇上的步驟配置完成,下面記錄了配置過程。
下面是介紹如何安裝opencv1.0
1 下載OpenCv1.0,可以在這里下載:http://www.opencv.org.cn/download/OpenCV_1.0.exe
2 安裝OpenCv1.0,可以安裝在D:\opencv1.0\OpenCV(用戶可以自己選擇),
3 在安裝是勾選Add\OpenCV\bin to the systerm PATH(將\OpenCV\bin加入系統(tǒng)變量)
4 添加環(huán)境變量,右擊我的電腦,選擇屬性,點(diǎn)擊高級(jí)選項(xiàng)卡,點(diǎn)擊環(huán)境變量,在用戶變量下找到path(沒有的話新建),點(diǎn)擊編輯,在變量值的最后添加 D:\opencv1.0\OpenCV\bin,然后點(diǎn)擊確定,重啟電腦。
5 下載cxcore100.dll文件,可在以下網(wǎng)站下載:
http://www.codefans.net/dll/download.php?id=1425&type=wj
然后將文件cxcore100.dll以及安裝目錄D:\opencv1.0\OpenCV\bin下的highgui100.dll,libguide40.dll拷貝到C:\WINDOWS\system32目錄下。
下面就是介紹vc6.0下配置opencv1.0
一 在VC編譯器下,在Project菜單下選擇setting,彈出對(duì)話框。
1 設(shè)置預(yù)編譯的頭文件
選擇C/C++ 【Category】,在下拉菜單中選擇Preprocessor,然后在Additional Include directories 中輸入以下幾項(xiàng):
C:\Program Files \OpenCV\cv\include (根據(jù)本人機(jī)器上OpenCV的安裝路徑進(jìn)行設(shè)置,如在D盤,則寫D: ,以下同)
C:\Program Files \OpenCV\otherlibs\highgui
C:\Program Files \OpenCV\cxcore\include(新版本需要)
C:\Program Files \OpenCV\otherlibs\cvcam\include
每一條之間用逗號(hào)隔開。其中C:\Program Files\Intel\opencv 為OpenCV的安裝路徑,這是通用的安裝路徑,建議最好采用這種設(shè)置,以方便大家交流;不然,每次都要重新設(shè)置路徑,比較麻煩。
2 設(shè)置鏈接庫
在 Link按鍵下的 Category下拉菜單中選擇 Input選項(xiàng)(指定要連接的庫文件,放棄連接的庫文件hao ),在Additional library path中,輸入:
C:\Program Files \OpenCV\lib
最后在 Setting For下拉菜單中依次選擇 Win32 Debug和 Win32 Release,分別在Object /library modules 輸入:
cv.lib highgui .lib cxcore.lib cvcam.lib
注意每個(gè)庫之間用一個(gè)空格隔開。
或者直接在all configurations中的Object /library modules 輸入:cv.lib highgui.lib cxcore.lib(新版本需要) cvcam.lib
(cxcore.lib highgui.lib 是幾乎所有OpenCV程序都要用到的函數(shù)庫,分別封裝了基本的函數(shù)和圖形界面接口,cv.lib中封裝了大量的圖像處理函數(shù),cvcam.lib中封裝了很多針對(duì)視頻流的處理函數(shù))
當(dāng)前工程就可以使用OpenCV的函數(shù)了。
二 如果一直要使用OpenCV的函數(shù),把其路徑設(shè)置到系統(tǒng)目錄下
在Tools 菜單下選擇 Options 子菜單,在彈出的對(duì)話框中選擇Directory,將用到的幾個(gè)庫的路徑添加進(jìn)去。以后只需將所用的庫在Object /library modules下輸入就可以了,不用再每次指定路徑。
在Show directories for 下拉菜單中選擇Include files,輸入:
C:\Program Files \OpenCV\cv\include
C:\Program Files \OpenCV\otherlibs\highgui
C:\Program Files \OpenCV\cxcore\include(新版本需要)
C:\Program Files \OpenCV\otherlibs\cvcam\include
在Show directories for 下拉菜單中選擇Library files,輸入:
C:\Program Files \OpenCV\lib
注意:(防止每次都拷貝.dll文件)
-
安裝OpenCv是一定要勾選Add\OpenCV\bin to the systerm PATH
-
配置VC6.0時(shí)要選擇用戶自己的OpenCv安裝路徑。
-
編寫OpenCv程序時(shí),要手動(dòng)添加lib文件,否則編譯不會(huì)通過。
posted @
2012-03-03 21:02 mengkai 閱讀(4099) |
評(píng)論 (0) |
編輯 收藏
回來已經(jīng)不知不覺一個(gè)月了,但是根本沒有找到感覺,自我定位還是不明確,所以需要寫點(diǎn)計(jì)劃
在網(wǎng)上看到很多人都寫了自己的學(xué)期計(jì)劃,大多目標(biāo)都很明確。我剛開學(xué)的時(shí)候思想的很浮動(dòng),混亂了一段時(shí)間,做很多事情效率都很低。到現(xiàn)在已經(jīng)過去四周的時(shí)間了,經(jīng)過一些思考,基本上也有了一套學(xué)習(xí)計(jì)劃。
第一是英語,以前的我沒有重視英語真是一個(gè)大大的錯(cuò)誤,雖然不是很喜歡,但是每天還是要花些時(shí)間學(xué)習(xí),畢竟六級(jí)還沒有過去,雖然聽說比考試更重要,但是還得需要一個(gè)成績來證明這些成果。
第二是算法,為以后的就業(yè)和找工作做好鋪墊。要多看一些算法的書籍,來加強(qiáng)自己在算法方面的不足,數(shù)據(jù)結(jié)構(gòu)更要努力。有機(jī)會(huì)一定多讀讀算法導(dǎo)論這邊書。
第三是操作系統(tǒng),順便需要看看匯編,現(xiàn)在感覺操作系統(tǒng)和匯編有著緊密的聯(lián)系,而且對(duì)編程有著事半功倍的效果,需要仔細(xì)看看。
第四是計(jì)算機(jī)組成原理,需要鞏固這方面的知識(shí),此外需要深入計(jì)算機(jī)體系結(jié)構(gòu)這邊書,是相當(dāng)?shù)慕?jīng)典,需要慢慢的去琢磨。
第四是linux,這方面比較欠缺,所以需要下點(diǎn)功夫。
第五是windows編程以及畢業(yè)設(shè)計(jì)相關(guān)的東西opencv,網(wǎng)絡(luò)編程博大精深,需要慢慢的去研究,目標(biāo)跟蹤是我選的題目需要搭起框架,在目標(biāo)跟蹤算法進(jìn)一步作出選擇和改進(jìn)。
我沒有想好去大公司還是剛起步的小公司,只是努力把自己的基礎(chǔ)搞好,希望入職的時(shí)候可以有一個(gè)好的薪水,能夠未來能養(yǎng)活自己的家庭老婆。
posted @
2012-03-03 20:54 mengkai|
編輯 收藏
對(duì)于斐波那契數(shù)列的求解過程的幾種方法的比較
(1)最基本的方法:遞歸實(shí)現(xiàn),使用公式為f[n] = f[n-1] + f[n-2];遞歸
結(jié)束條件是f[1]=1,f[2]=1。
(2)數(shù)組實(shí)現(xiàn):空間復(fù)雜度和時(shí)間復(fù)雜度都是O(N),效率一般,比遞歸來
的快。
(3)vector<int>實(shí)現(xiàn),時(shí)間復(fù)雜度是O(N),空間復(fù)雜度O(1),但是不知道
效率會(huì)高不高,當(dāng)然vector有自己的屬性會(huì)占用資源。
(4)queue<int>實(shí)現(xiàn),當(dāng)然隊(duì)列數(shù)組更適合實(shí)現(xiàn)斐波那契數(shù)列,時(shí)間復(fù)雜度
和空間復(fù)雜度和vector一樣。但是queue太合適這里了,
f(n)=f(n-1)+f(n-2),f(n)只和f(n-1)和f(n-2)有關(guān),f(n)入隊(duì)列后,f(n-
2)就可以出隊(duì)列了。
(5)迭代實(shí)現(xiàn):迭代效率最高,時(shí)間復(fù)雜度是O(N),空間復(fù)雜度是O(1),
(6)百度的提供的一種公式法。 由于double類型的精度還不夠,所以程
序算出來的結(jié)果會(huì)有誤差,如果把公式展開計(jì)算,得出的結(jié)果就是正確的。
具體代碼如下:
//遞歸
int fib1(int num)
{
if(num<1)
return -1;
if(num == 1 || num == 2)
return 1;
return f(n-1)+f(n-2);
}
//數(shù)組實(shí)現(xiàn)
int fib2(int num)
{
if(num<1)
return -1;
if(num<3)
{
return 1;
}
int *a = new int[num];
a[0] = a[1] = 1;
for(int i = 2;i<num;i++)
a[i] = a[i-1] + a[i-2];
int ret = a[num-1];
delete[] a;
return ret;
}
//vector<int>
int fib3(int num)
{
if(num<1)
return -1;
vector<int>a(2,1);
a.reserve(3);
for(int i = 2;i<num;i++)
{
a.insert(a.begin(),a.at(0)+a.at(1));
a.pop_back();
}
return a.at(0);
}
//queue<int>實(shí)現(xiàn)
int fib4(int num)
{
if(num<1)
return -1;
queue<int>q;
q.push(1);
q.push(1);
for(int i = 2;i<num;i++)
{
q.push(q.front()+q.back());
q.pop();
}
return q.pop();
}
//迭代實(shí)現(xiàn)
int fib5(int num)
{
int i,a=1,b = 1,c = 1;
if(num<1)
return -1;
for(i = 2;i<num;i++)
{
c= a + b;
a = b;
b = c;
}
return c;
}
//公式實(shí)現(xiàn)
int fib6(int num)
{
double gh = sqrt((double)5);
return pow(1+(1+gh),n-pow(1-gh))/(pow((double)2,n)*gh);
}
posted @
2011-10-26 17:46 mengkai 閱讀(903) |
評(píng)論 (0) |
編輯 收藏
遞歸算法:基本含義,一個(gè)函數(shù)或者數(shù)學(xué)結(jié)構(gòu),如果在其定義或說明內(nèi)部直接或間接得出現(xiàn)對(duì)其本身的引用,或者是為了描述問題的某一個(gè)狀態(tài),必須要用它的上一個(gè)狀態(tài),而描述上一個(gè)狀態(tài),又必須用到它的上一個(gè)狀態(tài),這種定義,稱為遞歸或遞歸定義。在程序設(shè)計(jì)上,當(dāng)函數(shù)直接調(diào)用本身或者間接調(diào)用本身,稱為遞歸調(diào)用。
遞歸的最簡單應(yīng)用:通過各項(xiàng)關(guān)系及初值求數(shù)列的某一項(xiàng)。(1)
比如階乘數(shù)列
1、2、6、24、120、720……
如果用上面的方式來描述它,應(yīng)該是:
,程序?qū)崿F(xiàn)
int fun(int x)
{
if(x == 1)
return 1;
return n*fun(n-1);
}
(2)找出組合數(shù)
找出從自然數(shù)1、2、……、n中任取r個(gè)數(shù)的所有組合。例如n=5,r=3的所有組合為:
(1)5、4、3 (2)5、4、2 (3)5、4、1
(4)5、3、2 (5)5、3、1 (6)5、2、1
(7)4、3、2 (8)4、3、1 (9)4、2、1
(10)3、2、1
如何實(shí)現(xiàn)呢?
首先分析10個(gè)組合,我們可以采用遞歸來實(shí)現(xiàn),假設(shè)函數(shù)為combo(int m,int n);為找到自然數(shù)1-m中任取K個(gè)數(shù)組合,當(dāng)?shù)谝粋€(gè)數(shù)選定后,后面的k-1個(gè)數(shù)是從m-1各數(shù)中選擇得到。我們發(fā)現(xiàn)這將是將m選k個(gè)數(shù)轉(zhuǎn)換為m-1個(gè)數(shù)中選k-1個(gè)數(shù)的組合數(shù)。為了解決此問題,我們可以定義個(gè)數(shù)組A,數(shù)組的第一個(gè)元素為k,約定函數(shù)將確定的k個(gè)數(shù)字的組合第一個(gè)數(shù)放在A[k]中,當(dāng)一個(gè)組合求出后,才將數(shù)組A的一個(gè)組合輸出,第一個(gè)數(shù)可以是m-k,函數(shù)將確定組合的第一個(gè)數(shù)放入數(shù)組后,有兩種可能的選擇,因還未到頂組合的其余元素,繼續(xù)遞歸確定,或因一確定了組合的全部元素,輸出這個(gè)組合,
具體代碼:
//遞歸求解組合數(shù)
#define MAX 100
int a[MAX];
void combo(int m,int k)
{
int i,j;
for (i = m;i>=k;i--)
{
a[k] = i;
if (k>1)
{
comb(m-1,k-1);
}
else
{
for (j = a[0];j>0;j--)
{
printf("%4d",a[j]);
}
printf("\n");
}
}
}
更多的練習(xí),
前幾天在博客園看到有人面試時(shí),遇到遞歸算法題,一時(shí)手癢就解了一個(gè)。順便網(wǎng)上又找來幾個(gè),也實(shí)現(xiàn)了。給大家分享一下,開闊一下思路,沒準(zhǔn)你明天面試就能用上。
1、編寫一個(gè)方法用于驗(yàn)證指定的字符串是否為反轉(zhuǎn)字符,返回true和false。請(qǐng)用遞歸算法實(shí)現(xiàn)。(反轉(zhuǎn)字符串樣式為"abcdedcba")
2、一列數(shù)的規(guī)則如下: 1、1、2、3、5、8、13、21、34...... 求第30個(gè)是多少
3、一列數(shù)的規(guī)則如下: 1、12、123、1234、12345、123456......,求第n個(gè)數(shù)的遞歸算法(n<=9)。
4、將一整數(shù)逆序,如987654321變?yōu)?23456789。
5、一個(gè)射擊運(yùn)動(dòng)員打靶,靶一共有10環(huán),連開10槍打中90環(huán)的可能行有多少種?
posted @
2011-10-22 21:22 mengkai|
編輯 收藏
剛不容易寫了幾百字的日志,總結(jié)了最近兩周的心情,結(jié)果網(wǎng)速不好沒有提交上有沒有備份。哎人倒霉喝水都塞牙
posted @
2011-10-14 20:47 mengkai|
編輯 收藏
關(guān)于#include "stdafx.h"
(1)Standard Application Frame Extend沒有函數(shù)庫,只是定義了一些環(huán)境參數(shù),使得編譯出來的程序能在32位的操作系統(tǒng)環(huán)境下運(yùn)行。Windows和MFC的include文件都非常大,即使有一個(gè)快速的處理程序,編譯程序也要花費(fèi)相當(dāng)長的時(shí)間來完成工作。由于每個(gè).CPP文件都包含相同的include文件,為每個(gè).CPP文件都重復(fù)處理這些文件就顯得很傻了。為避免這種浪費(fèi),AppWizard和VisualC++編譯程序一起進(jìn)行工作,如下所示:
1.AppWizard建立了文件stdafx.h,該文件包含了所有當(dāng)前工程文件需要MFCinclude 文件。且這一文件可以隨被選擇的選項(xiàng)而變化。
2.AppWizard然后就建立stdafx.cpp。這個(gè)文件通常都是一樣的。
3.然后AppWizard就建立起工程文件,這樣第一個(gè)被編譯的文件就是stdafx.cpp。
4當(dāng)VisualC++編譯stdafx.cpp文件時(shí),它將結(jié)果保存在一個(gè)名為stdafx.pch的文件里。(擴(kuò)展名pch表示預(yù)編譯頭文件。)( 預(yù)編譯頭文件通過編譯stdafx.cpp生成,以工程名命名,由于預(yù)編譯的頭文件的后綴是“pch”,所以編譯結(jié)果文件是projectname.pch。)
5.當(dāng)VisualC++編譯隨后的每個(gè).cpp文件時(shí),它閱讀并使用它剛生成的.pch文件。
VisualC++不再分析Windows include文件,除非你又編緝了stdafx.cpp或stdafx.h。這個(gè)技術(shù)很精巧,你不這么認(rèn)為嗎?(還要說一句,Microsoft并非是首先采用這種技術(shù)的公司,Borland才是。)在這個(gè)過程中你必須遵守以下規(guī)則:
1.你編寫的任何.cpp文件都必須首先包含stdafx.h。
2.如果你有工程文件里的大多數(shù).cpp文件需要.h文件,順便將它們加在stdafx.h(后部)上,然后預(yù)編譯stdafx.cpp。
3.由于.pch文件具有大量的符號(hào)信息,它是你的工程文件里最大的文件。
如果你的磁盤空間有限,你就希望能將這個(gè)你從沒使用過的工程文件中的.pch文件刪除。執(zhí)行程序時(shí)并不需要它們,且隨著工程文件的重新建立,它們也自動(dòng)地重新建立
(2)stdafx.h文件中包含了一些必要的頭文件(如afxwin.h),對(duì)應(yīng)于stdafx.h有一個(gè)stdafx.cpp文件,該文件內(nèi)包含一句: #include "stdafx.h",其作用是令編譯器編譯出一個(gè)stdafx.obj預(yù)編譯頭文件(pre-compile header,需要設(shè)置編譯選項(xiàng)),在下次編譯時(shí)以降低總的編譯時(shí)間。若使用ClassWizard定義新類,則有可能在stdafx.h中增加新的 include files。比如,若選用MFC template classes,stdafx.h中便會(huì)增加:#include <afxtempl.h>。
(3)注:1.afxwin.h是MFC編程的必需文件,其中包含如CString,CEdit類運(yùn)行所必需的頭文件,最好保證該句在頭文件首行;它還會(huì)調(diào)用windows.h,改頭文件包含有數(shù)據(jù)類型的定義、API入口點(diǎn)定義和其它有用的參數(shù)信息;
2.非MFC工程使用MFC庫時(shí)最常見的問題就是windows.h重復(fù)包含錯(cuò)誤:fatal error C1189: #error : WINDOWS.H already included. MFC apps must not #include <windows.h>;
3.#define WIN32_LEANAND_MEAN,在windows的頭文件中拒絕接受MFC類庫,以加速編譯時(shí)間;
4.afx - afx中的af指的是Application Frame的縮寫,曾經(jīng)有一個(gè)技術(shù)開發(fā)團(tuán)隊(duì)專門作Application Frame,后來給這個(gè)團(tuán)隊(duì)命名用afx,x本身沒有含義,只不過構(gòu)成一個(gè)響亮的口號(hào),后來就一直沿用下來。
5.建立了一個(gè)新的空的工程,項(xiàng)目中的stdafx.cpp使用的是Create Precompiled Header (/Yc),而其它.cpp是用的Use Precompiled Header (/Yu),并且Create/Use PCH Trhough File是stdafx.h
(4)stdafx是預(yù)編譯頭文件。你可以從VC++集成環(huán)境菜單Project/Settings...中
Project Settings Dialog/C/C++/Category:Precompiled Headers/Use precompiled header file(.pch)的Check Box中看到。已經(jīng)將Stdafx.h文件作為預(yù)編譯的頭文件來使用。預(yù)編譯頭文件是在編譯所有Code之前,首先進(jìn)行的動(dòng)作。通過解析這個(gè)文件,取得定義的結(jié)構(gòu)和參數(shù)。這樣就不用在編譯每個(gè)文件時(shí)都重新進(jìn)行解析。提高編譯速度。stdafx.h這個(gè)名稱是可以改變的,你可以指定預(yù)編譯頭文件的名稱。這個(gè)只在vc中有用,并不是c++的特性,vc中可以在這里聲明全局變量和ID的地方
(5) fatal error C1083: Cannot open include file: 'stdafx.h': No such file or directory
A如果根本沒有stdafx.h,你為何要包含它.一般只有大工程才需要預(yù)編譯頭文件.stdafx.h
刪除這一行#include "stdafx.h"
B project-> Settings->c/c++ category->Precomiled Headers 選擇第一個(gè) Not using precompiled headers
C Project->Settings->C/C++->Project Options中把/Fp"Debug/Your_Project_Name.pch"和/Yu"stdafx.h"兩項(xiàng)刪掉就可以了。要注意原來在stdafx.h內(nèi)包含的文件要包含到各個(gè).cpp文件中.
D在*.cpp中的開頭加入#include "stdafx.h".(#include "stdAfx.h" 放到另外#include的前面,也就是程序的最前面。使用預(yù)編譯頭文件需要把它放到程序最前面,否則它前面的內(nèi)容會(huì)被忽略)
E rebuild all
(6)設(shè)置了預(yù)編譯,如果不加#include "stdafx.h", 就會(huì)報(bào)這個(gè)錯(cuò): fatal error C1010:
unexpected end of file while looking for precompiled header directive。編譯器通過一個(gè)頭文件stdafx.h來使用預(yù)編譯頭文件。stdafx.h這個(gè)頭文件名是可以在project的編譯設(shè)置里指定的。編譯器認(rèn)為,所有在指令#include "stdafx.h"前的代碼都是預(yù)編譯的,它跳過#include "stdafx. h"指令,使用projectname.pch編譯這條指令之后的所有代碼。因此,所有的CPP實(shí)現(xiàn)文件第一條語句都是:#include "stdafx.h"。
posted @
2011-10-10 17:01 mengkai 閱讀(488) |
評(píng)論 (0) |
編輯 收藏
對(duì)于階乘是個(gè)很有意思的函數(shù),給定一個(gè)整數(shù),那么它的階乘是多少那?而它末尾有多少個(gè)0,
對(duì)于這個(gè)問題,是不是要直接計(jì)算N!?如果溢出怎么辦,我們?nèi)绾慰焖俚恼业皆擃}的結(jié)果?首先要思考的N!= M*10^E。在N之前你需要看看那幾個(gè)的成績滿足即可,比如2*5=10,所有2和5乘積就可以得到一個(gè)10,于是由于能被2整除的整數(shù)的頻率要高于能被5整除的,所以我們可以取5考即可。
方法一從1開始到N,算出符合要求的個(gè)數(shù)。int result=0;
for(i = 1;i<=N;i++)
{
j = i;
while(j%5 == 0)
{
result++;
j/5;
}
}
或者是while(N)
{
result+=N/5;
N/=5;
}
類似可以求解二進(jìn)制的問題,比如求N!的二進(jìn)制中最低位1的位置。
由于N!中含有質(zhì)數(shù)2的個(gè)數(shù)。等于N/2+N/4+N/8....1.
int lowOfone(int n)
{
int result = 0;
while (n)
{
n>>=1;
result+=n;
}
return result;
}
對(duì)于
給定整數(shù)n,判斷它是否為2的方冪(解答提示:n>0&&((n&(n-1))==0))。
轉(zhuǎn)載:
【N!二進(jìn)制的解法二】
N!含有質(zhì)因數(shù)2的個(gè)數(shù),還等于N減去N的二進(jìn)制表示中1的數(shù)目。我們還可以通過這個(gè)規(guī)律來求解。
下面對(duì)這個(gè)規(guī)律進(jìn)行舉例說明,假設(shè) N = 11011,那么N!中含有質(zhì)因數(shù)2的個(gè)數(shù)為 N/2 + N/4 + N/8 + N/16 + …
即: 1101 + 110 + 11 + 1
=(1000 + 100 + 1)
+(100 + 10)
+(10 + 1)
+ 1
=(1000 + 100+ 10 + 1)+(100 + 10 + 1)+ 1
= 1111 + 111 + 1
=(10000 -1)+(1000 - 1)+(10-1)+(1-1)
= 11011-N二進(jìn)制表示中1的個(gè)數(shù)
小結(jié)
任意一個(gè)長度為m的二進(jìn)制數(shù)N可以表示為N = b[1] + b[2] * 2 + b[3] * 22 + … + b[m] * 2(m-1),其中b [ i ]表示此二進(jìn)制數(shù)第i位上的數(shù)字(1或0)。所以,若最低位b[1]為1,則說明N為奇數(shù);反之為偶數(shù),將其除以2,即等于將整個(gè)二進(jìn)制數(shù)向低位移一位。
posted @
2011-09-29 13:51 mengkai 閱讀(531) |
評(píng)論 (0) |
編輯 收藏
STL容器的學(xué)習(xí)總結(jié):
第一:迭代器iterator
首先,迭代器的定義,能夠用來遍歷STL容器中的部分或者全部元素,每個(gè)迭代器對(duì)象都代表著容易中的確定的地址,迭代器類似于指針類型,修改了常規(guī)指針的接口,是一種概念上的抽象,提供了*,++,==,!=,=操作,這些操作和C/C++操作數(shù)組元素時(shí)的指針接口一致。不同之處是該迭代器是一種smart pointer,具有遍歷復(fù)雜數(shù)據(jù)結(jié)構(gòu)的能力,所有操作行為都使用相同接口,雖然它們的型別不同。迭代器使開發(fā)人員能夠在類或結(jié)構(gòu)中支持foreach迭代
一般分為五種迭代器:輸入迭代器istream_iterator<>和istreambuf_iterator<>,輸出迭代器ostream_iterator<>和ostreambuf_iterator<>,前向迭代器,雙向迭代器,隨機(jī)訪問迭代器
back_insert_iterator<Container> 使用Container的push_back成員函數(shù)
front_insert_iterator<Container> 使用Container的push_front成員函數(shù)
insert_iterator<Container> 使用Container的insert成員函數(shù)
reverse_iterator<Container> 從后向前使用Container的insert成員函數(shù)
const——iterator<>
二 分配算符(Allocators)
看看stl中默認(rèn)的allocator:
namespace std {
template <class T>
class allocator {
public:
//type definitions
typedef size_t size_type; //represent the size of the largest object in the allocation model
typedef ptrdiff_t difference_type; //The type for signed integral values that can represent the distance between any two pointers in the
//allocation model
typedef T* pointer;
typedef const T* const_pointer;
typedef T& reference;
typedef const T& const_reference;
typedef T value_type; //The type of the elements
//rebind allocator to type U
template <class U>
struct rebind {
typedef allocator<U> other;
};
//return address of values
pointer address(reference value) const;
const_pointer address(const_reference value) const;
//constructors and destructor
allocator() throw();
allocator(const allocator&) throw();
template <class U>
allocator(const allocator<U>&) throw();
~allocator() throw();
//return maximum number of elements that can be allocated
size_type max_size() const throw();
// allocate but don't initialize num elements of type T
pointer allocate(size_type num,
allocator<void>::const_pointer hint = 0);
// initialize elements of allocated storage p with value value
void construct(pointer p, const T& value);
// delete elements of initialized storage p
void destroy(pointer p);
// deallocate storage p of deleted elements
void deallocate(pointer p, size_type num);
};
}
看了上面的allocator,我們已經(jīng)基本知道他的用處,他一般用在容器中,作為容器的一個(gè)成員,但一般是用模版參數(shù)傳入,這樣才可以讓我們換成我們自定義的allocator。
vector就是動(dòng)態(tài)數(shù)組,在堆中分配內(nèi)存,元素連續(xù)存放,有保留內(nèi)存,如果減少大小后內(nèi)存也不會(huì)釋放。新值大于當(dāng)前大小時(shí)才會(huì)再分配內(nèi)存。[]可以使用,隨機(jī)插入,刪除要慢,快速的在末尾插入元素。最重要一點(diǎn)就是它的迭代器會(huì)失效。
比如:typedef vector IntArray;
IntArray array;
array.push_back( 1 );
array.push_back( 2 );
array.push_back( 2 );
array.push_back( 3 );
// 刪除array數(shù)組中所有的2
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
if( 2 == *itor ) array.erase( itor );
}
這樣是不行的,需要按照下面的實(shí)現(xiàn):
for( IntArray::iterator itor=array.begin(); itor!=array.end(); ++itor )
{
if( 2 == *itor )
{
array.erase( itor );
itor--;
}
}
deque,與vector類似,支持隨機(jī)訪問和快速插入刪除。與vector不同的是,deque還支持從開始端插入、刪除數(shù)據(jù)0,[]可以使用,速度沒有vector快。快速的訪問隨機(jī)的元素。快速的在開始和末尾插入元素,重新分配空間后,原有的元
素不需要備份。對(duì)deque排序時(shí),可以先將deque的元素復(fù)制到vector,排序后在復(fù)制到deque
list。只能順序訪問不支持隨機(jī)訪問,不存在空間不夠
關(guān)聯(lián)容器:更注重快速和高效的檢索數(shù)據(jù)的能力
set:快速查找,不允許重復(fù)值。
multiset快速查找,允許重復(fù)值。
map:一對(duì)一映射,基于關(guān)鍵字快速查找,不允許重復(fù)值,key不能重復(fù)
multimap一對(duì)多映射,基于關(guān)鍵字快速查找,允許重復(fù)值
容器適配器:對(duì)已有的容器進(jìn)行某些特性的再封裝,
stack:
queue:
(1)獲取向量中的元素值可用三種方式,直接用向量數(shù)組,獲得元素引用,獲得元素的指針。
list:插入操作和刪除操作都不會(huì)造成原有的list迭代器失效,每次插入或刪除一個(gè)元素就配置或釋放一個(gè)元素空間,對(duì)于任何位置的元素插入或刪除,list永遠(yuǎn)是常數(shù)時(shí)間。
posted @
2011-09-27 17:52 mengkai 閱讀(279) |
評(píng)論 (0) |
編輯 收藏