c primer 筆記 第九章 順序容器

2021-07-22 03:30:43 字數 2461 閱讀 1403

1.

vector, deque, list, forward_list, array, string的區別

vector              可變大小陣列,支援快速隨機訪問,在尾部之外的位置插入或刪除元素可能很慢

deque              雙端佇列,支援快速隨機訪問,在中間位置新增或刪除元素的代價可能很高,但是在兩端新增或刪除元素很快

list                    雙向鍊錶,只支援雙向順序訪問,在任何位置插入或刪除元素都很快

forward_list      單向鍊錶,只支援單向順序訪問

array                固定大小陣列,支援快速隨機訪問,不能新增或刪除元素

list和forward_list的額外記憶體開銷大

forward_list沒有size操作

2.容器間可以進行拷貝,但他們必須是相同的容器型別,且儲存的是相同的元素型別

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

vectorarticles = ;

forward_listwords(articles.begin(),articles.end());

在新標準中,我們可以對乙個容器進行列表初始化。

如果元素型別是內建型別或是具有預設建構函式的類型別,可以只為建構函式提供乙個容器大小的引數。如果元素型別沒有預設建構函式,除了大小引數,還必須制定乙個顯示的元素初始值

當定義乙個array時,除了指定元素型別,還要指定容器大小,大小是array型別的一部分

arrayarr;
不同於內建陣列,array可以進行拷貝和賦值操作

賦值相關操作會導致指向左邊容器內部的迭代器、引用和指標失效。而swap操作將容器內容交換不會導致指向容器的迭代器、引用和指標失效(array和strign除外)

除array外,swap不對任何元素進行拷貝、刪除或插入操作,因此可以保證在常數時間內完成,而swap兩個array會真正交換他們的元素

3.vector和string不支援push_front和emplace_front

forward_list不支援push_back和emplace_back

insert將元素插入到迭代器所指定的位置之前,接受一對迭代器或乙個初始化列表的insert版本將給定範圍中的元素插入到指定位置之前

接受元素個數或範圍的insert版本返回指向第乙個新加入元素的迭代器

當我們呼叫emplace成員函式時,則是將引數傳遞給元素型別的建構函式,emplace成員使用這些引數在容器管理的記憶體空間中直接構造元素

c.emplace_back("987-0590353403", 25, 15.99);

c.push_back(sales_data("987-0590353403", 25, 15.99);

訪問元素時,如果我們希望確保下標是合法的,可以使用at成員函式。at成員函式類似下標運算子,但如果下標越界,at會丟擲乙個out_of_range異常

刪除元素

c.erase(p);

刪除迭代器p所制定的蒜素,返回乙個指向被刪元素之後元素的迭代器

c.erase(b,e);

刪除迭代器b和e所制定範圍內的元素,返回乙個指向最後乙個被刪除元素之後元素的迭代器

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

4.reserve並不改變容器中元素的數量,它僅影響vector預先分配多大的記憶體空間。當需求大小小於當前容量時,容器不會退回記憶體空間。因此,在呼叫reserve之後,capacity將會大於或等於傳遞給reserve的引數

容器的size是指它已經儲存的元素的數目,而capacity則是在不分配新的記憶體空間的前提下它最多可以儲存所少元素

5.string s(cp,n);

s是cp指向的陣列中前n個字元的拷貝

string s(s2,pos2);

s是string s2從下標pos2開始的字元的拷貝

find 返回第乙個匹配位置的下標,可選引數可指出從哪個位置開始搜尋

s.find_first_of(args) 在s中查詢args中任何乙個字元第一次出現的位置

s.find_first_not_of(args) 在s中查詢第乙個不在args中的字元的位置

6.順序容器介面卡:stack, queue, priority_queue

預設情況下,stack和queue是基於deque實現的,priority_queue是在vector之上實現的

每個容器介面卡都基於底層容器型別的操作定義了自己的特殊操作。我們只可以使用介面卡操作,而不能使用底層容器型別的操作

C primer 第九章順序容器!

標準庫定義了3種順序容器 vector支援隨機訪問,list支援快速插入刪除,deque雙端佇列。他們的差別在於訪問元素的方式,以及新增或刪除元素操作的執行代價。1.容器元素的初始化 預設的建構函式 listilist list容器,裡面內容是int型別的內容 dequeitems 空容器deque...

C Primer 第九章 順序容器

接受容器大小引數的順序容器建構函式使用了元素的預設建構函式 forward lis迭代器不支援 運算子 使用迭代器引數來拷貝乙個範圍時,就不要求容器型別相同了 array型別可以進行拷貝和賦值,但是要求元素型別和大小一樣 array型別不支援assign,也不允許用花括號的值列表進行賦值 swap一...

C primer 第九章筆記 初稿

性質 容器中元素的順序與加入的位置相對應,為使用者提供了控制元素儲存和訪問順序的能力。六大順序容器 名稱功能 特點 vector 可變大小陣列 支援快速隨機訪問,除尾部外插入 刪除較慢 deque 雙端佇列 支援快速隨機訪問,頭尾外插入刪除較慢 list 雙向列表 支援雙向順序訪問,任何位置插入刪除...