当前位置: 首页 > news >正文

C++ 线性表、内存操作、 迭代器,数据与算法分离。

线性表:

         线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的

一种,一个线性表是n个具有相同特性的数据元素的有限序列。


          线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的(注意,这句话只适用大部分线性表,而不是全部。比如,循环链表逻辑层次上也是一种线性表(存储层次上属于链式存储,但是把最后一个数据元素的尾指针指向了首位结点)。

线性表_百度百科 (baidu.com)

C++中的数组,vector,string是线性表,大家对线性表操作非常熟悉,感觉非常方便,比如:

std::string s = "Hello World!";

在字符串 s 中的第二个字符是  * (s.c_str() + 1),  或者  *(s.begin() + 1), 是字符 e;

为什么还要设计迭代器,是因为要数据与算法分离,这是C++标准库的核心,如果

不理解这个,你会感觉标准库非常难用,明明很简单的事,为什么搞得那么复杂。

看下面的例子:

int main() {	std::string s = "Hello World!";std::list<char> slist1 = { 'H','e','l','l','o', ' ', 'W','o','r','l','d','!'};std::list<char> slist2(s.begin(), s.end());for (auto c : slist1) {std::cout << c;}std::cout << "\n";for (auto c : slist2) {std::cout << c;}std::cout << "\n";return 0;
}

输出结果都是:

因此,设计迭代器的核心目标数据与算法分离。

再看一个例,关于内存操作的例子,看下面的函数:

 针对线性表:

/// <summary>
/// 不改变原有数据,把内存段区间 [begin,pend) 向后移动nCount位,后面的
/// 数据pend后面会覆盖nCount-1个,包括pend就是nCount个,如果bFilling
/// 为True,则用相应的pFilling所指的数据填充空出来的内存。
/// 例:
///		_string s = "sss123   www";
///		MoveBack(s.begin(), s.begin() + 6, 3, true, s.end() - 3);
///     结果:s=wwwsss123www
/// 
/// 注意:pFilling 与 pbegin,pend,不能在同一区域的内存块中。
/// 
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="pbegin"></param>
/// <param name="pend"></param>
/// <param name="nCount"></param>
/// <param name="bFilling"></param>
/// <returns></returns>
/// 创建时间:2024-10-03    最后一次修改时间:2024-10-03 (已测试)
template<class T>
T* MoveBack(T* pbegin, T* pend, const size_t& nCount, const bool& bFilling = false,
const T* pFilling = null)
{assert(pend >= pbegin);for (size_t n = 0; n < pend - pbegin; ++n) {*(pend + nCount - 1 - n ) = *(pend - 1 - n);}if (bFilling && pFilling) { //检查bFilling不能在区间[pbegin,pend + nCount)中assert(pFilling < pbegin || pFilling >= pend + nCount);for (size_t n = 0; n < nCount; ++n) {*(pbegin + n) = *(pFilling + n);}}return pbegin;
}
int main() {	std::string s = "Hello World!";//线性表_Array<char> arr;arr.SetBuffer(20,true);	arr.Add(s.begin(), s.end());for (auto c : arr) {std::cout << c;}std::cout << "\n";//在线性表中"Hello World!########" => (后移7位)"####Hello World!####//前面####用"中国"填空std::cout << MoveBack(arr.Begin(), arr.End(), 7, true, "中国 : ") << "\n";}

运行结果:

下面我们来设计可以针对迭代器进行移动的MoveBack_new函数

  例子后面的???????,是为容器预留下的内存空间。

template<class IterClass, class ValueType = IterClass::value_type>
const IterClass MoveBackIter(const IterClass& itbegin, const IterClass& itend,const size_t& nCount,const bool& bFilling = false,const ValueType* pFilling = null){//assert(itend >= itbegin);  //可能很多迭代器不支持for (size_t n = 0; n < itend - itbegin; ++n) {*(itend + nCount - 1 - n) = *(itend - 1 - n);}if (bFilling && pFilling) { //检查bFilling不能在区间[pbegin,pend + nCount)中//可能很多迭代器不支持//assert(pFilling < itbegin || pFilling > itend + nCount);for (size_t n = 0; n < nCount; ++n) {*(itbegin + n) = *(pFilling + n);}}return itbegin;
}

执行程序:

int main() {	std::string s = "Hello World!???????";//线性表_Array<char> arr;arr.SetBuffer(30,true);	arr.Add(s.begin(), s.end());for (auto c : arr) {std::cout << c;}std::cout << "\n";//在线性表中"Hello World!########" => (后移7位)"####Hello World!####//前面####用"中国"填空MoveBack_new(arr.begin(), arr.end(), 7, true, "中国 : ");cout << "线性表移动后内容:";for (auto c : arr) { std::cout << c; }std::cout << "\n";//链表_list<char> li;li.Add(s.begin(), s.end());for (auto c : li) { std::cout << c; }std::cout << "\n";MoveBack_new(li.begin(), li.begin() + 12, 7, true, "中国 : ");cout << "链表移动后内容::";for (auto c : li){	std::cout << c;	}
}

执行结果:

结论:

         迭代器设计的目的就是把算法和数据剥离出来,比如上面的MoveBack_new,

即可以对线性表操作,又可以对链表操作,缺点是,在这后面,你要做太多的工作

和优化,但是这对你熟悉和使用,甚至设计标准库,非常有用。


    

相关文章:

C++ 线性表、内存操作、 迭代器,数据与算法分离。

线性表&#xff1a; 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的 一种&#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系&#xff0c;即除了第一个和…...

PHP如何解析配置文件

在PHP中解析配置文件有多种方法&#xff0c;具体取决于配置文件的格式。常见的配置文件格式包括INI文件、YAML文件、JSON文件以及PHP数组文件&#xff08;即PHP文件本身包含配置数组&#xff09;。下面是一些常用的方法来解析这些配置文件。 1. 解析INI文件 INI文件是最常见的…...

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …...

Java IO流全面教程

此笔记来自于B站黑马程序员 File 创建对象 public class FileTest1 {public static void main(String[] args) {// 1.创建一个 File 对象&#xff0c;指代某个具体的文件// 路径分隔符// File f1 new File("D:/resource/ab.txt");// File f1 new FIle("D:\\…...

PCIe6.0 AIC金手指和板端CEM连接器信号完整性设计规范

先附上我之前写的关于PCIe5.0金手指的设计解读&#xff1a; PCIe5.0的Add-in-Card(AIC)金手指layout建议&#xff08;一&#xff09;_pcie cem-CSDN博客 PCIe5.0的Add-in-Card(AIC)金手指layout建议&#xff08;二&#xff09;_gnd bar-CSDN博客 首先&#xff0c;相较于PCI…...

二、创建drf纯净项目

1)创建项目 django-admin startproject api2&#xff09;创建app django-admin startproject api_app3)修改settings.py注释掉一些没用的配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,# d…...

算法1:双指针思想的运用(2)--C++

1.盛水最多的容器 题目链接&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 在解析题目时&#xff0c;我们可以把最直接的方法先列举出来&#xff0c;然后再根据相应的算法原理&#xff0c;来进行优化 思路一&#xff1a;暴力…...

L1415 【哈工大_操作系统】CPU调度策略一个实际的schedule函数

L2.7 CPU调度策略 1、调度的策略 周转时间&#xff1a;任务进入到任务结束&#xff08;后台任务更关注&#xff09;响应时间&#xff1a;操作发生到响应时&#xff08;前台任务更关注&#xff09;吞吐量&#xff1a;CPU完成的任务量 响应时间小 -> 切换次数多 -> 系统…...

免费版U盘数据恢复软件大揭秘,拯救你的重要数据

我们的生活和工作越来越离不开各种存储设备&#xff0c;其中优盘因其小巧便携、方便使用的特点&#xff0c;成为了我们存储和传输数据的重要工具之一。为了防止你像我一样会遇到数据丢失抓狂的情况&#xff0c;我分享几款u盘数据恢复软件免费版工具来即时补救。 1.福昕U盘数据…...

Pikachu-Unsafe FileUpload-客户端check

上传图片&#xff0c;点击查看页面的源码&#xff0c; 可以看到页面的文件名校验是放在前端的&#xff1b;而且也没有发起网络请求&#xff1b; 所以&#xff0c;可以通过直接修改前端代码&#xff0c;删除 checkFileExt(this.value) 这部分&#xff1b; 又或者先把文件名改成…...

【数据结构】什么是红黑树(Red Black Tree)?

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;红黑树的概念 &#x1f4cc;红黑树的操作 &#x1f38f;红黑树的插入操作 &#x1f38f;红黑树的删除操作 结语 &#x1f4cc;红黑树的概念 我们之前学过了…...

Xcode16适配

1.问题&#xff0c;第三方库报错信息如下&#xff1a; Declaration of sa_family_t must be imported from module Darwin.POSIX.sys.types._sa_family_t before it is required2.解答&#xff0c;在报错文件中导入以下头文件 #import <sys/_types/_sa_family_t.h>如有…...

Vue - 路由用法

前端路由就是URL中的hash与组件之间的对应关系。Vue Router是Vue的官方路由。 组成&#xff1a; VueRouter&#xff1a;路由器类&#xff0c;根据路由请求在路由视图中动态渲染选中的组件。<router-link>&#xff1a;请求链接组件&#xff0c;浏览器会解析成<a>。…...

SpringBoot框架下校园资料库的构建与优化

1系统概述 1.1 研究背景 如今互联网高速发展&#xff0c;网络遍布全球&#xff0c;通过互联网发布的消息能快而方便的传播到世界每个角落&#xff0c;并且互联网上能传播的信息也很广&#xff0c;比如文字、图片、声音、视频等。从而&#xff0c;这种种好处使得互联网成了信息传…...

vscode 连接云服务器(ubantu 20.04)

更改服务器系统 如果云服务器上的系统不是ubantu20.04的&#xff0c;可以进行更改&#xff1a; 登录云服务官网&#xff08;这里以阿里云为例&#xff09;点击控制台 点击服务器实例 点击更多操作、重置系统 点击重置为其他镜像、系统镜像&#xff1a;选择你要使用的系统镜像…...

【SpringBoot详细教程】-09-Redis详细教程以及SpringBoot整合Redis【持续更新】

🌲 Redis 简介 🌾 什么是Redis Redis 是C语言开发的一个开源高性能键值对的内存数据库,可以用来做数据库、缓存、消息中间件等场景,是一种NoSQL(not-only sql,非关系型数据库)的数据库 Redis是互联网技术领域使用最为广泛的存储中间件,它是「Remote DictionaryServic…...

排序算法之——归并排序,计数排序

文章目录 前言一、归并排序1. 归并排序的思想2. 归并排序时间复杂度及空间复杂度3. 归并排序代码实现1&#xff09;递归版本2&#xff09;非递归版本 二、计数排序1. 计数排序的思想2. 计数排序的时间复杂度及空间复杂度3. 计数排序代码实现 总结&#xff08;排序算法稳定性&am…...

Linux中环境变量

基本概念 环境变量Environmental variables一般是指在操作系统中用来指定操作系统运行环境一些参数。 我们在编写C、C代码时候&#xff0c;在链接的时候从来不知道我们所链接的动态、静态库在哪里。但是还是照样可以链接成功。生成可执行程序。原因就是相关环境变量帮助编译器…...

163页PPT罗兰贝格品牌战略升级:华为案例启示与电器集团转型之路

罗兰贝格作为一家全球顶级的战略管理咨询公司&#xff0c;其品牌战略升级理念在多个行业中得到了广泛应用。以下将以华为案例为启示&#xff0c;探讨电器集团的转型之路&#xff0c;并融入罗兰贝格品牌战略升级的思想。 一、华为案例的启示 华为与罗兰贝格联合撰写的《数据存…...

系统设计,如何设计一个秒杀功能

需要解决的问题 瞬时流量的承接防止超卖预防黑产避免对正常服务的影响兜底方法 前端设计 利用 CDN 缓存静态资源&#xff0c;减轻服务器的压力在前端随机限流按钮防抖&#xff0c;防止用户重复点击 后端设计 Nginx 做统一接入&#xff0c;进行负载均衡与限流用 sentinel 等…...

第20章:Skill ≠ Prompt——从提示词到可复用技能的范式升级

第20章:Skill ≠ Prompt——从提示词到可复用技能的范式升级 20.1 问题定义:为什么"保存Prompt"不够 很多团队的做法是:把常用的Prompt保存在文档或笔记中,需要时复制粘贴。这看起来合理,但存在三个根本问题: 不可版本化:Prompt是散落的文本片段,没有版本号…...

Seraphine终极指南:英雄联盟LCU API实战开发与智能BP系统深度解析

Seraphine终极指南&#xff1a;英雄联盟LCU API实战开发与智能BP系统深度解析 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 在英雄联盟竞技环境中&#xff0c;数据驱动的决策能力往往决定了胜负的走向。Ser…...

3步快速上手AnotherRedisDesktopManager:Redis桌面管理终极指南

3步快速上手AnotherRedisDesktopManager&#xff1a;Redis桌面管理终极指南 【免费下载链接】AnotherRedisDesktopManager &#x1f680;&#x1f680;&#x1f680;A faster, better and more stable Redis desktop manager [GUI client], compatible with Linux, Windows, Ma…...

终极Windows虚拟手柄驱动配置指南:5步快速上手ViGEmBus

终极Windows虚拟手柄驱动配置指南&#xff1a;5步快速上手ViGEmBus 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 想在Windows系统中轻松实现游戏控制器模拟…...

Defender Control:Windows Defender 终极控制指南 - 如何永久禁用Windows安全防护

Defender Control&#xff1a;Windows Defender 终极控制指南 - 如何永久禁用Windows安全防护 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/…...

ESP32-S2物联网实战:IPv6配置与Adafruit IO双向通信

1. 项目概述与核心价值如果你手头有一块ESP32-S2开发板&#xff0c;并且已经厌倦了仅仅让它连上Wi-Fi、点个灯&#xff0c;想让它真正“活”起来&#xff0c;成为一个能融入现代互联网、能与云端自由对话的智能节点&#xff0c;那么这篇文章就是为你准备的。我们将深入两个在物…...

第08章 FastAPI 与 SSE 流式 RAG 后端

第08章 FastAPI 与 SSE 流式 RAG 后端 到目前为止&#xff0c;知识库、检索工具、MCP 客户端都已经就绪&#xff0c;但仍缺少一个面向最终用户的入口。本章用 FastAPI 把整条 RAG 链路串起来&#xff1a;接收前端发来的自然语言问题&#xff0c;调用 MCP 工具检索相关工单&…...

Codesys ST语言PID调参避坑指南:从仿真到实战,手把手教你搞定温控/电机项目

Codesys ST语言PID调参避坑指南&#xff1a;从仿真到实战的工程化解决方案 在工业自动化领域&#xff0c;PID控制算法占据着核心地位。无论是恒温控制、电机调速还是压力调节&#xff0c;一个精心调校的PID控制器往往能决定整个系统的性能表现。然而&#xff0c;许多工程师在掌…...

3步解锁鸣潮120帧:你的终极游戏体验优化指南

3步解锁鸣潮120帧&#xff1a;你的终极游戏体验优化指南 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为《鸣潮》游戏中的60帧限制而烦恼吗&#xff1f;明明拥有强大的硬件配置&#xff0c;却无法充…...

Halcon深度学习工具(DLT)安装与中文环境配置实战

1. Halcon DLT安装前的准备工作 第一次接触Halcon深度学习工具(DLT)时&#xff0c;我完全被各种专业术语搞晕了。后来才发现&#xff0c;只要做好前期准备&#xff0c;安装过程其实比想象中简单得多。首先需要确认的是你的Windows系统版本&#xff0c;DLT目前支持Windows 10和1…...