目錄
- STL的六大部件介紹
- 容器分類
- 序列式容器介紹(vector、list、deque)
- 關(guān)聯(lián)式容器
- 資料
- 收獲
一、STL六大部件
STL:cpp standard library cpp標準庫
STL的六大部件compounts:
- 容器 (Containers)
- 分配器(Allocators)
- 算法(Algorithms)
- 迭代器(Iteratros)
- 適配器(Adapters)
- 仿函數(shù)(Functors)
其中比較重要或者常用的部件是:容器、算法、迭代器、仿函數(shù)
迭代器是連接容器和算法的橋梁,仿函數(shù)是對“()”的操作符重載。接下來我們會重點學(xué)習(xí)實踐容器和算法。而本篇主要介紹各種容器的特性。
二、容器分類
容器從內(nèi)存分配是否是連續(xù)上來劃分,可以分為序列式容器和關(guān)聯(lián)式容器以及無序容器。
序列式容器:強調(diào)值的排序,每個元素都有固定的位置
包含以下幾種容器類型:
- Array(數(shù)組 固定大小)
- Vector(向量 會自動擴充)、
- Deque(雙向隊列,前后都可以擴充)
- List:鏈表(雙向鏈表)
- Forward-list:(單項鏈表)
關(guān)聯(lián)式容器:二叉樹結(jié)構(gòu),各元素之間沒有嚴格的物理上的順序關(guān)系。
使用場景:大量查找
包含以下幾種容器:
- Set/Multiset
- Map/Multimap :key-Value
其中 Set 和Map 元素內(nèi)容不可以重復(fù),Multiset和Multimap 元素內(nèi)容可重復(fù)
內(nèi)部是高度平衡的樹即紅黑樹結(jié)構(gòu)
無序容器
HashTable Separate Chaining
三、序列式容器介紹(vector、list、deque)
3.1 vector
Vector和普通數(shù)組的區(qū)別在于,數(shù)組是靜態(tài)空間,vector是動態(tài)擴展。這里的動態(tài)擴展并不是在原空間之后續(xù)接新空間,而是尋找更大的內(nèi)存空間,以兩倍增長的方式 ,將原數(shù)據(jù)拷貝過去。
獲取數(shù)據(jù)的方式
[]
at
front
back
容器互換: swap()
查看容器的容量: capacity()
重新制定vector容器大小: resize()
3.2 list 鏈表
鏈表是由一個個節(jié)點組成,節(jié)點包含 數(shù)據(jù)域和指針域。
優(yōu)點:對任意位置可以快速添加刪除數(shù)據(jù),只需要改變節(jié)點指針域的指向,而不用移動后續(xù)位置;大小比較靈活,不用想vector的雙倍擴展
缺點:遍歷速度沒有連續(xù)的array塊;由于指針域的存在,占用的空間比array大。
Stl中的鏈表是一個雙向循環(huán)鏈表。鏈表的迭代器只能前移或后移,不能跳躍
前加加: operator++() 返回值是self&
后加加: operator++(int) 返回值是self
3.3 deque容器
雙端數(shù)組,可以對頭端進香插入刪除操作,deque內(nèi)存上是分段連續(xù)的
順序容器適配器棧stack 內(nèi)部是deque實現(xiàn)
先進后出
順序容器適配器 隊列queue 先進先出,內(nèi)部也是deque實現(xiàn)
常用的方法如下:
賦值操作
=
assign(begin,end)
assign(n,num)
大小
deque.empty()
deque.size()
deque.resize(num)
deque.resize(num,elem)
沒有容量capacity
void printDeuqe(const deque<int &d>)
{
for(deque<int>::const_iterator it =d.begin();it !=d.end();it++)
{
cout << *it << "";
}
cout <<endl;
}
插入刪除
//在容器尾部添加一個數(shù)據(jù)
push_back(elem);
//在容器頭部添加一個容器
push_front(elem);
//刪除容器的最后一個數(shù)據(jù)
pop_back();
//刪除容器的第一個數(shù)據(jù)
pop_front();
//在pos位置插入一個elem元素的拷貝,返回新數(shù)據(jù)的位置
insert(pos,elem);
//在pos位置插入【beg,end)區(qū)間的數(shù)據(jù)
insert(pos,beg,end);
clear();
erase(pos);
erase(beg,end);
數(shù)據(jù)存取
//返回索引pos所指的數(shù)據(jù)
at(int pos);
opeartor[];
//返回容器中第一個數(shù)據(jù)元素
front();
//返回容器最后一個數(shù)據(jù)元素
back();
排序
//對beg和end區(qū)間內(nèi)元素進行排序
sort(iterator beg, iterator end)
四、關(guān)聯(lián)性容器
可以理解為 小型的關(guān)聯(lián)型數(shù)據(jù)庫
4.1 set/multiset容器
容器set中所有的元素插入時候會自動排序,其中set不允許重復(fù)值;multiset可以重復(fù)。
賦值
插入數(shù)據(jù)使用insert
賦值構(gòu)造
拷貝構(gòu)造
查找和統(tǒng)計
//查找key是否存在,如存在,返回該鍵的元素的迭代器;如不存在返回set.end()
find(key);
//統(tǒng)計key的元素個數(shù),對于set返回值是0或1.
count(key);
排序
利用仿函數(shù),改變排序規(guī)則
仿函數(shù) 重載(),記得加const
如: bool opeartor()(int x, int y) const;
class Mycompare
{
public:
bool operator()(int v1,int v2)
{
return v1 >v2;
}
}
對于自定義的數(shù)據(jù)類型排序,要使用仿函數(shù)制定排序規(guī)則。
set<Object,MyCompare>
4.2 map/multimap容器
map中所有元素都是pair,其中Pair的第一元素是key,起到索引作用,第二個元素是value,所有元素都會根據(jù)元素的key自動排序。
另外容器的迭代器采用左閉右開的區(qū)間編程
這篇就到這里,了解stl的六大組件,容器的分類,以及各種容器的特點,常用方法以及部分使用場景。從下一篇開始開始學(xué)習(xí)實踐算法,一起來學(xué)習(xí)吧。
五、資料
- 《Tinking in C++》
- 《C++Primer》
- [侯捷C++ STL 體系結(jié)構(gòu)與內(nèi)核分析] : https://www.bilibili.com/video/BV1db411q7B8?from=search&seid=653949808386505225 上面的圖片均來自于該資源。
六、收獲
- 了解stl的六大組件
- 了解序列式容器和關(guān)聯(lián)式容器的分類
- 了解各種容器的特點,常用方法,和優(yōu)缺點。
感謝你的閱讀
下一篇我們開始進入算法章節(jié)的學(xué)習(xí)實踐,在這也立個flag,每天更新一種類型的算法(遍歷、查找、排序、拷貝、替換等),這些基礎(chǔ)知識非常重要,來一起學(xué)習(xí)吧。 歡迎關(guān)注公眾號“音視頻開發(fā)之旅”,一起學(xué)習(xí)成長。
歡迎交流