1. STL六大组件

news2024/11/13 8:55:17

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<int>;
  6. not1和bind2nd为functor的adaptor

#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>

using namespace std;

int main()
{
    int ia[6] = {27, 210, 12, 47, 109, 83};
    vector<int, allocator<int>> vi(ia, ia+6);
    // bind2nd(less<int>(), 40): 元素小于40的值
    cout << count_if(vi.begin(), vi.end(),
                    not1(bind2nd(less<int>(), 40))) << endl;        // 4

    return 0;
}

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

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

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

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

2.2 临时对象的产生和使用

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

template <typename T>
class print
{
private:
    T text;
public:
    print() {};
    print(T elem) : text(elem) {};

    void operator() ()
    {
        cout << text << endl;
    }
};
int main()
{

    print<int> obj1 ;   
    obj1();    
    print<int> obj2(10);
    obj2();

    // unnamed objects
    print<int>() ();     // 前一个()是用来得到临时对象, 后一个()是用来调用operator()操作
    print<int>(20) ();
    return 0;
}

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简单介绍,后续将对六大组件进行详细描述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/60662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Dubbo-RPC核心接口介绍

前言 Dubbo源码阅读分享系列文章&#xff0c;欢迎大家关注点赞 SPI实现部分 Dubbo-SPI机制 Dubbo-Adaptive实现原理 Dubbo-Activate实现原理 Dubbo SPI-Wrapper 注册中心 Dubbo-聊聊注册中心的设计 Dubbo-时间轮设计 通信 Dubbo-聊聊通信模块设计 RPC 聊聊Dubbo协议 …

go语言日志实现详解(打印日志、日志写入文件和日志切割)

log包定义了Logger类型&#xff0c;该类型提供了一些格式化输出的方法。本包也提供了一个预定义的“标准”logger&#xff0c;可以通过调用函数Print系列(Print|Printf|Println&#xff09;、Fatal系列&#xff08;Fatal|Fatalf|Fatalln&#xff09;、和Panic系列&#xff08;P…

[附源码]计算机毕业设计JAVA医院挂号管理系统

[附源码]计算机毕业设计JAVA医院挂号管理系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

简单的咖啡文化静态HTML网页设计作品 DIV布局咖啡馆文化网页模板代码 DW咖啡网站制作成品

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

达梦安装目录各个文件夹解析

达梦安装目录各个文件夹解析 总览&#xff1a; 1、bin目录 bin目录&#xff1a;存放常用命令和.so(shared object)文件&#xff08;动态链接库类似Windows的ddl文件、Linux的lib目录&#xff09; 2、bin2目录 bin2目录&#xff1a;存放utf8的lib库 3、data目录 data目录&#…

LeetCode 744. 寻找比目标字母大的最小字母

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 744. 寻找比目标字母大的最小字母 &#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名…

Centos7 内核升级(5.4.225)

文章目录一、背景二、在线 yum 安装1&#xff09;查看当前内核版本信息2&#xff09;导入仓库源3&#xff09;选择 ML 或 LT 版本安装4&#xff09;设置启动5&#xff09;生成 grub 配置文件6&#xff09;重启7&#xff09;验证是否升级成功8&#xff09;删除旧内核&#xff08…

【应用】布隆过滤器

布隆过滤器布隆过滤器简介及使用场景布隆过滤器底层原理数据添加数据查询布隆过滤器的优缺点Redis 整合布隆过滤器Java 整合布隆过滤器SpringBoot 整合 Redis 使用布隆过滤器布隆过滤器简介及使用场景 布隆过滤器实际上是一列很长的二进制数组&#xff0c;在每个位置上只有 0 …

CommonsCollections4利用链分析

目录 前言&#xff1a; 0x01 代码分析 总结一下利用链&#xff1a; POC: 完整的POC&#xff1a; 图 1-1 cc利用链前言&#xff1a; CC4这条链用到了新的Commons-Collections4这个依赖&#xff0c;由于这个依赖与之前的版本具有较大的出入&#xff0c;连groupId和artifactId…

Android 基础知识4-2.1常用控件文本框(TextView)

TextView就是用来显示文本标签的控件&#xff0c;修改使用TextView显示文本的颜色、大小等属性。 实例代码&#xff1a; xml&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.co…

有源晶振与无源晶振的区别

今天就来和大家分享下有源晶振和无源晶振的区别。 1.从外形上有源大部分有源晶振是这种四脚贴片的&#xff0c;差分有源晶振的话一般是6脚的&#xff0c;当然还有其它的一些封装 而无源晶振的有两脚插件的也有和有源晶振一样的这种四脚贴片的 2.无源晶振不需要额外供电&#x…

.移动端适配的解决方案

何为移动端适配 移动端适配就是值在不同的移动端 可以去讲我们的内容适应不同屏幕尺寸大小 我们之前写单位用的是px这个单位 但是这是一个写死的单位 rem 所以我们用一个可变的单位 rem &#xff08;是指用html字体大小作为单位 比如说我们设置html字体大小为16px 那么 …

[附源码]计算机毕业设计基于springboot的残障人士社交平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

一篇文章了解MySQL的group by

准备工作&#xff01; 1.本文章MySQL使用的是5.7&#xff0c;引擎使用的是innodb 2. 使用的表结构&#xff08;t1&#xff09;&#xff0c;字段a上有一个索引&#xff0c; 1. group by常用方法&#xff1a; group by的常规用法是配合聚合函数&#xff0c;利用分组信息进行统…

公众号网课查题接口使用方法

公众号网课查题接口使用方法 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 题库&#xff1a;题库后台&#xff08;点击跳转&…

用Hopper修改代理软件端口

背景 用代理软件可以访问google&#xff0c;但是端口经常不固定&#xff0c;从缺省1080变成了随机。 前几天其实已经用Hopper 3.0看了一次&#xff0c;但是好像不支持go&#xff0c;所以没反编译成功&#xff0c;这次换了4.0&#xff0c;支持了go。 Hopper与逆向 逆向的目的…

7.7 网络(二)

接上篇&#xff1a;7.7 网络&#xff08;一&#xff09;_龙赤子的博客-CSDN博客 目录 三 操作系统涉及的网络内容 1 网络栈 2 协议 3 应用 三 操作系统涉及的网络内容 1 网络栈 这里我们重点讨论操作系统里面的网络。这部分在整个网络架构中&#xff0c;属于端的技术。对于端来…

Spring - ApplicationContextAwareProcessor扩展接口

文章目录Preorg.springframework.context.support.ApplicationContextAwareProcessor内部的7个扩展点源码解析扩展示例Pre Spring Boot - 扩展接口一览 org.springframework.context.support.ApplicationContextAwareProcessor /** Copyright 2002-2020 the original author …

python中xpath解析

**前言&#xff1a;**今年博客更新的太少了&#xff0c;很多学习计划都因为工作原因延迟了&#xff0c;今年真的身心太疲惫了&#xff0c;终于有点能理解为什么有的同行们会无心学习了&#xff0c;今年同样也是吃老本的一篇博客&#xff0c;所谓好记性不如烂笔头&#xff0c;以…

Java中静态域和静态方法的一些梳理

最近发现自己对一些Java中的静态域和静态方法的基础知识掌握的不是特别牢靠&#xff0c;于是针对一些自己之前模棱两可的点&#xff0c;进行书籍的翻阅复习。 参考文献&#xff1a; Java核心技术卷一 静态域 将域定义为static&#xff0c;代表该类的所有实例对象都共享这一个…