accelerated c 讀書筆記 第八章

2021-07-29 06:45:33 字數 3062 閱讀 4766

宣告:本讀書筆記僅表達對書的理解,如有任何錯誤歡迎指出

前言:文章的前幾章是介紹標準庫抽象的程式,從這章開始,作者開始介紹自己定義的抽象(說白了就是自己定義一些函式、資料型別等等)

一、泛型函式:定義時不明確引數型別,使用時進行賦予,可以根據輸入變化

(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)typenamevector::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...