C++ STL 概述_嚴絲合縫的合作者們( 二 )

  • 函數對象提供具體的算法策略 。
  • 算法相當于發動機,提供聚合動力 。
  • 容器是STL的核心(無數據無程序)組件,且類型繁多,下文將簡要介紹容器的共性操作 。
    2. 容器STL中的容器和數組相似,能夠存儲數據集,但有其自身的特點:
    • 支持容量的自動增長 。當添加數據時,如果容量不夠時,容器會自動分配新的內存 。
    • 容器可以迭代 。
    • 支持數據類型參數(泛型編程) 。
    2.1 分類STL中的容器眾多,有點亂入花叢漸迷眼的既視感 。一般會按照存儲方式對其進行分類:
    • 序列式容器:數據以添加時的順序進行存儲,當然可以對數據排序 。
    • 關聯式容器:數據由兩部分組成 。
    2.1.1 序列式容器序列式容器的存儲方案有 2 種:
    • 連續(線性)存儲:基于數組的存儲方式,數據與數據在內存中是相鄰的 。

    C++ STL 概述_嚴絲合縫的合作者們

    文章插圖
    • 鏈式(非線性)存儲:以節點的方式非線性存儲 。數據與數據在內存中并不一定相鄰,結點之間通過存儲彼此的地址知道對方的位置 。

    C++ STL 概述_嚴絲合縫的合作者們

    文章插圖
    STL中常用到的序列式容器對象:
    • vector:向量,線性存儲,類似于數組 。需要包含 <vector>頭文件 。
    • list:雙向鏈表,非線性存儲 。需要包含 <list>頭文件 。
    • slist:單向鏈表,非線性存儲 。需要包含 <slit>頭文件 。
    • deque:雙向隊列 。需要包含<deque>頭文件 。
    • stack:棧,先進后出 。需要包含<stack>頭文件 。
    • queue:隊列,數據先進先出 。需要包含<queue>頭文件 。
    • priority_queue:優先級隊列 。需要包含<queue>頭文件 。
    2.1.2 關聯式容器關聯式容器也有 2 種存儲方案:
    • 使用搜索二叉樹:容器中的元素依照鍵值進行排序 。STL是用紅黑樹實現關聯容器,紅黑樹是一種查找效率很高的平衡搜索二叉樹 。

    C++ STL 概述_嚴絲合縫的合作者們

    文章插圖
    • 使用哈希表:對鍵值進行哈希算法,然后根據哈希值把數據存儲在不同的單元中 。

    C++ STL 概述_嚴絲合縫的合作者們

    文章插圖
    STL中常用的關聯容器:
    • set:集合 。包含頭文件 <set> 。
    • map:映射 。包含頭文件<map> 。
    • multiset:可重復集合 。包含頭文件<set>
    • multimap:可重復映射 。包含頭文件<map> 。
    2.2 容器的通用操作2.2.1 初始化使用容器時包含:
    • 創建容器 。
    • 初始化容器 。初始化時可以指定容器的容量、為容器指定一系列初始值、為容器中的數據指定比較方法……
    初始化序列化容器:
    #include <iostream>#include <vector>#include <algorithm>#include <list>#include <set>using namespace std;//使用結構體作為函數對象int main(int argc, char** argv) {//初始容量為 12 向量容器vector<int> vec(12);cout<<"容器大?。?<<vec.size()<<endl;//初始化長度為 2,且值為 12 、30的向量容器vector<int> vec1 {12,30};cout<<"容器大?。?<<vec1.size()<<endl;//構造整型鏈表 , 初始容量 34list<int> lst(34);cout<<"容器大?。?<<lst.size()<<endl;//整型數組int ary1[5]= {1,2,3,4,5};//用數組初始化vector<int> vec2(ary1,ary1+5);cout<<"容器大?。?<<vec2.size()<<endl;//用向量初始化鏈表list<int> intList(vec.begin(),vec.end());cout<<"容器大?。?<<intList.size()<<endl;//用鏈表初始化集合set<int> intSet(lst.begin(),lst.end());cout<<"容器大?。?<<intSet.size()<<endl;return 0;}輸出結果:
    C++ STL 概述_嚴絲合縫的合作者們

    文章插圖
    初始化map、set容器時 。
    //創建并初始化集合set<int> mySet {1,5,3};//構造 map 容器map<std::string, int> myMap;//構造并初始化std::map<std::string, int>myMap{ {"rose",1},{"jone",2} };//輸出for (auto iter = myMap.begin(); iter != myMap.end(); ++iter) {cout << iter->first << " " << iter->second << endl;}

    推薦閱讀