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;}

    推荐阅读