關聯容器
無序容器(unordered container)
容器介面卡(container adapter 12章)
只有std::array(於array
不提供rezise()
,因為大小固定
)固定大小的陣列(建立時必須指明大小),不能改變元素的個數,只能改變元素的值
元素的個數是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()
根據特定的排序規則,自動為元素排序。std::set和std::multiset(於關聯容器主要由
二叉樹(binary tree)
實現。對於每個元素(節點)其左子數所有元素比自己小,右子數所有元素比自己大,關聯容器差別主要在於元素種類及處理重複元素的方式優點:可快速找出乙個特定value的元素,具備對數複雜度(logarighmic complexity),而一般的順序容器是線性複雜度.(如1000個元素,平均有10次而不是500次比較動作)
缺點:不能直接改動元素的value(會破壞元素的自動排序)
)set
的元素根據其value自動排序,每個元素只能出現一次,不能重複
multiset
則可以出現重複的元素。
multiset cities;
//插入後自動排序,所以set內元素順序和插入順序無關
cities.
insert()
;for
(const
auto
& elem : cities)
std::map和std::multimapmap
的每個元素(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的迭代器指標
元素的次序不可預期,可比喻為乙個裝各種球的bagunordered_map同樣支援操作符通常以
hash table
實現…(value/key|hash_function|buckets-entries(linked list))所有無序容器可指明hash函式和等效準則以判斷是否發生重複
優點:查詢特定值元素的速度可能快於關聯容器(和使用的hash函式有關),常量複雜度
缺點:提供乙個良好的hash函式並不容易,而且需要提供許多記憶體給bucket
//基本使用同對應的關聯容器,僅僅是插入後次序不可預期
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...