C 標準容器

2021-06-29 11:50:25 字數 4203 閱讀 6204

1. c++

中的容器類包括

「順序儲存結構」和

「關聯儲存結構」,

「順序儲存結構」包括

vector

,list

,deque等;

「關聯儲存結構」包括

set,

map,

multiset

,multimap等。

若需要儲存的元素數在編譯器間就可以確定,可以使用陣列來儲存,否則,就需要用到容器類了。

2. 各種用法:

如果經常需要基於關鍵碼完成檢索,用map

如果一般的表操作只關重要,用list

如果大量新增和刪除操作出現在容器的一端或兩端,用deque

、stack

、queue

如果隨機訪問操作用,或在末尾增刪用vector

3. 功能:

vector提供隨機訪問迭代器,

list

是一種最合適於做元素插入和刪除的序列,與

vector

相比,list

沒有提供下標操作,

list

提供的是雙向迭代器,而不是隨機訪問迭代器。

deque是一種雙端的佇列,對其兩端的操作效率類似於

list

,而對其下標的操作接近於

vector

的效率,在中間插入和刪除元素具有和

vector

一樣的低效。

關聯陣列也被成為對映(map

),有時被稱為字典,

map中的關鍵碼具有唯一性,

map提供雙向迭代器。對於沒有明顯順序的元素,或者不必保持容器有序的情況,可以考慮用

hash map。

4. 優缺點:

vectoer

向量 相當於乙個陣列

在記憶體中分配一塊連續的記憶體空間進行儲存。支援不指定

vector

大小的儲存。

stl內部實現時,首先分配乙個非常大的記憶體空間預備進行儲存,即

capacituy

()函式返回的大小,當超過此分配的空間時再整體重新放分配一塊記憶體儲存,這給人以

vector

可以不指定

vector

即乙個連續記憶體的大小的感覺。通常此預設的記憶體分配能完成大部分情況下的儲存。

優點:(1) 

不指定一塊記憶體大小的陣列的連續儲存,即可以像陣列一樣操作,但可以對此陣列進行動態操作。通常體現在

push_back() pop_back()

(2) 隨機訪問方便,即支援

[ ]操作符和

vector.at()

(3) 節省空間。

缺點:(1) 

在內部進行插入刪除操作效率低。

(2) 只能在

vector

的最後進行

push

和pop

,不能在

vector

的頭進行

push

和pop

。(3) 當動態新增的資料超過

vector

預設分配的大小時要進行整體的重新分配、拷貝與釋放

list

雙向鍊錶

每乙個結點都包括乙個資訊快

info

、乙個前驅指標

pre、乙個後驅指標

post

。可以不分配必須的記憶體大小方便的進行新增和刪除操作。使用的是非連續的記憶體空間進行儲存。

優點:(1) 

不使用連續記憶體完成動態操作。

(2) 在內部方便的進行插入和刪除操作

(3) 可在兩端進行

push

、pop

缺點:(1) 

不能進行內部的隨機訪問,即不支援

[ ]操作符和

vector.at()

(2) 相對於

verctor

占用記憶體多

deque

雙端佇列 

double-end queue

deque是在功能上合併了

vector

和list

。優點:

(1) 

隨機訪問方便,即支援

[ ]操作符和

vector.at()

(2) 在內部方便的進行插入和刪除操作

(3) 可在兩端進行

push

、pop

缺點:(1) 

占用記憶體多

使用區別:

1 如果你需要高效的隨即訪問,而不在乎插入和刪除的效率,使用

vector 

2 如果你需要大量的插入和刪除,而不關心隨即訪問,則應使用

list 

3 如果你需要隨即訪問,而且關心兩端資料的插入和刪除,則應使用

deque

5. 在

c++中,

vector

是乙個十分有用的容器,下面對這個容器做一下總結。

1 基本操作

(1)標頭檔案

#include.

(2)建立

vector

物件,vectorvec;

(3)尾部插入數字:

vec.push_back(a);

(4)使用下標訪問元素,

cout《記住下標是從

0開始的。

(5)使用迭代器訪問元素

.vector::iterator it;for(it=vec.begin();it!=vec.end();it++)    cout<<*it<(6)插入元素:

vec.insert(vec.begin()+i,a);

在第i+1

個元素前面插入

a;(7)刪除元素:

vec.erase(vec.begin()+2);

刪除第3

個元素vec.erase(vec.begin()+i,vec.end()+j);刪除區間

[i,j-1];

區間從0

開始(8)向量大小

:vec.size();

(9)清空

:vec.clear();

3  演算法

(1) 使用

reverse

將元素翻**需要標頭檔案

#include

reverse(vec.begin(),vec.end());將元素翻轉(在

vector

中,如果乙個函式中需要兩個迭代器,一般後乙個都不包含

.)(2)使用

sort

排序:需要標頭檔案

#include

,sort(vec.begin(),vec.end());(預設是按公升序排列

,即從小到大

).可以通過重寫排序比較函式按照降序比較,如下:

定義排序比較函式:

bool comp(const int &a,const int &b)

呼叫時:sort(vec.begin(),vec.end(),comp)

,這樣就降序排序。

7. map的基本操作函式:

c++maps 是一種關聯式容器,包含

「關鍵字/值

」對begin() 返回指向

map頭部的迭代器

clear(

)刪除所有元素

count() 返回指定元素出現的次數

empty() 如果

map為空則返回

true

end() 返回指向

map末尾的迭代器

equal_range() 返回特殊條目的迭代器對

erase() 刪除乙個元素

find() 查詢乙個元素

get_allocator() 返回

map的配置器

insert() 插入元素

key_comp() 返回比較元素

key的函式

lower_bound() 返回鍵值

>=

給定元素的第乙個位置

max_size() 返回可以容納的最大元素個數

rbegin() 返回乙個指向

map尾部的逆向迭代器

rend() 返回乙個指向

map頭部的逆向迭代器

size() 返回

map中元素的個數

swap() 交換兩個

mapupper_bound() 返回鍵值

>

給定元素的第乙個位置

value_comp() 返回比較元素

value

的函式

C 標準容器

c 裡的容器很多,但可以按照不同的標準進行分類,常見的一種分類是依據元素的訪問方式,分成順序容器 有序容器和無序容器三大類別。容器就是對資料結構的抽象和封裝,即能夠 容納 存放 元素的一些資料結構。c 標準庫里的容器幫助我們實現了最基本和最經典的資料結構,且容器的效能和優化水平已經非常完善,這一塊不...

C 標準庫關聯容器

1 關聯容器定義 儲存物件集合的型別,支援通過鍵的高效訪問。和順序容器的本質差別在於 順序容器通過元素在容器中的位置順序儲存和訪問元素,而關聯容器卻是依靠鍵。map和set是兩個基本的關聯容器型別,map以鍵值對的形式組織儲存元素,而set僅儲存鍵。2,pair型別 在utility標頭檔案中定義 ...

c 標準庫 容器類

容器類可以分為兩大類和容器介面卡 1 序列容器 sequence containers 這種容器中的元素是有序的,每乙個元素在容器中都有乙個確切的位置,這個位置不依賴於元素的值,而是跟放入容器的時機有關。標準的序列容器有三個 vector,deque,list。另外你也可以把字串 string 和陣...