STL中的迭代器模式:将算法与数据结构分离

目录

1.概述

2.容器类

2.1.序列容器

2.2.关联容器

2.3.容器适配器

2.4.数组

3.迭代器

4.重用标准迭代器

5.总结


1.概述

     在之前,我们讲了迭代器设计模式,分析了它的结构、角色以及优缺点:

设计模式之迭代器模式-CSDN博客

        在 STL 中,算法通常作为函数模板来实现,而数据结构(容器)则是模板类。这种分离使得算法可以独立于特定的数据结构来编写和使用,只要数据结构满足算法所需的接口(例如迭代器接口)。

        STL的中心思想是将算法与数据结构分离,彼此独立设计,最后在用iterator将他们结合在一起,获得最大的适配性。通过“迭代器”接口,已经实现了将算法与数据结构分离的目的。

2.容器类

        容器类是STL非常重要的一部分,它们提供了用于存储、检索和操作数据对象(如整数、浮点数、字符串等)的模板类。以下是STL中一些主要的容器类:

2.1.序列容器

        这些容器中的元素可以看作是线性排列的。

        std::vector: 动态数组,可以动态地增加和减少元素。

        std::deque: 双端队列,支持在序列的开头和结尾处快速插入和删除元素。

        std::list: 双向链表,允许在任何位置进行快速插入和删除操作。

        std::forward_list: 单向链表,仅支持向前迭代,并且在序列的开头进行快速插入和删除操作。

        std::array: 固定大小的数组,不是动态的,但提供了更好的性能。

        std::string: 特殊的动态字符数组,用于存储字符串。

        std::stack: 后入先出(LIFO)的容器适配器,通常基于std::deque或std::vector实现。

        std::queue: 先入先出(FIFO)的容器适配器,通常基于std::deque或std::list实现。

        std::initializer_list: 初始化其它容器的容器,只是std::initializer_list不存储数据,详见:

C++之std::initializer_list详解_c++ std initializer-CSDN博客

2.2.关联容器

        这些容器中的元素是按键(key)存储的,并且按键进行排序。

        std::set: 集合,包含唯一的元素,按键排序。

        std::multiset: 允许包含重复元素的集合。

        std::map: 关联数组,其中每个元素都是一对键/值对,按键排序。

        std::multimap: 允许键重复的关联数组。

        std::unordered_set: 无序集合,包含唯一的元素,但不按键排序。

        std::unordered_multiset: 允许包含重复元素的无序集合。

        std::unordered_map: 无序关联数组,其中每个元素都是一对键/值对,但不按键排序。

        std::unordered_multimap: 允许键重复的无序关联数组。

2.3.容器适配器

        这些类不是容器本身,但它们为其他容器类提供了不同的接口。

        std::stack: 后入先出(LIFO)的容器适配器。

        std::queue: 先入先出(FIFO)的容器适配器。

        std::priority_queue: 优先级队列,其中元素按优先级排序(通常基于堆实现)。

2.4.数组

       对于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且初始化为0std::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命名空间。

3.迭代器

1) 上述序列容器关联容器都提供了标准的迭代器操作:

        正向迭代器:begin()和end()

        反向迭代器:rbegin()和rend()

        常量正向迭代器:cbegin()和cend()(或者const容器上的begin()和end())

        常量反向迭代器:crbegin()和crend()(或者const容器上的rbegin()和rend())

2) 容器迭代器是不提供这些操作的。

3) 数组可以用std::begin()和std::end()来获取正向迭代器、反向迭代器、常量正向迭代器和常量反向迭代器。

4.重用标准迭代器

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

// 接口
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();
}

那么算法就可以这样调用,以排序为例:

FlowCollection  data;std::sort(data.begin(), data.end());

5.总结

        STL 中的算法是一组函数模板,它们接受迭代器作为参数,并对迭代器范围内的元素执行操作。这些算法包括排序、搜索、复制、删除等操作。由于算法是独立于数据结构的,因此它们可以与任何支持迭代器接口的容器一起使用。

        通过将算法与容器分离,STL 允许程序员根据需要组合不同的算法和容器。例如,你可以使用排序算法对向量进行排序,或者使用搜索算法在集合中查找元素。这种灵活性使得 STL 能够适应各种不同的应用场景。

        总的来说,STL 的设计方式通过将算法与数据结构分离,实现了代码的可重用性、可维护性和灵活性。这使得 STL 成为 C++ 程序员在处理数据结构和算法时的重要工具。

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

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

