c 容器使用

2021-10-03 16:34:30 字數 4386 閱讀 8944

關聯容器

無序容器(unordered container)

容器介面卡(container adapter 12章)

只有array不提供rezise(),因為大小固定

std::array(於)
固定大小的陣列(建立時必須指明大小),不能改變元素的個數,只能改變元素的值

元素的個數是array型別的一部分,std::array和std::array是2個不同的型別

std::array5> coll;

//contain 5 string elements

//print each element with its index on a line

for(

int i =

0; i <5;

++i)

std::vector(於)
類似陣列,尾部插入元素快,插入位置越靠前代價越大(沒有push_front)

vector預設或預定記憶體不夠時需要重新分配記憶體,並將現有元素拷貝到新位置

string類似vector,但元素都為字元

std::vector<

int> test =};

//1個元素

std::vector<

int> test2 =

;//1個元素

std::vector<

int> test =};

//1個元素,值為0

std::vector<

int> test2 =

;//0個元素

test.

push_back(1

);//vector只有push_back,不能push_front

std::deque(於)
double-ended queue的縮寫,是乙個dynamic array,可以向兩端發展。

在尾部和頭部出入元素都很迅速。中間插入需要移動其他元素,比較費時

std::deque<

int> coll;

for(

int i =

0; i <9;

++i>

) coll.

push_front

(i);

//insert at the front

coll.

push_back

(i);

//insert at the back

std::cout<

}

std::list(於)-std::forward_list(於)
list由雙向鍊錶(doubly linked list)實現而成,其中每個元素都以一部分記憶體指示其前導元素和後繼元素

優點:任何位置插入和刪除元素快,只需改變鏈結(link)即可,而vector和deque需移動很多元素

缺點:隨機訪問的效率和vector和deque相比差很多。

list<

char

> coll;

//list container for charactre elements

for(

char c =

'a'; c <=

'z';

++c)

elem

for(

auto elem : coll)

//使用range-based for迴圈

elem

while

(!coll.

empty()

)

forward_list只不過是收到更多限制的list,和list差異較小

forward_list是乙個由元素構成的單向(singly)linked list,每個元素都有自己的一段記憶體只指向後繼元素

不支援puch_back()和size()

根據特定的排序規則,自動為元素排序。

關聯容器主要由二叉樹(binary tree)實現。對於每個元素(節點)其左子數所有元素比自己小,右子數所有元素比自己大,關聯容器差別主要在於元素種類及處理重複元素的方式

優點:可快速找出乙個特定value的元素,具備對數複雜度(logarighmic complexity),而一般的順序容器是線性複雜度.(如1000個元素,平均有10次而不是500次比較動作)

缺點:不能直接改動元素的value(會破壞元素的自動排序)

std::set和std::multiset(於)
set的元素根據其value自動排序,每個元素只能出現一次,不能重複

multiset則可以出現重複的元素。

multiset cities;

//插入後自動排序,所以set內元素順序和插入順序無關

cities.

insert()

;for

(const

auto

& elem : cities)

std::map和std::multimap
map的每個元素(key/value),key是排序準則的基準,每個key只能出現一次,不能重複

multimap則允許出現相同的key

每個元素的型別其實為pair,key為const是因為如果內容被改動將破壞元素次序

map支援操作符

multimap<

int, string> coll;

coll =,,

,,};

for(

const

auto

& elem : coll)

std::map的lower_bound和upper_bound

僅僅是不小於(lower_bound)和大於(upper_bound)這麼簡單

map::lower_bound(key):返回map中第乙個大於或等於key的迭代器指標

map::upper_bound(key):返回map中第乙個大於key的迭代器指標

元素的次序不可預期,可比喻為乙個裝各種球的bag

通常以hash table實現…(value/key|hash_function|buckets-entries(linked list))

所有無序容器可指明hash函式和等效準則以判斷是否發生重複

優點:查詢特定值元素的速度可能快於關聯容器(和使用的hash函式有關),常量複雜度

缺點:提供乙個良好的hash函式並不容易,而且需要提供許多記憶體給bucket

unordered_map同樣支援操作符

//基本使用同對應的關聯容器,僅僅是插入後次序不可預期
stack(先進後出filo)、queue(先進先出fifo)基於deque實現

priority_queue(元素具有基於排序準則的優先權)基於vector實現

乙個容器介面卡接受一種容器型別使其行為看起來像另一種不用的容器

順序容器介面卡

queue 佇列 front()第乙個,back()最後乙個,pop()刪除第乙個

std::unordered_set

std::unordered_set<

int> c;

//普通插入,返回pair《迭代器,插入是否成功》

std::pairint>

::iterator,

bool

> c_insert = c.

insert(1

);if(c_insert.

second()

)//如果插入成功...

C 之stack容器使用

c stack 堆疊 是乙個容器的改編,它實現了乙個先進後出的資料結構 filo 使用該容器時需要包含 include標頭檔案 定義stack物件的示例 如下 stacks1 stacks2 stack的基本操作有 1.入棧 如s.push x 2.出棧 如 s.pop 注意 出棧操作只是刪除棧頂的...

C 之queue容器使用

queue 模板類的定義在標頭檔案中。與stack 模板類很相似,queue 模板類也需要兩個模板引數,乙個是元素型別,乙個容器類 型,元素型別是必要的,容器型別是可選的,預設為deque 型別。定義queue 物件的示例 如下 queueq1 queueq2 queue 的基本操作有 入隊,如例 ...

C set容器使用

stl的set是乙個二叉排序樹,也稱為集合,其在stl內部實現是紅黑樹,能夠將元素預設從小到大排序或者是字典序排序。如果宣告的元素型別不是基本資料型別而是自定義的類要給它乙個比較器,類似於sort的compare。include include include include using names...