13天带你了解C++ ---DAY8 C++之STL简介

13天带你了解C++ ---DAY8 C++之STL简介,第1张

目录

1.STL概念

1.1STL六大组件

2.容器

3.算法

4.迭代器

5.仿函数

6.适配器

7.空间配置器


🚲🚲🚲🚲🚲🚲🚲🚲🚲🚲🚲🚲🚲🚲

1.STL概念

        我们在使用C语言时,完成一个功能需要从头开始实现函数,这就造成了效率低下的问题,所以在c++中引入了STL库,为开发者提供以模板形式封装好的数据结构和算法,提高开发者的代码复用率,同时提高开发效率。 

        STL汉化过来是标准模板库,是惠普实验室开发的一系列软件的统称,现在主要使用在C++中,但是他的出现其实是早于C++的。

1.1STL六大组件

STL的六大组件分别是:

        容器、迭代器、仿函数、适配器(配接器)、空间配置器。

2.容器

                容器分为序列式容器关联式容器,即线性和非线性的数据结构。

                序列式容器强调元素存在的顺序,内部通过链表,顺序表、栈和队列实现。它主要强调控制元素存储和顺序访问的能力。C++的序列式容器vector,deque,list,forward_list,string几种。

                关联式容器通过树型结构实现,主要强调存储键值对,并不强调元素顺序,而是强调检索效率。C++的关联式容器有map,set,multimap,multiset。

3.算法

        各种常用的算法,比如find,sort,for_each等,它们都是以函数模板的方式实现的,所以我需要按照函数模板的方式调用。

         STL算法主要由头文件,,组成。所以我们在使用时需要包含头文件,数值算法须包含中则定义了一些模板类,用来声明函数对象。

 STL中算法大致分为四类:
        非可变序列算法:指不直接修改其所 *** 作的容器内容的算法。
        可变序列算法:指可以修改它们所 *** 作的容器内容的算法。
        排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合 *** 作。
        数值算法:对容器内容进行数值计算。


   具体算法内容可以参考C++官方文档

4.迭代器

        迭代器(iterator)是一种概念上通用的指针,它不仅能够遍历线性容器,还能遍历非线性容器,听起来很神奇吧。实际上每个容器内部都定义了自己的迭代器,不过是在封装的时候对外暴露出相同的接口名,底层实现每个容器的迭代器都有自己的实现方式。

        所以这也就解释了,为什么可以使用for循环加迭代器直接遍历map这种非线性结构中的元素,此处的迭代器底层是和顺序表底层完全不同的。

        迭代器的引入意义很大,比如它具有遍历复杂数据结构的能力,比如它可以把抽象容器和通用算法有机的统一起来。各种容器迭代器的接口相同,具体型号却不同,这非常符合泛型编程的思想。

5.仿函数

        仿函数即仿照的函数,表示它功能与函数类似但并不是真正的函数,它是一个函数对象。在C++中它通过重载函数调用运算符即 ()运算符。在仿函数的类中,通常不需要定义构造函数和析构函数,这将由系统帮我们自动完成。我们最好将重载()的函数定义为常函数,这表明我们并不会改变传入的参数,避免一些麻烦。

🚀🚀🚀举个例子,比较是否大于5

class compare{
public:
    const int num;
     bool operator()(const int a) {
     return a>num;
 }
}

int main(){
    vector v{1,2,3,4,5,6,7,8,9,10};
    int ans=count_if(v.begin(),v.end(),compare (5));   //创建了一个匿名对象
    printf("%d",ans);

    return 0;
}

         结论:c++算法中使用了大量的仿函数,因为它有很多优点,比如它可以有成员变量和成员函数,可以有状态,比如相比于普通函数它可以提高效率。STL库中也提供了很多仿函数。

6.适配器

        现在很多人都有3.5mm转type-c口的耳机转接头,它就是现实中的适配器,因为市面上很大一部分耳机都是3.5mm口,而手机是type-c口,我们想到的方法就是买一个适配器,因为这样成本最低。

        软件开发也是同样的道理,假如想将两个已经成熟的系统合并在一起,一种方法是将所有方法拆开重新实现,另一种方法是写一个适配器,进行接口封装转换,非常节省成本。

        适配器是一种设计模式,该种设计模式将一个类的接口转化成客户希望的另一个接口。C++标准库提供了三种顺序容器适配器:queue(FIFO队列)、priority_queue(优先级队列)、stack(栈),比如list中实现了正向迭代器和反向迭代器,那么反向迭代器就可以看成正向迭代器的适配器。

7.空间配置器

        

        侯捷在《STL源码剖析》中写到,“以STL运用的角度而言,空间配置器是最不需要介绍的,它总是藏在一切组件的背后,默默工作。整个STL的 *** 作对象都存放在容器之中(vertor、list),而容器一定需要配置空间以放置资料,这就是空间配置器的作用。”

        初入门的程序员不必去深究底层原理,当你技术娴熟,想要自己实现内存池的时候可以来参考学习一下。我在此买描述一下大致的原理,我们在使用new和delete *** 作时,编译器首先会调用operator new *** 作和operator delete *** 作,它们再调用底层封装的malloc *** 作free *** 作,然后调用构造函数和析构函数。

        在频繁申请和释放小内存时,如果我们每次都调用malloc开辟空间,效率会很低,所以STL引入了空间配置器,可以理解为辅助分配内存。以SGI STL的双层配置器来说,第一层直接使用malloc和free,第二层使用内存池设计。当申请的内存大于128字节时,直接使用malloc开辟内存,如果申请的空间小于128字节时,使用内存池申请和释放空间

        这个内存池实际上就是提前申请好一块空间,将这块空间切分成一块一块,使用链表穿在一起,申请空间时,使用头删法从链表中拿空间,资源释放空间后又使用头插法挂回链表上,由于是从链表上拿空间,极大的提高了申请和释放内存的效率。

        总结:当然它们内部原理比我描述的复杂的多,我只是为了方便大家理解,提炼了一些主要步骤。

                

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/707040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存