暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

C++之STL基础

戏命流沙 2022-05-16
478

    STL 是“Standard Template Library”的缩写,中文译为“标准模板库”。STL 是 C++ 标准库的一部分,不用单独安装。

1.学习STL的用处和优势?

      举个例子说明一下:

       以 C++ 定义数组的操作为例,在 C++ 中如果定义一个数组,可以采用如下方式:int a[n],这是一种常见的数组定义方式,但它存在着很大的缺陷,这种数组必须提前知道n的数值(常量整型),即数组的大小,这就意味着在实际应用中若是无法确认数组大小时只能去设置最大值,这样的设置极有可能造成资源的浪费。

        除此之外,还可以申请在堆空间中动态申请内存,此长度可以是动态的,定义方式如下所示:int *p = new int[n];这种定义方式可根据变量 n 动态申请内存,不会出现存储空间浪费的问题。但是,如果程序执行过程中出现空间不足的情况时,则需要加大存储空间,此时需要进行如下操作:

  1. 新申请一个较大的内存空间,即执行int * temp = new int[m];

  2. 将原内存空间的数据全部复制到新申请的内存空间中,即执行memecpy(temp, p, sizeof(int)*n);

  3. 将原来的堆空间释放,即执行delete [] p; p = temp;

但是!!!你如果使用STL标准库,将会将问题变得简单许多,你只需定义:vector<type>n,就可,如下所示的操作,将变得特别简单。

vector <int> a; //定义 a 数组,当前数组长度为 0,但和普通数组不同的是,此数组 a 可以根据存储数据的数量自动变长。

    //向数组 a 中添加 10 个元素
    for (int i = 0; i < 10 ; i++)
    a.push_back(i)
    //还可以手动调整数组 a 的大小
    a.resize(100);
    a[90] = 100;
    //还可以直接删除数组 a 中所有的元素,此时 a 的长度变为 0
    a.clear();
    //重新调整 a 的大小为 20,并存储 20 个 -1 元素。
    a.resize(20, -1)
    a.pop_back();//弹出元素

           对比以上几种使用数组的方式不难看出,使用 STL 可以更加方便灵活地处理数据。所以,大家只需要系统地学习 STL,便可以集中精力去实现程序的功能,而无需再纠结某些细节如何用代码实现。

    2.STL的组成

    表 1 STL 组成结构
    STL的组成                                        含义
    容器一些封装数据结构的模板类,例如 vector 向量容器、list 列表容器等。
    算法STL 提供了非常多(大约 100 个)的数据结构算法,它们都被设计成一个个的模板函数,这些算法在 std 命名空间中定义,其中大部分算法都包含在头文件 <algorithm> 中,少部分位于头文件 <numeric> 中。
    迭代器在 C++ STL 中,对容器中数据的读和写,是通过迭代器完成的,扮演着容器和算法之间的胶合剂。
    函数对象如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)。
    适配器可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。
    内存分配器为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。


    表 2 C++ STL头文件
    <iterator><functional><vector><deque>
    <list><queue><stack><set>
    <map><algorithm><numeric><memory>
    <utility>


    3.STL容器

             首先你得知道C++的STL容器,简单来讲,容器它就是一些模板类的集合,但和普通模板类不同的是,容器中封装的是组织数据的方法(也就是数据结构)。STL 提供有 3 类标准容器,分别是序列容器、排序容器哈希容器,其中后两类容器有时也统称为关联容器。

    表 3 STL 容器种类和功能
    容器种类功能
    序列容器主要包括 vector 向量容器、list 列表容器以及 deque 双端队列容器。之所以被称为序列容器,是因为元素在容器中的位置同元素的值无关,即容器不是排序的。将元素插入容器时,指定在什么位置,元素就会位于什么位置。
    排序容器包括 set 集合容器、multiset多重集合容器、map映射容器以及 multimap 多重映射容器。排序容器中的元素默认是由小到大排序好的,即便是插入元素,元素也会插入到适当位置。所以关联容器在查找时具有非常好的性能。
    哈希容器C++ 11 新加入 4 种关联式容器,分别是 unordered_set 哈希集合、unordered_multiset 哈希多重集合、unordered_map 哈希映射以及 unordered_multimap 哈希多重映射。和排序容器不同,哈希容器中的元素是未排序的,元素的位置由哈希函数确定。



    表 4不同容器的迭代器
    容器对应的迭代器类型
    array随机访问迭代器
    vector随机访问迭代器
    deque随机访问迭代器
    list双向迭代器
    set multiset双向迭代器
    map / multimap双向迭代器
    forward_list前向迭代器
    unordered_map / unordered_multimap前向迭代器
    unordered_set / unordered_multiset前向迭代器
    stack不支持迭代器
    queue不支持迭代器

    大家感兴趣的,可以对上述的容器进行操作和熟悉!!

    文章转载自戏命流沙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

    评论