C Primer 第9章筆記

2021-10-08 18:36:48 字數 4254 閱讀 8265

9.1 順序容器概述

順序容器型別

forward_list沒有size操作。

9.2 容器庫概覽

一般來說,每個容器都定義在乙個與型別名相同的標頭檔案中,容器均定義為模板類。

**對容器可以儲存的元素型別的限制:**如沒有預設建構函式的物件。

容器操作:

型別別名:

建構函式:

賦值與swap:

大小:新增/刪除元素(不適用於array):

關係運算子:

獲取迭代器:

反向容器的額外成員(不支援forward_list):

9.2.1 迭代器

**迭代器運算子:***iter,iter->name,++iter,–iter,iter1 == iter2,iter1 != iter2

**迭代器算術運算:**iter + n,iter - n,iter1 += n,iter -= n,iter1 -iter2,>,>=,<,<=

forward_list迭代器不支援遞減運算子

這些迭代器算術運算只能應用於string、vector、deque和array

9.2.3 begin和end成員

不以c開頭的函式都是被過載過的,對乙個非常量物件呼叫這些成員時,將得到的是返回iterator版本,只有在對乙個const物件呼叫這些函式時,才會得到乙個const版本。

9.2.4 容器定義和初始化

只有順序容器(不包括array)的建構函式才接受大小引數。

當將乙個容器初始化為另乙個容器的拷貝時,兩個容器型別和元素型別都必須相同。當傳遞迭代器引數來拷貝乙個範圍時,就不要求容器型別是相同的了,同時新容器和原容器的元素型別也可以不同,只要能將要拷貝的元素轉換為要初始化的容器的元素型別即可。

**標準庫array具有固定大小:**標準庫array的大小也是型別的一部分,如array;

9.2.5 賦值和swap

容器賦值運算:

賦值相關運算子會導致指向左邊容器內部的迭代器、引用和指標失效。而swap操作將容器內容交換不會導致指向容器的迭代器、引用和指標失效。容器型別為array和string的情況除外。

assign允許我們從乙個不同但相容的型別賦值。

swap只是交換了兩個容器的資料結構。

9.2.6 容器大小操作

每個容器都有返回容器中元素數目的size成員函式、當size為0時返回true的empty、返回乙個大於或等該型別容器所能容納的最大元素的值的max_size。除了forward_list支援max_size和empty。

9.2.7 關係運算子

每個容器型別都支援相等運算子==和!=,除無序關聯容器外的所有容器都支援關係運算子》、>=、<、<=,關係運算子左右兩邊的運算物件必須是相同型別的容器。

9.3 順序容器操作

9.3.1 向容器新增元素

這些操作會改變容器的大小,array不支援這些操作。

forward_list有自己專有版本的insert和emplace,forward_list不支援push_back和emplace,vector不支援push_front和emplace_front.

向乙個vector、string或deque插入元素會使所有指向容器的迭代器、引用和指標失效。

當我們用乙個物件來初始化容器時,或將乙個物件插入到容器中時。實際上放入到容器中的是物件值得另乙個拷貝,而不是物件本身。

9.3.2 訪問元素

at和下標操作只適用於string、vector、deque和array。

back不適用於forward_list。

9.3.3 刪除元素

這些操作會該錶容器的大小,所以不適用於array。

forward_list有特殊版本的erase,

forward_list不支援pop_back;vector和string不支援pop_front。

刪除deque中除首尾位置之外的任何元素都會是所有迭代器、引用和指標失效,指向vector或string中刪除點之後位置的迭代器,引用和指標都會失效。

9.3.4 特殊的forward_list操作

在forward_list中插入或刪除元素的操作

9.3.5 改變容器大小

resize不適用於array。

如果resize縮小容器,則指向被刪除元素的迭代器、引用和指標都會失效;對vector。string或deque進行resize可能導致迭代器,指標和引用失效。

9.4 vector物件是如何增長的

管理容量的成員函式

shrink_to_fit只適用於vector、string和deque。

capacity和reserve只適用於vector和string。

9.5 額外的string操作

** 9.5.1 構造string的其他方法**

n、len2和pos2都是無符號值

如果位置pos2大於s2的大小,則建構函式丟擲乙個out_of_range異常。

substr操作

9.5.2 改變string的其他方法

replace(pos, len, args)

replace(b, e, args)

insert(pos, args)

insert(iter, args)

args可以是是是

是否str是否是

否str, poe, len是是

是否cp, len是是

否否cp是

是是是n, c否是

否是b2, e2否是

否是初始化別表

9.5.3 string搜尋操作

搜尋操作返回指定字元出現的下標,如果未找到則返回npos。

args必須是以下形式之一

9.5.4 compare函式

s.compare的幾種引數形式

9.5.5 數值轉換

string和數值之間的轉換

如果string不能轉換為乙個數值,這些函式丟擲乙個invalid_argument異常。如果轉換得到的數值無法用任何型別來表示,則丟擲乙個out_of_range異常。

9.6 容器介面卡

標準庫定義了三個順序容器的介面卡:stack、queue和priority_queue。

所有容器介面卡都支援的操作和型別

如嘉定dep是乙個deque我們可以stack stk(dep)來定義。

預設情況下,stack和queue是基於deque實現的,priority_queue實在vector之上實現的。我們可以在建立乙個介面卡時講乙個命名的順序容器作為第二個型別引數,來過載預設容器型別。

所有介面卡都要求容器具有新增、刪除和訪問尾元素的的能力,因此介面卡不能構造在array和forward_list之上。

stack只要求push_back、pop_back和back操作,因此可以使用除array和forward_list之外的任何容器型別來構造stack。

queue介面卡要求back、push_back、front和push_front,因此他可以構造於list或deque之上,但不能基於vector構造。

proiority_queue要求front、push_back、pop_back和隨機訪問能力因此他可以構造於vector或deque之上,但不能基於list構造。

棧介面卡其他操作

stack定義在stack標頭檔案中

棧預設基於deque實現,也可以在list或vector之上實現

佇列介面卡

queue和priority_queue介面卡定義在queue標頭檔案中

其他的queue和priority_queue操作

queue預設基於deque實現,也可以用list或vector實現

priority_queue預設基於vector實現,也可以用deque實現

C primer 學習筆記 第9章(1)

這部分的內容你在寫程式的時候肯定是處處都能用到的,而且會讓你的程式很簡潔。本章其實是第三章內容的拓展,詳細地介紹了標準庫順序容器的知識。乙個容器就是一些 特定同一型別 物件的集合。順序容器為程式設計師提供了控制元素儲存和訪問順序的能力。這種順序不依賴於元素的值,而是與元素加入容器時的位置相對應。所有...

C Primer 第9章 習題9 32

9.32 解釋下面程式的實現的功能 vectorsvec svec.reserve 1024 string text word while cin text word sevc.push back text word svec.resize svec.size svec.size 2 如果該程式讀入...

C Primer 第9章 習題9 32

9.32 解釋下面程式的實現的功能 vectorsvec svec.reserve 1024 string text word while cin text word sevc.push back text word svec.resize svec.size svec.size 2 如果該程式讀入...