vector,list和map的構造

2021-06-20 12:26:25 字數 2793 閱讀 2559

vector

vector可能是應用最廣泛的容器類。vector支援動態陣列,即可以依據需要擴充的陣列。在c++中,乙個陣列的大小在編譯時就已確定了,這是應用陣列最有效的途徑,也是限制性最大的方法,程式無法在執行時調節陣列的大小來適應變化的程式條件。vector容器通過依據需要分配記憶體解決了這一問題。vrctor雖然是動態的,但依舊可以通過標準陣列來訪問其元素。

vector模板定義:template > class vector  。其中t是儲存在vector中的資料型別。allocator指明了這裡使用的標準預設記憶體配置器。vector有以下構造器:

explicit vector(const allocator &a=allocator( ));

explicit vector(size_type num, const t &val=t( ), const allocator &a=allocator( ));

vector(const vector&ob);

template vector(initer start, initer end, const allocator &a=allocator( ));

第一種形式構造乙個空的vector容器。第二種形式構造乙個有num個值為val的元素的vector容器,其中val可以是預設值。第三種形式構造乙個和ob容器元素相同的vector容器。第四種形式的建構函式構造乙個元素範圍由迭代器start和end確定的vector容器。為了滿足作大的靈活性,所有儲存在vector容器中的物件應定義預設的建構函式。vector定義了諸多比較運算子,如:==,<,<=,!=,>,>=。還定義了下標運算子,允許使用標準的陣列下標運算子訪問vector中的元素。

vectror容器功能很強,且安全性好,適應性強。但是效率比普通陣列低,所以大多數程式中可酌情考慮使用陣列還是vector容器。

list

list類支援雙向線性列表。不能像vector那樣支援隨機訪問,只支援順序訪問,由於list是雙向的,所以可以從前向後也可以從後向前訪問列表。

list容器模板定義:template > class list  。建構函式如下: 

explicit list(const allocator &a=allocator( ));

explicit list(size_type num, const t &val=t( ), const allocator &a=allocator( ));

list(const vector&ob);

template list(initer start, initer end, const allocator &a=allocator( ));

第一種形式的建構函式構造乙個空的list容器;第二種形式的建構函式構造乙個有num個值為val的list函式,其中val為預設值;第三種形式的建構函式構造乙個與ob有相同元素的list容器;第四種形式的建構函式構造乙個元素範圍由迭代器start和end確定的容器。list容器定義了如下比較運算子:==,<,<=,!=,>,>= 。成員函式與vector基本相似,特殊的:splice函式將兩個list連線在一起;merge函式將乙個list併入另乙個list。

容器函式end( )。並不返回指向容器的最後乙個元素的指標,它返回的指標指向最後乙個元素後面的位置。所以end( )-1才是指向容器的最後乙個元素。當迭代器與end( )函式返回的值相等時,說明容器中所有的元素都被訪問到了。由前端和後端插入元素都可以構成乙個list容器。push_back( )函式向容器後端加入元素,push_front( )函式向容器前端加入元素。

乙個有序的list可以和另乙個list合併,其結果是乙個包含了兩個原始list中所有元素的有序地list。新的list儲存在呼叫合併函式的list中,另乙個list在操作完成後為空。

map map類支援關聯式容器。乙個值對映到唯一乙個關鍵字。本質上這種對映就是給乙個值取乙個簡單的名字。乙個值儲存到容器後,可以通過關鍵字查詢到它。後者可以說,map就是乙個成對存放關鍵字/值的list容器。map容器的強大之處在於,可以通過關鍵字來查詢值。map容器中的關鍵字是唯一的,不可以重複使用。但可以使用multimap建立的map容器使用不唯一的關鍵字。

map模板定義:templat, class allocator=allocator>> class map  。其中key是關鍵字的資料型別,t是map容器中儲存的資料型別。comp是比較兩個關鍵字的函式,該函式預設多用途函式物件是less( )。allocator類是預設的記憶體配置器。有以下幾種建構函式:

explicit map(const comp &cmpfn=comp( ), const allocator &a=allocator( ));

map(const map&ob);

template map(initer start, initer end, const comp &cmpfn_comp( ), const allocator  &a=allocator( ));

第一種形式的建構函式構造乙個空的容器;第二種形式的建構函式構造乙個包含與ob元素相同的容器;第三種形式的建構函式構造乙個元素範圍由迭代器start和end確定的map容器,函式cmpfn如果存在,它決定容器中元素的順序。map容器定義了如下比較運算子:==,<,<=,!=,>,>= 。

關鍵字/值對以pair型別的物件的形式儲存在map容器中。pair型別模板定義如下:

templatestruct pair

建包含在first中,與鍵關聯的值包含在second中。構造乙個pair物件即可以用pair的建構函式也可以用make_pair( )函式。該函式根據傳入引數的型別來構造pair物件。make_pair( )函式其優點在於:儲存物件的型別由編譯器決定,而不需要明確指定。pair指定的資料型別必須與它要插入的map容器的相應資料型別相匹配。

Vector , list 和 deque的區別

vector 表示一段連續的記憶體區域,每個元素被順序儲存在這段記憶體中,對vector 的隨機訪問效率很高,但對非末尾元素的插入和刪除則效率非常低。deque 也表示一段連續的記憶體區域,但與vector不同的是它支援高效地在其首部插入和刪除元素,它通過兩級陣列結構來實現,一級表示實際的容器,第二...

vector list 和deque的優缺點

vector表示一段連續的記憶體區域,隨機訪問效率很高,因為每次訪問離起始處的位移都是固定的,但是在隨意位置插入刪除元素效率很低,因為它需要將後面的元素複製一遍。list表示非連續的記憶體區域,並通過一對指向首尾元素的指標雙向鏈結起來,從而允許向前和向後兩個方向進行遍歷。在list的任意位置插入和刪...

STL順序容器vector,list和deque

順序容器是通過將指定型別的元素按照位置順序進行儲存和訪問的一種容器型別.stl標準庫中的順序容器有三種 vector,list,和deque double ended queue雙端佇列,讀 d k 三個容器對應的標頭檔案 include include include一,容器的通用建構函式,假設容...