宣告:本讀書筆記僅表達對書的理解,如有任何錯誤歡迎指出
前言:文章的前幾章是介紹標準庫抽象的程式,從這章開始,作者開始介紹自己定義的抽象(說白了就是自己定義一些函式、資料型別等等)
一、泛型函式:定義時不明確引數型別,使用時進行賦予,可以根據輸入變化
(1) 泛型函式是通過模版函式實現的(猜測),它定義了具有相似特徵的一類函式,這些函式可能具有不同型別的
引數,因此在定義時不表明引數型別,只有例項化後才有明確的型別,這種引數叫模版引數。
(2) 函式的行為受兩個部分限制,內部是引數的使用方式約束、外部是標準庫的約束)
(3)泛型函式定義
template >
t 函式名(t v) ps:t即為引數和返回值的型別,兩者也可以不同
(4) 使用模版引數的size_type 時需要加上typename
例如:typedef typename vector::size_type vcz;
(5) string 沒有除法運算
(7)注意泛型函式的引數賦值後,容易出現引數不匹配的問題;
(8)find的使用方式 find(c.begin(),c.end(),val) c.find(val) find(c,val)
(9) 向量的迭代器支援r.begin()+5,但是鍊錶的迭代器不支援,
(10)向量、鍊錶、string均屬於順序容器,而map是關聯容器,儲存的方式不同
向量、string與鍊錶的訪問方式不同,前者可以隨機,後者只能順序
(11)只有向量和string支援sort演算法
(12)reverse函式是翻轉元素順序, swap函式是交換引數的值;
(13)it++即先把it給後面的操作,再加1,++在前面還是後面在迭代的演算法裡面非常常見;
(14)庫定義了五種迭代器,不同型別迭代器可以明確不同容器所支援的演算法,迭代器的種類和容器的訪問策略對應
容器---訪問策略---迭代器---演算法
策略有:
<1>順序唯讀訪問--輸入迭代器
輸入迭代器:支援++、==、!=、it->end的迭代器
庫函式舉例:find
<2>順序只寫訪問--輸出迭代器
輸出迭代器:允許賦值操作,在兩次賦值操作之間必須且只能有一次++操作,例如back_inserter
庫函式舉例:copy
<3>順序讀寫訪問--正向迭代器
正向迭代器:*it(讀寫)、++但是--不行,
賦值,it->end
庫函式舉例:replace
ps:順序的意思是一旦處理了就不再訪問該元素
<4>可逆訪問--雙向迭代器
雙向迭代器:支援正向迭代器的操作以及--,標準庫所有的容器都支援雙向迭代器
庫函式舉例:reverse
<5>隨機訪問--隨機訪問迭代器
隨機訪問迭代器:滿足雙向迭代器的要求,以及對迭代器p+n,p-q,p[n](等價於*(p+n)),p>q;
庫函式舉例:binary_search、sort
向量和string都是隨機訪問迭代器,但是鍊錶是雙向迭代器
(15)演算法需要兩個引數來制定區間
(16)指定區間的第二個引數是最後乙個引數的下一位,這樣以方丟失資訊,例如end()指向最後的下一位
(17)每一種容器都要為了他的迭代器而支援乙個越界值
(18)並不是所有迭代器都與容器相關聯,back_inerter(c)不滿足任何其他迭代器要求,它屬於庫定義的為了鏈結輸入和輸出流的迭代器。
(19)istream的迭代器滿足輸入迭代器的要求,ostream的迭代器滿足輸出迭代器的要求。
(20)輸入流迭代器istream_iterator,它有乙個預設值,當到達結尾或者報錯就會與預設等價。
istream_iterator(cin);
ostream_iterator(cout," ")後面的空格是為了分隔的
(21) c++的輸入和輸出都是帶型別的,通常隱藏在讀入中;
(22)迭代器是演算法和容器之間的乙個粘合劑;
(23) 在函式呼叫過程中凡事使用const 必須全程標明,否則會報錯;
(24) #
pragma
once是c++雜注,在標頭檔案開頭表明這個,可以保證標頭檔案只編譯一次,
#pragma once與#ifndef的區別:
#ifndef是防止巨集名字重複,同一檔案不會被包含多次,且內容相同的兩個檔案也不會被重複包含,但是巨集名相同的兩個頭會撞車;
#pragma once是指同乙個檔案不會包含多次,但是同乙個檔案中有兩個相同的巨集就無法保證;
(25)hpp檔案就是cpp和h檔案的合成體;
(26)函式原始檔中表示對乙個迭代器的謂詞處理:p(*it);
(27) 模版函式不能分開定義,只能全部放在h(hpp)檔案中;
(28)typename
vector::iterator a
typedef
typename
std::vector::size_type vec_sz;
(29) swap函式是為了交換,在algorithm頭裡面,迭代器內元素交換必須用這個;
(30) list是不支援隨機訪問的,因此他的迭代器不支援+/+=,但是vector 支援。
(31)關聯容器不能使用back_insterter和push_back;
(32)
forward_list不支援push_back和emplace_back
,list支援,
vector和string不支援push_front和emplace_front
(33)課後習題8-8:
1 第一種寫法有可能溢位 2 指標或迭代器不支援相加,支援相減
Accelerated C 讀書筆記 二
student info.h ifndef guard student info define guard student info include include includestruct student info bool compare const student info const st...
書籍推介 Accelerated C
accelerated c 英文主頁 http acceleratedcpp.accelerated c 中文版 我讀的是中文版,正如china pub上的書評 http china pub.puters mon info.asp?id 16097 所提到的,翻譯校稿出錯不少,出版社有責任 但是原書...
Accelerated C 習題 第0章
include using namespace std intmain this is a quote,and this is a backlash.include using namespace std intmain include using namespace std intmain inc...