相关文章

Open AI限制来袭?用上这个工具轻松破局!

【导语】近日&#xff0c;AI领域掀起了一场不小的波澜。Open AI宣布&#xff0c;从7月9日起&#xff0c;将对部分地区的开发者实施API调用限制。这一消息对于许多依赖Open AI技术的国内初创团队来说&#xff0c;无疑是一个沉重的打击。 对于这些团队而言&#xff0c;Open AI的A…

FITC-胰岛素的荧光特性与稳定性-星戈瑞

在生物医学研究领域&#xff0c;荧光标记技术是一种实验手段&#xff0c;能够实现对生物分子的可视化追踪和定量分析。其中&#xff0c;FITC-胰岛素作为一种结合了荧光素异硫氰酸酯&#xff08;FITC&#xff09;与胰岛素的荧光标记物&#xff0c;在糖尿病研究、药物开发以及细胞…

关于摄像头模组中滤光片的介绍

1、问题背景 红外截止滤光片&#xff08;IR CUT Filter&#xff09;是应用在摄像头模组中非常重要的一个器件&#xff0c;因人眼与 coms sensor 对光线各波长的响应不同&#xff0c; 人眼看不到红外光&#xff0c;但 sensor 能感应到&#xff08;如下图是某sensor在各波长下的…

使用 SwiftUI 为 macOS 创建类似于 App Store Connect 的选择器

文章目录 前言创建选择器组件使用选择器组件总结前言 最近,我一直在为我的应用开发一个全新的界面,它可以让你查看 TestFlight 上所有可用的构建,并允许你将它们添加到测试群组中。 作为这项工作的一部分,我需要创建一个组件,允许用户从特定构建中添加和删除测试群组。我…

IOS Swift 从入门到精通:从 JSON 文件加载数据

文章目录 常见问题解答数据模型JSON 数据验证 JSON解码 JSON编写 FAQRow 代码添加状态栏背景模糊将内容添加到 FAQView常见问题解答数据模型 此 FAQ 模型符合Decodable,因为我们需要将 JSON 数据解码为 SwiftUI 数据。它还将符合 Identifiable ,因此我们稍后可以在 ForEach …

Flutter学习目录

学习Dart语言 官网&#xff1a;https://dart.cn/ 快速入门&#xff1a;Dart 语言开发文档&#xff08;dart.cn/guides&#xff09; 学习Flutter Flutter生命周期 点击跳转Flutter更换主题 点击跳转StatelessWidget和StatefulWidget的区别 点击跳转学习Flutter中新的Navigato…

transformers evaluate

☆ Evaluate https://huggingface.co/docs/evaluate/main/en/installation ★ 解决方案 常用代码 # 查看支持的评估函数 evaluate.list_evaluation_modules(include_communityTrue)# 加载评估函数 accuracy evaluate.load("accuracy")# load function descripti…

uORF调控翻译-植物综述

这篇文献《uORFs: Important Cis-Regulatory Elements in Plants》详细介绍了上游开放阅读框&#xff08;uORF&#xff09;在植物中的重要调控作用。以下是文献的详细总结&#xff1a; 核心内容总结 1. 引言 基因表达的调控涉及多个层面&#xff0c;包括mRNA的转录、翻译和翻…

Linux操作系统通过实战理解CPU上下文切换

前言&#xff1a;Linux是一个多任务的操作系统&#xff0c;可以支持远大于CPU数量的任务同时运行&#xff0c;但是我们都知道这其实是一个错觉&#xff0c;真正是系统在很短的时间内将CPU轮流分配给各个进程&#xff0c;给用户造成多任务同时运行的错觉。所以这就是有一个问题&…

个人网站搭建-步骤(持续更新)

