每日複習筆記5 3

2021-10-05 16:32:12 字數 4003 閱讀 3912

關聯容器支援通過鍵來高效的查詢和讀取元素。有兩種基本的關聯容器型別:mapset

pair型別

表示式功能

pairp1;

建立乙個空的pair物件,它的兩個元素分別是ti和t2型別的,採用值初始化。

pairp1(v1, v2);

建立乙個pair物件,它的兩個元素分別是ti和t2型別的,first成員初始化為v1,second成員初始化為v2。

make_pair(v1, v2);

以v1和v2的值建立乙個pair物件,其元素的型別分別是v1和v2的型別。

p1 < p2

兩個pair物件之間的小於運算,其定義遵循字典次序:如果p1.first < p2.first或者!(p2.first < p1.first) && p1.second < p2.second,則返回true。

p1 == p2

如果兩個pair物件的兩個成員分別相等,則兩個物件相等,返回true。

p.first

返回p中的first的資料成員

p.second

返回p中的second的資料成員

關聯型別

關聯容器不支援順序容器中front、push_front、pop_front、back、push_back和pop_back操作。

順序容器和關聯容器相同的操作:

a)三種基礎的建構函式

c c;

cc1(c2)

;cc(b, e)

;

b)關係運算

c)begin、end、rbegin和rend操作

d)swap和賦值操作,但是關聯容器不支援assgin函式

e)clear和erase操作

f)關於容器大小的操作(size),但是關聯容器不支援resize函式。

容器元素是根據鍵的次序排列。在迭代遍歷關聯容器時,可確保按鍵的順序訪問元素,而與元素在容器中的存放位置完全無關。

map型別

map是鍵-值對的集合。map型別可以理解為關聯陣列:可以使用鍵作為下標來獲取乙個值。關聯的本質在於元素的值與某個特定的鍵相關聯,而不同於元素在陣列中的位置來獲取。

專案1map物件的定義

表示式功能mapm;

建立乙個名為m的空map物件,其鍵值的型別分別為k和v

mapm(m2);

建立m2的副本m,m和m2必須具有相同的鍵值型別

mapm(b, e);

建立map型別的物件,儲存迭代器b和e標記範圍內所有元素的副本。元素的型別必須能轉換為pair

鍵型別的約束

使用關聯容器時,它的鍵不僅有乙個型別,而且還有乙個相關的比較函式。預設情況下,標準庫使用鍵型別定義的「<」操作符實現鍵的比較。

所用的比較函式必須在鍵型別上嚴格弱排序的(嚴格是說在判斷的時候會用"<",而不是"<=",弱排序是因為,一旦"<「成立便認為存在」<「關係,返回ture,而忽略了」=「關係和」>"區別,把它們歸結為false)。

個人理解,由於map型別的鍵值是唯一的,所以鍵型別只有「小於」、「大於」兩種關係。如果不滿足「小於」關係,則就是「大於」關係。

對於鍵型別,唯一的約束就是必須支援「<」操作符。對於其他關係操作符沒有具體的要求。

map定義的型別

map物件的元素是鍵-值對,每個元素包含兩個部分,鍵和與鍵相關聯的值。

表示式解釋

map::key_type

在map容器中,用作索引的鍵型別

在map容器中,鍵相關聯的值的型別

map::value_type

map迭代器進行解引用將產生pair型別的物件

對迭代器進行解引用時,將獲得乙個引用,指向容器中乙個value_type型別的值。對於map型別,其value_type型別是pair型別。

mapint>

::iterator map_it = word_count.

begin()

;cout << map_it-

>first;

cout <<

" "

<< map_it-

>second;

map_it.first =

"new"

;//error:因為first成員是const型別

++map_it-

>second;

向map中新增元素

有兩種方式:一是使用insert成員實現;二是先用下標操作符獲取元素,然後給獲取的元素賦值。

map:insert的使用操作

含義m.insert(e)

e是乙個用在m上的value_type型別的值(pair型別)。如果鍵m.first不在m中,則插入乙個值為e.second的新元素;如果m.first在m中已存在,則保持m不變。該函式返回乙個pair型別的物件,包含指向鍵值為e.first元素的map迭代器,以及乙個bool型別的物件,表示是否插入成功

m.insert(beg, end)

beg和end是標記元素範圍的迭代器,其中的元素必須是m.value_type型別的鍵值對。對於該範圍內的所有元素,如果它的鍵不在m中,則將鍵值對插入到m中,返回void型別

m.insert(iter, e)

e是乙個用在m上的value_type型別的值。如果鍵e.first不在m中,則建立新的元素,並以迭代器iter為起點搜尋新元素的儲存位置。返回乙個迭代器,指向m中具有給定鍵值的元素

使用下標訪問map物件

mapint> word_count;

word_count[

"anna"]=

1;

這段程式發生了以下事件:

a)在word_count中查詢鍵值為anna的元素,沒有找到;

b)建立乙個新的鍵值對,這個鍵值對鍵型別是const string型別,值為「anna」。它的值採用值初始化,這裡初始化為0;

c)將這個新的鍵值對插入word_count中;

d)讀取新插入的元素,將其值賦值為1.

使用下標訪問map與使用下標訪問陣列或者vector的行為截然不同:使用下標訪問不存在的元素將導致在map容器中新增乙個新元素,它的鍵值為下標值(類似於動態查詢)。

查詢和讀取map中的元素

雖然通過下標操作符可以訪問map中的元素,但是下標操作也有個嚴重的***就是當元素不在map物件中時,會插入乙個新的元素

map提供兩種操作count和find,用於檢查某個鍵是否存在且不會插入該鍵。

操作功能

m.count(k)

返回m中k的出現次數

m.find(k)

如果m容器中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端的迭代器

從map中刪除元素

刪除操作是通過erase操作實現

操作功能

m.erase(e)

刪除m中鍵為k的元素。返回size_type型別的值,表示刪除的元素個數(只能是0或1)

m.erase§

從m中刪除迭代器p所指向的元素。p必須指向m中確實存在的元素,且不等於m.end()。返回void型別

m.erase(b, e)

從m中刪除一段範圍內的元素,該範圍由迭代器對b和e標記。

set型別

set容器只是單純的鍵的集合。

set容器支援大部分map的操作:

a) 通用的容器操作;

b) map定義的建構函式;

c) insert操作

d) count和find操作

e) erase操作

每日複習筆記

未知數量輸入的解決辦法 利用whlie迴圈 讀入位置數量的輸入 include using namespace std int main cout sum is sum 注意 一般windows系統的檔案結束符是ctrl z unix系統中是 control d。標頭檔案的小細節 標準庫的標頭檔案用...

每日複習筆記4 28

感覺這個部分真的是重難點啊,用好的真好用,用不好是,哎,我是菜雞。有乙個順序容器和順序容器介面卡的概念,這裡先寫點關於順序容器的吧。常見的順序容器有vector list和deque三種。順序容器的定義 所有的容易都是類模板,通過模板可以編寫乙個類定義,而用於多個不同的資料型別。容器元素的初始化 表...

每日複習筆記4 25

函式的定義 函式由函式名以及一組運算元型別唯一的表示。函式體是乙個作用域 函式體是乙個語句塊,定義了函式的具體操作,形成了乙個 新的作用域。可以在函式體內定義變數,這種變數是區域性變數,變數名字只在函式內可見。函式返回型別 函式的返回型別可以是內建型別,類型別或者復合型別 例如引用或者指標 甚至是v...