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 和陣...