域名申请 域名备案 域名解析 服务器购买 端口转发 Nginx要在Linux上配置Nginx进行接口转发&#xff0c;您可以按照以下步骤进行操作&#xff1a; 安装Nginx&#xff08;如果尚未安装&#xff09;&#xff1a; 使用包管理工具&#xff08;如apt, yum, dnf, 或zypper&#x…

高考志愿不知道怎么填?教你1招,用这款AI工具,立省4位数

高中的岁月&#xff0c;就像一本厚厚的书&#xff0c;我们一页页翻过&#xff0c;现在&#xff0c;终于翻到了最后一页。但这不是结束&#xff0c;这是新的开始&#xff0c;是人生的新篇章。 高考落幕&#xff0c;学子们在短暂的放松后&#xff0c;又迎来了紧张的志愿填报。 “…

【面试系列】最全的IT行业岗位要求及必备技能

欢迎来到我的博客,很高兴能够在这里和您见面!欢迎订阅相关专栏: ⭐️ 全网最全IT互联网公司面试宝典:收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来:详细讲解AIGC的概念、核心技术、应用领域等内容。 ⭐️ 全流程数据技术实战指南:全面…

C++版本号处理3 - 版本号比较

1. 关键词2. verutil.h3. verutil.cpp4. 测试代码5. 运行结果6. 源码地址 1. 关键词 关键词&#xff1a; C 版本号处理 版本号比较 跨平台 实现原理&#xff1a; 通过字符串分割&#xff0c;对每一段的版本号进行逐一比较。 应用场景&#xff1a; 要基于版本号做一些逻辑…

Android 自定义实现灯带跑马灯效果

public class MyMarqueeView extends View {private Paint paint;private RectF rect;private float startX, startY, endX, endY;private float currentX,currentY;/*** 灯大小*/private int radius 15;/*** 多少毫秒绘制一个圆点* 最小80*/private int time 100;/*** 绘制的…

使用bootstrap框架做一个Aotm Blog个人博客

使用bootstrap框架做一个Aotm Blog个人博客&#xff0c;展示一些自己的个人信息&#xff0c;有四个博客分类&#xff1a;心情记录、学习笔记、旅行相册、美食打卡。 主界面图&#xff1a; 心情记录界面 学习笔记界面&#xff1a; 旅行相册界面&#xff1a; 美食打卡界面&#…

深入探索:大型语言模型消除幻觉的解决之道

随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;已经成为自然语言处理领域的明星。它们以其庞大的知识库和生成连贯、上下文相关文本的能力&#xff0c;极大地推动了研究、工业和社会的进步。然而&#xff0c;这些模型在生成文本时可能会产生…

Unity保存玩家的数据到文件中(Unity的二进制序列化)

文章目录 文章运行环境什么是二进制序列化读写文件构造函数 自定义二进制序列化 文章运行环境 Unity2022 什么是二进制序列化 Unity中的二进制序列化是一种将游戏对象或数据结构转换为二进制格式的过程&#xff0c;以便于存储或网络传输。这使数据能够以高效的方式保存&…

liburing和Linux io_uring源码阅读

liburing 版本 系统内核版本: Linux 5.15.0-107-generic #117~20.04.1-Ubuntu x86_64 GNU/Linux 源代码版本: gitgithub.com:torvalds/linux.git v5.15 阅读入口 从最简单的代码看起&#xff0c;即阅读入口&#xff1a;examples/io_uring-test.c 此源文件内部调用liburing相关…

富唯智能推出的AMR复合机器人铝板CNC上下料方案

随着科技的不断进步&#xff0c;CNC加工行业正面临着前所未有的变革。传统的CNC上下料方式已无法满足现代生产对效率、精度和安全性的高要求。在这样的背景下&#xff0c;富唯智能推出的AMR复合机器人铝板CNC上下料方案&#xff0c;以其智能化、自动化的特点&#xff0c;引领了…

Mind+在线图形编程软件(Sractch类软件)

Scratch作为图形编程软件&#xff0c;可以为小朋友学习编程提供很好的入门&#xff0c;是初次接触编程的小朋友的首选开发软件。这里介绍的Mind软件与Sractch用法几乎完全一致&#xff0c;并且可以提供在线免安装版本使用&#xff0c;浏览器直接打开网址&#xff1a; ide.mindp…