码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 1. STL六大组件


    0. 介绍

    STL提供六大组件,它们之间可以彼此套用,如下图所示:

    1. 容器(containers):用于存放数据;
    2. 算法(algorithms):包含各种常用算法;
    3. 迭代器(iterators):处于容器和算法中间,算法通过迭代器获取到容器的数据,并对数据进行操作;
    4. 仿函数(functors):行为类似函数,协助算法完成不同策略变化;
    5. 适配器(adapters):一种用来修饰容器、仿函数或者迭代器接口的东西;
    6. 配置器(allocators):负责底层动态空间配置、空间管理和空间释放;

    1. 六大组件的使用

    通过下面简单的程序,展示了六大组件的使用,具体内容如下:

    1. 定义了一个vector对象;
    2. 使用allocator为vector对象管理内存;
    3. begin和end返回迭代器,作为算法的输入;
    4. 使用count_if算法;
    5. 仿函数less;
    6. not1和bind2nd为functor的adaptor

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int main()
    7. {
    8.     int ia[6] = {27, 210, 12, 47, 109, 83};
    9.     vector<int, allocator<int>> vi(ia, ia+6);
    10.     // bind2nd(less(), 40): 元素小于40的值
    11.     cout << count_if(vi.begin(), vi.end(),
    12.                     not1(bind2nd(less<int>(), 40))) << endl;        // 4
    13.     return 0;
    14. }

    2. 令人困惑的C++语法

    在STL中,有些日常开发过程中不常见、令人困惑的C++语法,如template 特化和偏特化、临时对象或者function call操作符等等。

    2.1 迭代器的前闭后开区间表示法

    一对迭代器标示的区间是一个前闭后开的区间,也即[fisrst, last),整个实际范围从first开始,知道last-1结束。迭代器last所指的是“最后一个元素的下一位置“。

    2.2 临时对象的产生和使用

    临时对象,也称无名对象(unnamed objects),通过在template类名称之间直接加上一个小括号,并可指定初值,其意义相当于调用相应的构造函数constructor,且不指定对象名称。

    1. template <typename T>
    2. class print
    3. {
    4. private:
    5.     T text;
    6. public:
    7.     print() {};
    8.     print(T elem) : text(elem) {};
    9.     void operator() ()
    10.     {
    11.         cout << text << endl;
    12.     }
    13. };
    14. int main()
    15. {
    16.     print<int> obj1 ;   
    17.     obj1();    
    18.     print<int> obj2(10);
    19.     obj2();
    20.     // unnamed objects
    21.     print<int>() ();     // 前一个()是用来得到临时对象, 后一个()是用来调用operator()操作
    22.     print<int>(20) ();
    23.     return 0;
    24. }

    2.3 template类的特化和偏特化

    template特化指的是模板参数在特定类型下的具体实现,即将模型中的参数类型转换为特定(具体)的参数类型。

    偏特化(partial specialization)是模板特化的一种特殊形式。一般来说,特征也称他为全特化,即将所有的模板参数替换为具体参数类型,而偏特化是将部分参数类型转换为特定类型。

    3. 容器的结构

    3.1 序列式容器

    序列式容器指的是,以线性排列方式(内存地址连续)来存储某一特定类型的数据,包括array、vector、list、forward_list和deque五种。

    array

    如下图所示,array容器的大小,在容器创建之后是固定不变的,即不能增加或者删除元素,只能修改元素值。

    特性如下:

    vector

    vector容器是一个长度可变的容器,即在存储空间不足时,会通过allocator自动申请更多的空间。

    特性如下:

    list

    list容器,以双向链表方式组织元素,支持高效地删除和插入操作,但访问元素,需要遍历整个链表,直到找到目标元素。

    特性如下:

    forward_list

    forward_list容器,以单链表的形式组织元素,是一类比list容器快、更节省空间的容器。

    deque

    deque容器可以进行双向扩充,首尾都可以高效插入和删除元素。

    3.2 关联式容器

    与序列式容器不同,关联式容器在存储元素时会为每个元素都配备一个key,key和元素data以键值对的方式存储到容器中。关联式容器可以通过key找到对应的元素,且存储元素时,默认会根据各元素key的大小做升序排序,因此,关联式容器在查找、访问、插入和删除指定元素的效率更高。

    map和multi_map

    map和multi_map的底层实现是RB-tree,其中每个key都对应一个data,且在map中key值是独一无二的,使用multi_map时意味着key值可以重复。

    map的特性如下:

    multi_map的特性如下:

    set和multi_set

    set和multi_set的底层实现同样是RB-tree,且要求key和value值必须相等。

    set的特性如下:

    unordered_map和unordered_multimap(无序)

    unordered_map和unordered_multimap的底层实现是哈希表,也采用键值对的方式存储数据,且键值对是无序的,擅长通过键查找对应值,但是使用迭代器遍历容器中的元素效率不高。

    unordered_set和unordered_multiset(无序)

    unordered_set和unordered_multiset容器的底层实现也是哈希表,即键值对是无序的,且key值等于value值。

     至此,完成了对C++的STL简单介绍,后续将对六大组件进行详细描述。

  • 相关阅读:
    新手树莓派4B安装Supervised+Home Assistant
    GitLab 查看版本信息
    如何使用记事本制作一个简陋的小网页(1)
    Java&C++题解与拓展——leetcode30.串联所有单词的子串【么的新知识】
    Linux用gzip打包压缩和解压文件夹
    Matlab底层源码实现图像动态二值化
    论<script> 标签可以直接写在 HTML 文件中的哪些位置?(可以将 <script> 标签直接插入到 HTML 文件的任何位置)
    MySQL性能优化——MYSQL执行流程
    网址导航收藏引导页面H5源码(自适应引导页HTML源码)-自动检测域名延迟
    进程管理(五)
  • 原文地址:https://blog.csdn.net/hello_dear_you/article/details/128175346
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号