探索C++ STL的设计方式:将算法与数据结构分离

STL的设计

  • 一、简介
  • 二、STL容器
  • 三、C数组
  • 四、用户定义的集合
    • 4.1、使用标准集合的typedef
    • 4.2、重用标准迭代器
    • 4.3、实现自己的迭代器
  • 五、总结

一、简介

本文介绍STL的设计方式,以及如何设计自己的组件,使其能够充分利用STL的功能。

STL的设计旨在将算法与数据结构分离。

算法包括:

  • 头文件<algorithm>中的算法。
  • 当我们的需求无法通过标准算法解决时,我们自己编写的算法。

数据包括:

  • 标准STL容器,如std::mapstd::vector
  • C 数组。
  • 用户定义的集合。
  • 上述内容的任何子部分。

数据甚至可以从流中获取。

通过“迭代器”接口,已经实现了将算法与数据结构分离的目的。
在这里插入图片描述

为了从各种算法的众多优势中受益,数据必须具备迭代器接口。下面介绍了如何为不同类型的数据实现迭代器。

二、STL容器

通过以下方式可以获得迭代器:

  • begin()end()
  • rbegin()rend()用于反向迭代器。
  • cbegin()cend()(或者const容器上的begin()end())用于常量迭代器。
  • crbegin()crend()(或者const容器上的rbegin()rend())用于常量反向迭代器。

三、C数组

对于C数组,指针扮演迭代器的角色。

int myInts[100];

std::for_each(myInts, myInts + 100, doSomething);

严格来说,myInts不是指针而是数组,但它仍然提供对数组的第一个元素的访问,而myInts + 100指向“结束后”的地址,符合begin-end的语义。

因此,C数组可以与算法一起使用,在旧代码中非常有帮助。

需要注意的是,自C++11以来引入了一种新的统一语法,使用std::begin(和std::end)自由函数(而不是类方法)。它们可以统一地用于任何具有可以无参数调用的begin(或end)方法的类型,并且也可以用于C数组。

下面的代码示例说明了这种统一性:

int myInts[100];
std::vector<int> vec(100, 0); // 大小为100且初始化为0

std::for_each(std::begin(vec), std::end(vec), doSomething);
std::for_each(std::begin(myInts), std::end(myInts), doSomething);

这使得使用C数组变得更加简单,并且对于通用代码非常方便。

需要注意的是,对于C数组,必须显式地写出std命名空间,因为它无法使用ADL,但对于vector可以省略std命名空间。

四、用户定义的集合

有时会编写自己的集合来满足特定领域的需求。以用户定义的FlowCollection类为例,该类表示一组财务流量。根据上面所见,为了能够使用算法,它需要提供迭代器。那么,该如何做呢?

4.1、使用标准集合的typedef

每当想编写一个集合时,先考虑一下是否有标准集合可以满足需求。这样可以减少需要编写的代码量。在很多情况下,标准集合就足够了,可以使用typedef为它加上一个领域名称。例如:

using FlowCollection = std::vector<Flow>;

这样,就可以免费获得所有迭代器以及std::vector的所有功能,同时还有一个带有领域名称的类型。

4.2、重用标准迭代器

如果集合确实需要领域功能,或者只想要标准容器提供的部分功能,可能需要定义一个包装标准容器的类。在这种情况下,可以使用标准容器的迭代器来实现迭代器:

// 接口

class FlowCollection
{
public:
    // ...领域接口...

    // 允许访问数据的迭代器
    using const_iterator = std::vector<Flow>::const_iterator;
    const_iterator begin() const;
    const_iterator end() const;

    // 允许修改数据的迭代器
    using iterator = std::vector<Flow>::iterator;
    iterator begin();
    iterator end();

    // 其他迭代器...

private:
    std::vector<Flow> m_flows;
    // ...领域数据...
};


// 实现

FlowCollection::iterator FlowCollection::begin()
{
    return m_flows.begin();
}

4.3、实现自己的迭代器

