【Accelerated C++】重点回顾
生活随笔
收集整理的這篇文章主要介紹了
【Accelerated C++】重点回顾
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
看了劉未鵬推薦過(guò)的C++入門(mén)經(jīng)典《Accelerated C++》,讀此書(shū)的過(guò)程中一再感嘆“大師就是大師,他可以很輕松的把東西的本質(zhì)呈現(xiàn)在你面前”,這本書(shū)采用了現(xiàn)實(shí)中與我們很接近的學(xué)生成績(jī)信息管理這一例子,層層推進(jìn),一步一步引出C++中的知識(shí)點(diǎn),根據(jù)任務(wù)提出解決方案,讓你感受到C++中一些設(shè)計(jì)的比要性。
一下是我讀此書(shū)時(shí)做的筆記,謹(jǐn)用于記憶。
第一章、使用字符串
1、為什么需要緩沖?
????輸入操作的副作用:它總是詢(xún)問(wèn)用戶(hù)名字的請(qǐng)求顯示在計(jì)算機(jī)的輸出設(shè)備上。
??? 不管還有多少字符等待輸入,很多系統(tǒng)在向輸出設(shè)備寫(xiě)入字符時(shí)需要花費(fèi)大量的時(shí)間。
??? 為了避免無(wú)法及時(shí)響應(yīng)每個(gè)輸出請(qǐng)求,標(biāo)準(zhǔn)庫(kù)使用了緩沖來(lái)積累需要輸出的東西,然后等到必要的時(shí)候,刷新緩沖來(lái)把緩沖里面的內(nèi)容寫(xiě)到輸出設(shè)備中。
??? 這樣就可以通過(guò)一次寫(xiě)入完成多次輸出操作。
2、促使系統(tǒng)刷新緩沖的三個(gè)事件:
??? 1)、緩沖滿(mǎn)了。
??? 2)、標(biāo)準(zhǔn)庫(kù)被要求讀取標(biāo)準(zhǔn)輸入流。
??? 3)、顯示的刷新緩沖。
3、應(yīng)該適時(shí)的刷新輸出緩沖,防止輸出擁塞在系統(tǒng)緩沖中。
4、如果一個(gè)變量是常量(const),必須在定義的時(shí)候初始化,否則沒(méi)有機(jī)會(huì)賦值了。
??? 但是,初始化時(shí)const變量的值,可以不是常數(shù)(constant)。
5、操作符的一個(gè)永遠(yuǎn)不變的特性就是它的結(jié)合性。
第三章、使用批量數(shù)據(jù)
1、讀取流失敗的原因:
??? 1)、遇到輸入文件的結(jié)束標(biāo)志
??? 2)、輸入的值的類(lèi)型和需要讀入的變量的類(lèi)型不兼容。
??? 3)、系統(tǒng)可能檢測(cè)到輸入設(shè)備的硬件故障。
2、應(yīng)該用size_type(無(wú)符號(hào)整型),用來(lái)表示容器大小-----這是一個(gè)好習(xí)慣。
??? 如: typedef vector<double>::size_type vec;
3、vector類(lèi)型定義:
??? v.end() 返回v中最后一個(gè)元素的‘下一個(gè)位置’。
4、while(cin>>x)?
??? 把適當(dāng)類(lèi)型的值讀入x中,并且檢測(cè)流的狀態(tài)。
??? 如果流出錯(cuò),檢測(cè)失敗;否則,檢測(cè)成功,然后執(zhí)行while語(yǔ)句體。
? ??
第四章、組織程序和數(shù)據(jù)
1、引用
??? vector<double> homework;
??? vector<double>& hw = homework;
????
??? hw是homework的別名。對(duì)hw的任何操作都等價(jià)于對(duì)homework的同樣操作,反之亦然。
??? const vector<double>& chw = homework;
??? chw仍然是homework的別名。但是const保證我們不會(huì)chw作任何改變它的值的操作。
??? 因?yàn)橐檬窃葘?duì)象的別名,所以不存在引用的引用。
??? const vector<double>& chw1 = chw;
??? 定義一個(gè)引用的引用和定義一個(gè)人原先對(duì)象的引用效果相同。
??? const vector<double>&, 意思是要求系統(tǒng)允許我們直接訪(fǎng)問(wèn)相關(guān)的實(shí)參,而不是復(fù)制實(shí)參,并且保證不會(huì)改變形參的值(否則實(shí)參的值也會(huì)被改變)。
2、左值
??? 一個(gè)左值是一個(gè)非臨時(shí)性的對(duì)象。
??? 比如:如果一個(gè)變量是一個(gè)引用,或者是調(diào)用可以返回引用的函數(shù)的結(jié)果,那么這個(gè)變量就是一個(gè)左值。
3、read_hw( cin, homework );
??? istream& read_hw( istream& in, vector<double>& hw )
??? {
??????? if( in ){
??????????? hw.clear();
??????????? hw.push_back(1);
??????????? in.clear();
??????? }
??????? return in;?
??? }?
4、3種函數(shù)形參
??? 1)、vector<double>????????? -->復(fù)制實(shí)參(即便實(shí)參是一個(gè)很大的vector對(duì)象,效率低下)---不會(huì)改變vector對(duì)象本身。
??? 2)、const vector<double>&?? --> &表明無(wú)須復(fù)制實(shí)參(效率高),const保證不會(huì)改變形參 ---簡(jiǎn)單的內(nèi)置類(lèi)型(如:int,double)沒(méi)有必要使用const &
??? 3)、vector<double>&???????? -->非常量引用
????
??? 與非常量引用的形參對(duì)應(yīng)的實(shí)參必須是一個(gè)‘左值’(非臨時(shí)性的對(duì)象),而值傳遞與常量引用對(duì)應(yīng)的實(shí)參可以是任意值。
5、一個(gè)好的經(jīng)驗(yàn):避免一個(gè)單獨(dú)的語(yǔ)句產(chǎn)生多個(gè)副作用。拋出一個(gè)異常是一個(gè)副作用,所以?huà)伋鲆粋€(gè)異常的語(yǔ)句不應(yīng)該再產(chǎn)生其他副作用,尤其是輸入和輸出。
6、謂詞。
??? 謂詞就是可以產(chǎn)生真假值的函數(shù)。如下sort函數(shù)的謂詞:
??????? bool compare( const Student_info& x, const Student_info& y )
??????? {
??????????? return x.name < y.name;?
??????? }
??????? sort( student.begin(), student.end(), compare );?
第五章、使用序列式容器并分析字符
1、迭代器
??? 一個(gè)迭代器是一個(gè)值,它能夠:
??????? 1)、標(biāo)識(shí)一個(gè)容器和容易中的一個(gè)元素
??????? 2)、允許檢測(cè)元素中保存的值
??????? 3)、提供在容器元素之間移動(dòng)的操作
??????? 4)、使用容器可用有效處理的方式來(lái)約束可用的操作
??? 因?yàn)榈鞯男袨轭?lèi)似索引,所以我們常常可用把使用索引的程序重寫(xiě)為使用迭代器。
2、迭代器操作:
??? 在一個(gè)迭代器上使用*(解引用操作符),會(huì)返回一個(gè)左值,也就是這個(gè)迭代器指向的元素:
??????? cout<< (*iter).name;?
??????? 如何是*iter.name,編譯器會(huì)誤以為是*(iter.name)
??????? 但是可以使用:iter->name 替換
3、刪除iter的后果:
??? 刪除iter表示的元素會(huì)使這個(gè)迭代器無(wú)效。
????
??? 如果一個(gè)元素移動(dòng)了位置那么指向它的任何一個(gè)迭代器都是無(wú)意義的-->?
??????? 在一個(gè)vector的對(duì)象上調(diào)用erase,會(huì)使被刪除元素之后的所有元素的迭代器都無(wú)效。
??? 所以:可以iter = student。erase(iter); 指向刪除后的元素。
4、vector
??? vector提供庫(kù)容器中功能最強(qiáng)大的迭代器--->隨機(jī)訪(fǎng)問(wèn)迭代器。
????
??? 雖然使用vector時(shí),采用的都是動(dòng)態(tài)分配元素空間,但是vector提供了預(yù)先分哦元素空間的機(jī)制以及指示vector分配空間的一個(gè)操作,但是沒(méi)有使用額外的空間,這樣是為了避免重復(fù)分配空間的開(kāi)銷(xiāo)。
????
??? v.reserve(n) --預(yù)留空間---并不初始化它們。這個(gè)操作不改變?nèi)萜鞯拈L(zhǎng)度。它影響的知識(shí)調(diào)用insert或者push_back函數(shù)時(shí),vector分配內(nèi)存的頻率。
??? v.resize(n)? --給v一個(gè)等于n的新長(zhǎng)度。如果n比v當(dāng)前的長(zhǎng)度小,n以后的元素就都會(huì)被刪除。若n比當(dāng)前長(zhǎng)度大,新的元素會(huì)被添加到v中,并且會(huì)根據(jù)v包含的類(lèi)型來(lái)適當(dāng)?shù)某跏蓟?br />
5、list與vector的區(qū)別:
??? list的結(jié)構(gòu)復(fù)雜,比起vector順序訪(fǎng)問(wèn)上慢一些。--->在末尾插入和刪除的時(shí)候,vector好過(guò)list,但是在容器的中間刪除很多元素時(shí),list快很多。
??? list不支持索引。
??? 給vector添加一個(gè)元素時(shí),為新元素分配空間可能會(huì)引起整個(gè)vector的重新分配。
??? 由于list不支持隨機(jī)訪(fǎng)問(wèn),因此它不能使用標(biāo)準(zhǔn)庫(kù)的sort,但是它有自己的sort:
??????? list<Student_info> student;? student.sort(compare);?????
第六章、使用庫(kù)算法
1、每個(gè)容器(也包括string類(lèi))都提供了相應(yīng)的迭代器類(lèi)型。迭代器使我們可以遍歷一個(gè)容器,并且檢測(cè)其中的元素。熱情,標(biāo)準(zhǔn)庫(kù)保證了每種迭代器都用相同的接口來(lái)操作。
2、與容器和迭代器相同,算法也使用了一致的接口規(guī)約。
3、copy( bottom.begin(), bottom.end(), back_inserter(ret) );?
??? copy是一個(gè)泛型算法, back_inserter 是一個(gè)迭代器適配器。
??? 泛型算法:一種不屬于任何特殊容器的算法,它可以從其參數(shù)類(lèi)型知道如何訪(fǎng)問(wèn)它使用的數(shù)據(jù)。
4、copy( begin, end, out ); ---> while( begin != end ) *out++ = *begin++;?
??? 唯一的區(qū)別是while語(yǔ)句體改變了迭代器的值,但是copy算法沒(méi)有改變。
5、it = begin++; 等價(jià)于:it = begin; ++begin;?
6、不能把重載函數(shù)作為參數(shù)傳遞給一個(gè)模板函數(shù)。
7、算法、容器和迭代器
??? 算法是作用在容器元素上的----它們并不作用在容器上。
????
8、迭代器適配器:
??? 是產(chǎn)生迭代器的函數(shù)。
??? 最常用的是生成insert_iterator的適配器,它生成的迭代器可以動(dòng)態(tài)的增長(zhǎng)關(guān)聯(lián)的容器。這樣的跌大全可以安全的用作復(fù)制類(lèi)型的算法的目的地。????
第七章、使用關(guān)聯(lián)式容器
1、序列式容器
??? 序列式容器中的元素都是按照指定的次序來(lái)排列。當(dāng)在push_back或者插入新的元素時(shí)候,每個(gè)元素的位置都不會(huì)變化,除非對(duì)容器進(jìn)行一些重新排序的操作。
2、關(guān)聯(lián)式容器
??? 最常見(jiàn)的關(guān)聯(lián)數(shù)據(jù)結(jié)構(gòu)是‘鍵值對(duì)’,每個(gè)值都與獨(dú)一無(wú)二的鍵相對(duì)應(yīng),這樣我們可以根據(jù)元素的鍵,來(lái)快速的插入或者取回對(duì)應(yīng)的元素。
3、兩者的區(qū)別:
??? 關(guān)聯(lián)式容器是自排列的。
4、map
??? map<string, int> counters;?
??? (string: 鍵, int: 值 ) 稱(chēng)這個(gè)容器是string映射到int的map。
????
??? 鍵總是const型的--防止被隱式的改變?cè)卦趍ap中的位置。
5、關(guān)聯(lián)數(shù)組的性能:
??? 這些數(shù)組很可能是按照一種叫做哈希表的數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)的。哈希表速度很快,但是也為此付出了一些代價(jià):
??????? 1)對(duì)于每種類(lèi)型的鍵,人們都必須提供一個(gè)哈希函數(shù),根據(jù)鍵的值,來(lái)計(jì)算出一個(gè)合適的整數(shù)。
??????? 2)哈希表的性能與哈希函數(shù)的實(shí)現(xiàn)細(xì)節(jié)密切相關(guān)。
??????? 3)一般來(lái)說(shuō),很難按照有用的順序重新取得哈希表的元素。C++的關(guān)聯(lián)式容器很難按照哈希表來(lái)實(shí)現(xiàn)。
??????? 4)鍵類(lèi)型需要實(shí)現(xiàn)的只是<操作符或者是相等性比較函數(shù)。
??????? 5)使用給定的鍵來(lái)訪(fǎng)問(wèn)關(guān)聯(lián)式容器中的元素所消耗的時(shí)間是容器中元素總數(shù)的對(duì)數(shù),而不管鍵的值是什么。
??????? 6)關(guān)聯(lián)式容器總是根據(jù)鍵來(lái)排序。
??????? 換句話(huà)說(shuō),雖然c++關(guān)聯(lián)式容器明顯比最好的哈希表數(shù)據(jù)結(jié)構(gòu)慢,但是它的性能卻要比其他的數(shù)據(jù)結(jié)構(gòu)好的多,而且由于他們自動(dòng)排序的機(jī)制,所以他們也要比哈希表方便很多。
????
??? C++庫(kù)使用的是一種平衡的,可以自我調(diào)節(jié)的樹(shù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)關(guān)聯(lián)式容器。
6、訪(fǎng)問(wèn)一個(gè)不存在的鍵,會(huì)自動(dòng)生成這個(gè)鍵及值。
(未完,待續(xù)。。。)
from:?http://blog.csdn.net/cyh_24/article/details/8239633
總結(jié)
以上是生活随笔為你收集整理的【Accelerated C++】重点回顾的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 让你的名字在百度排名前列
- 下一篇: 将vim打造成IDE编程环境