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

news2025/1/15 6:31:26

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.coloradmin.cn/o/1810732.html

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

相关文章

Golang | Leetcode Golang题解之第135题分发糖果

题目&#xff1a; 题解&#xff1a; func candy(ratings []int) int {n : len(ratings)ans, inc, dec, pre : 1, 1, 0, 1for i : 1; i < n; i {if ratings[i] > ratings[i-1] {dec 0if ratings[i] ratings[i-1] {pre 1} else {pre}ans preinc pre} else {decif dec…

【权威发布】2024年新能源与人工智能国际会议(ICNEAI 2024)

2024年新能源与人工智能国际会议 2024 International Conference on New Energy and Artificial Intelligence 会议简介 2024年新能源与人工智能国际会议是一场聚焦新能源与人工智能交叉领域前沿科技探讨的盛会。此次会议汇集了全球能源、环保和人工智能领域的专家学者、科技人…

WT32-ETH01作为TCP Server进行通讯

目录 模块简介WT32-ETH01作为TCP Server设置W5500作为TCP Client设置连接并进行通讯总结 模块简介 WT32-ETH01网关主要功能特点: 采用双核Xtensa⑧32-bit LX6 MCU.集成SPI flash 32Mbit\ SRAM 520KB 支持TCP Server. TCP Client, UDP Server. UDP Client工作模式 支持串口、wi…

服务部署:解决Docker容器与虚拟机主机之间MySql连接访问问题

一、场景&#xff1a; 虚拟机上Ubuntu系统安装了Mysql&#xff0c;现在有一个服务应用需要使用docker来部署&#xff0c;服务应用需要连接mysql做数据库基础使用&#xff0c;配置文件中配置了虚拟主机的IP和端口&#xff0c;但是还是无法连接到Mysql&#xff0c;报错无法连接超…

零基础直接上手java跨平台桌面程序,使用javafx(四)用Apache POI读取excel文件。

Apache POI这个库&#xff0c;可能是JAVA平台最好操作excel文件的库了。怎么才能使用呢&#xff1f; 1、下载Apache POI&#xff0c;本来是个很简单的事情&#xff0c;但是也有坑。这也就是我一直不敢用java的原因之一&#xff0c;这些莫名其妙的坑&#xff0c;总是让人烦躁。…

MAC安装idea教程

https://blog.csdn.net/qq_41810415/article/details/131649541 JDK安装 https://blog.csdn.net/dddebug/article/details/121713633 2、编辑.bash_profile文件 vim .bash_profile 进入编辑模式后 按 i 开始添加内容 结束编辑模式按 ESC 结束后保存输入 :wq! 不保存输入 :q! 检…

Apple - IOKit Fundamentals

本文翻译整理自&#xff1a;IOKit Fundamentals &#xff08;Updated: 2014-04-09 https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/Introduction/Introduction.html 文章目录 一、I/O Kit 基础知识简介1、谁应该阅读本…

vue2插槽

本节目标 默认插槽后备内容具名插槽作用域插槽案例-商品列表 默认插槽 让组件内部的一些结构 支持自定义 步骤 组件内需要定制的结构, 使用<slot></slot>占位 使用组件时, 传入结构替换slot的位置 后备内容 封装组件时, 可以为预留的<slot>插槽提供默认内…

Nacos长轮询底层是怎么实现的?

点击下方“JavaEdge”&#xff0c;选择“设为星标” 第一时间关注技术干货&#xff01; 免责声明~ 任何文章不要过度深思&#xff01; 万事万物都经不起审视&#xff0c;因为世上没有同样的成长环境&#xff0c;也没有同样的认知水平&#xff0c;更「没有适用于所有人的解决方案…

【perl】环境搭建

1、Vscode Strawberry Perl 此过程与tcl环境搭建很类似&#xff0c;请参考我的这篇文章&#xff1a; 【vscode】 与 【tclsh】 联合搭建tcl开发环境_tclsh软件-CSDN博客 perl语言的解释器可以选择&#xff0c;strawberry perl。Strawberry Perl for Windows - Releases。 …

一次性全部给你,这4款名不见经传的精品软件,用了就放不下

Geek Geek是个电脑卸载软件神器。 Geek 电脑空间不够了&#xff0c;想卸点应用来腾地方&#xff0c;但总是遇到各种问题&#xff0c;要么卸不干净&#xff0c;留下一些乱七八糟的文件&#xff0c;要么就是那些流氓软件&#xff0c;怎么卸都卸不掉&#xff0c;简直让人崩溃&am…

如何格式化U盘?4个正确方法,记得收藏好!

“我的u盘不知道是中病毒还是什么原因&#xff0c;现在没法使用了&#xff0c;我想将它进行格式化操作&#xff0c;想问问大家应该如何格式化u盘呢&#xff1f;请帮帮我&#xff01;” U盘作为我们日常生活中不可或缺的存储设备&#xff0c;常常用于传输和保存各种重要数据。然…

ES8.13 _bulk报错Malformed content, found extra data after parsing: START_OBJECT解决

在使用elaticsearch8.13.0使用批量创建索引时&#xff0c;根据谷粒中说的es7.9方法去批量操作请求&#xff1a; http://127.0.0.1:9200/shop/_doc/_bulk 注意1&#xff1a;设置header为Content-Type:application/x-ndjson,否则请求报错&#xff1a; {"error": &qu…

WWDC24 快速回顾

今天凌晨&#xff0c;苹果公司在2024年全球开发者大会&#xff08;WWDC24&#xff09;上&#xff0c;发布了一系列的系统更新。然而&#xff0c;对于期待苹果带来突破性创新的消费者来说&#xff0c;今年的大会似乎并没有达到预期的震撼效果。 下面让我看看&#xff0c;苹果都带…

html--万年历

<!DOCTYPE html> <html lang"zh_CN"><head><meta http-equiv"Content-Type" content"text/html; charsetUTF-8" /><meta charset"utf-8" /><title>万年历</title><link rel"styles…

第十篇——等价性:信息是如何压缩的?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 基于信息是如何进行压缩的&#xff0c;引出来等价信息的概念&#xff1b;…

英特尔MRT技术是什么?

在多个内存故障预测中&#xff0c;都有提到英特尔MRT技术&#xff0c;那么这个到底是什么&#xff0c;有什么作用。我们结合英特尔官网信息了解下&#xff1a; 英特尔MRT&#xff0c;全称Memory Resilience Technology&#xff0c;官网介绍它是一种内存 RAS 技术&#xff0c;用…

查找最佳分数Π

查找分子或分母不大于一亿的分数Π private static final int MAX_N 100000000;private static void findPIByDivider() {Log.d("findPI", "findPIByDivider start MAX_N" MAX_N);long curtime System.currentTimeMillis();double lastRet 1;int selec…

计算机网络9——无线网络和移动网络3 蜂窝移动通信网

文章目录 一、蜂窝无线通信技术的发展简介1、蜂窝移动通信系统问世2、2G 蜂窝移动通信系统3、数据通信被引入移动通信系统4、3G 蜂窝移动通信系统4、4G 蜂窝移动通信系统 一、蜂窝无线通信技术的发展简介 1、蜂窝移动通信系统问世 移动通信的种类很多&#xff0c;如蜂窝移动通…

MySQL密码自动过期配置

目录 一、密码自动过期 1、临时 2、永久 3、查看 4、账号设置 一、密码自动过期 登录数据库查看是否生效 mysql -u root -p #查看数据库账号状态 select user,host,password_expired,password_lifetime,password_last_changed,account_locked from mysql.user; 1、passwo…