如果集合的复杂性超过了前面两种技术的范围,可能需要实现自己的迭代器。这样做更加复杂,超出了本文的范围,并且只有在非常罕见的情况下才需要这样做。

五、总结

这就是STL在当今C++中的地位。如果想要一窥STL在未来的发展趋势(以及如何立即开始使用它),可以看看ranges的相关内容。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多目标融合参数搜索

多目标融合 权重分类目人群。 trick normlize 不同Score之间含义、量级和分布差异较大&#xff1a;评分计算的不同部分的意义、范围和分布存在显著差异&#xff0c;这使得直接比较或融合它们的结果变得困难。显式反馈&#xff08;如点赞率&#xff09;存在用户间差异&#…

盘点四家企业软件巨头的Gen AI应用进程

文/明道云创始人任向晖 目前大部份行业分析还聚焦在Open AI&#xff0c;Langchain这些和Generative AI直接相关的企业和产品上。实际上&#xff0c;企业软件市场的感知和行动已经非常迅速。在此项技术进入公众视野18个月后&#xff0c;我们来盘点一下领先的企业软件应用是如何利…

Lua连接Redis客户端执行命令

该示例演示使用Redis连接池&#xff0c;及Redis执行命令与获取返回数据 require("api.website") local dkjson require("api.dkjson")-- 创建连接池 local pool redis_pool.new() -- 置连接池信息 pool:start("127.0.0.1",6379,"998866&…

C语言之argc、argv与main函数的传参

一 &#xff1a;谁给main函数传参 &#xff08;1&#xff09;调用main函数所在的程序的它的父进程给main函数传参&#xff0c;并且接收main函数的返回值 二 &#xff1a;为什么需要给main函数传参 &#xff08;1&#xff09;首先mian函数不传承是可以的&#xff0c;也就是说它的…

字符串拼接之char实现

目录 一、前言 二、memcpy函数用法 三、代码实现 一、前言 c中想到字符串拼接&#xff0c;我们都知道可以用c库中std::string的字符串中的简单加法进行拼接。示例&#xff1a; int main() {std::string str1 "hello";std::string str2 "World";std::…

OpenEuler系统学习

OpenEuler系统简介 什么是OpenEuler&#xff0c;个人理解就是&#xff1a;通过社区合作&#xff0c;打造统一和开放的操作系统。 官方是这么介绍的&#xff1a; 欧拉是数字基础设施的开源操作系统&#xff0c;可广泛部署于服务器、云计算、边缘计算、嵌入式等各种形态设备&a…

Vue 面试通杀秘籍

理论篇&#xff1a; 1. 说说对 Vue 渐进式框架的理解&#xff08;腾讯医典&#xff09; a) 渐进式的含义&#xff1a; 主张最少, 没有多做职责之外的事 b) Vue 有些方面是不如 React&#xff0c;不如 Angular.但它是渐进的&#xff0c;没有强主张&#xff0c; 你可以在原有…

Kimichat使用案例013:用kimichat批量识别出图片版PDF文件中的文字内容

文章目录 一、介绍二、具体操作三、信息识别一、介绍 图片版的PDF文件,怎么才能借助AI工具来提取其中全部的文字内容呢? 第一步:将PDF文件转换成图片格式 具体方法参见文章: Kimichat使用案例011:用kimichat将PDF自动批量分割成多个图片(零代码编程) 第二步:识别图片中…

Redis实战宝典:基础知识、实战技巧、应用场景及最佳实践全攻略

背景 在Java系统实现过程中&#xff0c;我们不可避免地会借助大量开源功能组件。然而&#xff0c;这些组件往往功能丰富且体系庞大&#xff0c;官方文档常常详尽至数百页。而在实际项目中&#xff0c;我们可能仅需使用其中的一小部分功能&#xff0c;这就造成了一个挑战&#…

重庆地区媒体宣传邀约资源整理

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 重庆地区媒体宣传邀约资源整理 一、主流媒体资源 电视台&#xff1a;重庆电视台&#xff1a;作为重庆地区最具影响力的电视媒体之一&#xff0c;拥有多个频道&#xff0c;涵盖新闻、综艺…

