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