C/C++基礎----順序容器

來源:互聯網
上載者:User

標籤:.net   append   簡單的   blog   刪除元素   適用於   article   for   部分   

通常沒有特別的原因,用vector。

list和forward_list有額外的記憶體開銷,如果有很多小元素,不要使用。

如果只在讀取輸入時需要在容器中間位置插入元素,隨後需要隨機訪問。

  1確定是否真正需要在中間位置插入,可以用vector再用sort排序;

  2如必須在中間插入元素,可在輸入階段用list,完了之後拷貝到vector

 

 

insert與emplace(emplace_back、emplace_front)

emplace是直接將參數傳遞給元素類型的建構函式,在容器管理的記憶體空間中直接構造元素。

與insert相比,省去了構造臨時對象,減少了記憶體開銷。

 

類型別名在泛型程式設計中很有用。

 

直接容器拷貝,要求容器類型和元素類型都匹配;

用迭代器拷貝不要求,只要元素類型可以轉換即可。

 

array,跟內建數組一樣,大小也是類型的一部分。

跟其他容器不同,預設構造的array的元素都是預設初始化,跟數組一樣。

但是array支援拷貝和賦值操作,不過容器類型和大小,元素類型都必須相同。

不允許將花括弧列表賦值給array。

 

assign允許從一個不同但相容的類型賦值

assign操作不適用與array和關聯容器。

 

swap操作不會對任何元素進行拷貝刪除或插入(除array外),可以在常數時間內完成。

除string外指向容器的迭代器,指標和引用在swap之後都不會失效。仍指向swap操作之前的元素,但是已屬於不同容器了。

對於array,swap會真正交換元素,所需時間與元素數目成正比。但是迭代器指標等也不會失效。

非成員版本swap在泛型程式設計中很重要。

 

只有當元素也定義了相應的比較運算子的時候,才可以使用比較子來比較兩個容器。

向vector、string、deque插入元素(除首尾),都需要移動元素,甚至可能引起Object Storage Service空間的重新分配。用迭代器範圍插入時,迭代器不能指向本容器。

 

訪問元素

在調用front或者back(解引用begin --end)之前,確保非空。

c.front() c.baock() c[n] 都有越界風險 c.at(n)則會拋出out_of_range異常。

 

forward_list特殊操作

因為單向鏈表沒有簡單的辦法來擷取其前驅,所以是通過操作給定元素後面的元素來完成的。insert_after、emplace_after、erase_after。

還特意定義了首前迭代器lst.before_begin()  lst.cbefore_begin()

一般insert/emplace返回第一個添加的元素的迭代器,而after版本指向最後一個插入元素的迭代器。

 

迭代器失效

添加元素

vector、string:儲存空間重新分配,則全部失效;未重新分配,則插入之前部分的迭代器、引用指標仍有效。

deque:首尾以外的位置,全部失效。首尾添加,迭代器會失效,引用指標不會。

list、forward:仍有效。

刪除元素

list、forward:仍有效。

deque:首尾以外的位置,全部失效。刪除尾元素,尾後迭代器失效;刪除首元素,仍有效

vector、string:被刪之前的部分仍有效。

 

當使用迭代器(指標、引用),最小化要求迭代器必須有效程式片段。在迴圈中更新迭代器。

 

尾後迭代器總是會失效,不要儲存

 

容量大小

shrink_to_fit()  將分配的空間減小到與size()相同大小,僅適用於vector、string、deque

capacity()   不重新分配記憶體,可以儲存多少元素,僅vector和string

reserve()   分配至少能容納n個元素的記憶體空間,僅vector和string

resize()是改變容器中元素的數目,不會減少容器預留的記憶體空間

 string額外操作

構造

如果從一個數組構造string,必須以Null 字元結尾,否則需要指定拷貝前n個字元。

string s(cp, n);;

string s(s1, pos,len),pos超出s1的size會報異常,len不管多大最多拷貝至string結尾。

 

string除了迭代器版本,還支援下標的操作

insert、erase、append、replace、assign

 

搜尋函數

返回string::size_type無符號類型

將傳回值用int來儲存不是個好主意。

find(args)                          //尋找s中args第一次出現的位置

rfind(args)倒查                  //尋找s中args最後一次出現的位置

find_first_of(args)       //s中尋找args任意一個字元第一次出現的位置

find_last_of(args)        //s中尋找args任意一個字元最後一次出現的位置

find_first_not_of(args)    //s中尋找第一個不在args中的字元

find_last_not_of(args)     //s中尋找最後一個不在args中的字元

 

args中可以指定開始尋找的位置pos,預設為0。這個可以方便連續尋找。

 

數實值型別轉換

to_string(val)

stoi(s, p, b)

stol(s, p, b)

stoul(s, p, b)

stoll(s, p, b)

stoull(s, p, b)

stof(s, p, b)

stod(s, p, b)

stold(s, p, b)

p是size_t的指標,用來存放第一個非數值字元的下標,預設為0

b是轉換的基數,預設為10

 

容器適配器

適配器是一種機制,能使某種事物的行為看起來像另外一種事物。容器、迭代器、函數都有適配器。通用操作empty、size、swap

預設情況下,stack和queue是基於deque,priority_queue是基於vector實現。

stack:只要求push_back pop_back back,除了array和forward_list都可以

queue: 要求back、push_back、front、pop_front,可以構造與list或deque之上

priority_queue:除了front、push_back、pop_back的操作還要求隨機訪問,可以構造於vector或deque。

 

stack棧操作

s.pop()

s.push(item)

s.emplace(args)

s.top()

 

queue和priority_queue操作

q.pop()  返回queue首元素或者prio的最高優先順序元素

q.front() q.back()  返回首元素或者尾元素,不刪除,只適用於queue

q.top()   返回最高優先順序元素,但不刪除

q.push(item)   在queue末尾或者prio中恰當位置建立一個元素或者由args構造一個元素

q.emplace(args)

 

首碼中綴尾碼運算式

http://blog.csdn.net/yuyanggo/article/details/48063473

C/C++基礎----順序容器

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.