第2章 Rust初体验1/8:prelude:简化代码的自动标准库加载:猜骰子冷热游戏

讲动人的故事,写懂人的代码 在跑过Hello world程序后,三个人觉得这样还不过瘾,于是决定把那本Rust书里的猜数字游戏换个新面孔,变成“猜骰子冷热”游戏,然后一起动手实现一下。这样我们就能更深入地体验到Rust编程的乐趣啦。 (顺便说一句,如果你想找这本书的所有代码,…

Sklearn的安装和用法

安装sklearn相对简单&#xff0c;因为它是一个Python库&#xff0c;可以通过Python的包管理器pip来安装。 Windows、macOS和Linux通用步骤&#xff1a; 确保Python已安装&#xff1a; sklearn是基于Python的&#xff0c;所以首先确保你的计算机上安装了Python。推荐使用Pytho…

【图论应用】使用多路图(multigraph)对上海地铁站点图建模,并解决最短路径问题

文章目录 1 前言2 导包导入数据集3 创建多路图&#xff0c;导入节点和边信息3 绘制线路图4 计算最短路径 1 前言 最近正在学习图神经网络&#xff0c;先pick up了一些最基础的图论知识并学习了一些好玩的应用。 本文启发于B站视频&#xff08;BV1LY411R7HJ&#xff09;&#…

第1期JAVA社招面试经验月报

面经哥专注互联网社招面试经验分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥&#xff5c;面经哥整理了上月30篇面试经历&#xff0c;选取了较为热点高频的面试题供大家参考 基础知识类‍‍‍‍‍ 1、说下双亲委派原则以及类加…

HDFS 读写数据流程

优质博文&#xff1a;IT-BLOG-CN 一、HDFS 写数据流程 HDFS 文件写入流程图如下&#xff1a;三个模块&#xff08;客户端、NameNode、DataNode&#xff09; 【1】校验&#xff1a; 客户端通过 DistributedFileSystem 模块向 NameNode 请求上传文件&#xff0c;NameNode 会检…

使用手机做PC机摄像头

准备工作&#xff1a; 带摄像头的安卓手机一部模拟相机软件&#xff1a;Iriun 、DroidCam 、IP摄像头pythonopencv 一、Iriun 1、分别在PC和手机上安装 2、手机和PC在同一个局域网 3、分别打开PC和手机端软件&#xff0c;电脑端就可以使用手机相机 ​ 二、 DroidCam 1、…

5.大模型高效微调(PEFT)未来发展趋势

PEFT 主流技术分类 UniPELT 探索PEFT 大模型的统一框架&#xff08;2022&#xff09; UIUC 和Meta AI 研究人员发表的UniPELT 提出将不同的PEFT 方法模块化。 通过门控机制学习激活最适合当前数据或任务的方法&#xff0c;尤其是最常见的3大类PEFT 技术&#xff1a; Adapters…

【PB案例学习笔记】-18制作一个IP地址编辑框

写在前面 这是PB案例学习笔记系列文章的第18篇&#xff0c;该系列文章适合具有一定PB基础的读者。 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gite…

Cocos2dx 编译游戏安装包制作教程

在 Visual Studio 项目中配置图标并使用 Inno Setup 创建安装包 在本教程中&#xff0c;我们将学习如何为 Visual Studio 编译项目配置图标&#xff0c;并使用 Inno Setup 创建安装包。教程包括以下部分&#xff1a; 设置项目图标&#xff1a;在 Visual Studio 中配置 .exe 文…

英语国际音标 - DJ 音标 - KK 音标

英语国际音标 - DJ 音标 - KK 音标 1. 国际音标 (International Phonetic Alphabet&#xff0c;IPA)1.1. 记音类型1.2. 48 个国际音标发音表1.2.1. 元音 (vowel)1.2.1.1. 单元音 (monophthong)1.2.1.2. 双元音 (diphthong) 1.2.2. 辅音 (consonant)1.2.2.1. 清音 (voiceless so…