
C++编程
Ray_1997
"人生处处是考场"
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++_HELLO算法_哈希表的简单实现
本文介绍了哈希表的简单实现方法。通过数组存储键值对(桶),使用哈希函数(key%capacity)定位桶位置,实现查询、插入、删除等基本操作。示例代码展示了基于数组的哈希表实现,包括处理哈希冲突的简单覆盖策略。同时指出哈希冲突的本质原因:输入空间远大于输出空间导致多个key可能映射到同一索引位置,如学号12836和20336都会定位到索引36的情况。最后强调需要解决哈希冲突问题来保证数据的正确存储和查询。原创 2025-07-31 23:29:30 · 314 阅读 · 0 评论 -
TypeScript代码语法快速入门
TypeScript核心知识点摘要(150字): 本文总结了TypeScript的核心语法特性。基础类型部分包含类型断言、元组和枚举的使用;函数部分详解了参数处理与重载机制;面向对象编程涵盖接口、类修饰符、存取器和抽象类;高级类型包括类型别名和泛型应用;接口扩展支持继承与多实现。其他重点包含可选链、构造函数简写等语法糖。整体突出了TypeScript强大的类型系统(基础/联合/断言类型)、完整的OOP支持(类/继承/抽象类)以及泛型编程优势,通过接口与类型别名实现灵活的类型定义。建议结合具体场景实践这些特性原创 2025-07-27 20:58:33 · 144 阅读 · 0 评论 -
C++中vector的iterator迭代器的理解
C++中std::vector的迭代器是类似指针的工具,用于遍历元素。begin()指向首元素,end()指向尾后位置(非末元素),可通过算术运算调整位置。迭代器支持解引用、自增等操作,但在vector扩容或删除元素时会失效。使用反向迭代器(rbegin()/rend())可逆向遍历。关键点包括:区分有效/无效位置、注意迭代器失效问题、掌握基本操作如访问元素和位置比较。正确理解迭代器位置是高效使用vector的基础,尤其在动态修改容器时需要谨慎处理。原创 2025-07-20 17:19:22 · 570 阅读 · 0 评论 -
C++中 _vector的容量capacity和 大小size对比
摘要:C++中std::vector的size表示当前元素数量,capacity表示预分配的内存容量。当size超过capacity时会触发自动扩容(通常倍增)。通过reserve()可以预分配内存减少扩容开销,shrink_to_fit()可请求释放多余内存。理解二者的区别有助于优化内存使用,典型场景是预先reserve()已知大小的空间来避免频繁扩容。size()<=capacity()始终成立,合理管理二者关系能提升vector性能。原创 2025-07-20 11:20:49 · 359 阅读 · 0 评论 -
C++提升编程_STL常见容器_string
本文介绍了C++ STL中string容器的基本概念和常用操作。string是C++风格的字符串类,内部封装了char*并管理内存分配。主要内容包括:1) string的构造函数和赋值操作;2) 字符串拼接方法;3) 查找替换功能;4) 字符串比较;5) 字符存取;6) 插入删除;7) 获取子串。通过多个测试函数展示了string的各种成员方法,如find()、replace()、substr()等的使用,帮助开发者高效处理字符串操作。原创 2025-07-19 17:26:06 · 104 阅读 · 0 评论 -
C++_提升编程_Vector存放自定义数据类型
本文演示了C++中使用vector存储自定义Person类对象的两种方法。第一种方法(test01)直接存储对象,通过迭代器或for_each+lambda表达式遍历输出对象属性;第二种方法(test02)存储对象指针,使用指针操作和lambda表达式访问对象数据。两种方式都实现了对Person对象(姓名、年龄)的存储和遍历输出,展示了STL容器与自定义类型的结合使用。原创 2025-07-19 17:24:26 · 94 阅读 · 0 评论 -
C++提升编程_Vector容器嵌套容器
本文演示了C++中二维容器的嵌套使用。通过vector<vector<int>>创建了一个4x4的二维数组,填充了1-7的数字序列。文章展示了两种遍历方式:传统迭代器和C++11的auto自动类型推导结合范围for循环。后者使代码更简洁明了。程序最终输出这个二维数组的所有元素,每行数据单独显示,体现了容器嵌套和现代C++遍历技术的应用。原创 2025-07-19 17:23:31 · 98 阅读 · 0 评论 -
C++_编程提升_STL容器
【代码】C++_编程提升_STL容器。原创 2025-07-19 17:22:09 · 338 阅读 · 0 评论 -
C++_编程提升_temaplate模板_案例
摘要:本文实现了一个通用的数组类模板MyArray,支持内置和自定义数据类型存储。主要功能包括:堆区数据存储、容量参数化构造、深拷贝功能(拷贝构造和operator=重载)、尾插尾删操作、下标访问以及获取元素数量和容量。测试案例展示了内置int类型和自定义Person类的使用,验证了数组操作的正确性。该模板类解决了浅拷贝问题,提供了基本数组操作接口,适用于多种数据类型存储需求。原创 2025-07-14 22:39:34 · 246 阅读 · 0 评论 -
C++_template类模板与函数模板的区别
特性类模板函数模板实例化方式显式指定类型(C++17前)支持隐式类型推导默认模板参数支持C++11起支持特化支持全特化、偏特化仅支持全特化成员函数定义需模板前缀无需额外前缀静态成员每个实例化独立无静态成员(函数内static独立)典型应用数据结构(容器、智能指针)通用算法(比较、交换)通过理解这些区别,开发者能更高效地选择合适工具,构建灵活且类型安全的泛型代码。原创 2025-07-14 09:03:50 · 716 阅读 · 0 评论 -
C++_提升编程_1.3.8 类模板与友元
本文介绍了模板类配合友元函数的两种实现方式:类内实现和类外实现。类内实现直接在类中声明友元函数即可;类外实现则需要先声明函数模板,让编译器提前知晓,再通过空模板参数列表<>在类中声明为友元。两种方式都能让全局函数访问模板类的私有成员,区别在于实现位置和编译顺序的处理。代码示例分别展示了Person模板类的两种友元实现方式,并演示了如何调用这些友元函数来输出对象信息。原创 2025-07-13 17:28:45 · 164 阅读 · 0 评论 -
C++_提升编程_1.3.7 类模板分文件编写
类模板成员函数分文件编写时,由于函数创建时机在调用阶段会导致链接问题。解决方法有两种:1)直接包含源文件;2)将声明和实现合并为.hpp文件(如person.hpp)。示例中展示了第二种方法,将模板类定义和成员函数实现都放在.hpp文件中,确保在使用时能正确实例化。这种方法避免了链接错误,是类模板分文件编写的推荐方式。原创 2025-07-13 16:22:50 · 174 阅读 · 0 评论 -
C++_提高编程_ 类模板成员函数类外实现
摘要:本文介绍了类模板成员函数的类外实现方法。通过Person类模板示例,展示了如何在类外实现构造函数和成员函数,包括模板参数的声明和定义格式。代码演示了模板类对象(Person<string,int>)的创建和使用,输出姓名和年龄信息。该示例有助于理解类模板成员函数的分离式实现方式。原创 2025-07-13 15:40:48 · 319 阅读 · 0 评论 -
链表和数组和列表的区别
C++中数组、链表和列表的主要区别:数组(std::array)是固定大小的连续内存结构,支持快速随机访问但扩容困难;链表(LinkedList)使用指针连接的非连续内存结构,插入删除高效但访问较慢;列表分为std::vector(动态数组,随机访问快)和std::list(双向链表,任意位置操作高效)。选择依据:频繁访问用vector,频繁插入删除用list,固定需求用array。表格对比了它们的内存布局、访问方式和操作效率等核心特性。原创 2025-07-09 21:41:23 · 303 阅读 · 0 评论 -
Hello_算法_快速排序(分治策略)
快速排序是一种高效的分治排序算法,通过"哨兵划分"将数组分为小于和大于基准数的两部分。其核心步骤包括:选取基准数,使用双指针从两端扫描交换元素,直至指针相遇完成划分。算法整体流程是对原数组进行划分后,递归处理左右子数组,直到子数组长度为1时终止。示例代码展示了哨兵划分的实现和快速排序的递归调用过程,其中基准数选取最左元素,通过交换操作完成排序。该算法平均时间复杂度为O(nlogn),是常用的高效排序方法之一。原创 2025-07-09 15:52:40 · 216 阅读 · 0 评论 -
Hello_算法_列表
摘要:本文介绍了列表(list)这一抽象数据结构的概念和实现方式。列表作为有序集合支持增删查改等操作,可通过链表或数组实现,其中动态数组解决了普通数组长度固定的问题。文中以C++为例,展示了如何实现一个简易列表类(MyList),包括初始容量设置、扩容机制等关键设计,并对比了标准库中的vector容器。代码示例涵盖了列表的基本操作如添加、插入、删除元素等,以及动态扩容的实现原理。该实现有助于理解列表底层工作机制。原创 2025-07-08 23:01:43 · 192 阅读 · 0 评论 -
Hello_算法_链表
链表是一种通过节点对象和引用/指针连接的线性数据结构,其节点可以分散存储在内存各处,无需连续空间。每个节点包含值和指向下一节点的引用,具有头节点和尾节点。相比数组,链表在插入/删除操作上更高效,但访问元素需要线性遍历。常见链表类型包括单向链表、双向链表(含前驱和后继指针)和环形链表(首尾相连)。链表广泛应用于栈、队列、哈希表、图等数据结构,以及操作系统调度、浏览器历史管理等场景。代码示例展示了链表的初始化、节点插入/删除、访问和查找等基本操作。原创 2025-07-06 10:58:18 · 736 阅读 · 0 评论 -
Hello_算法_数组的常用操作
本文介绍了数组的基本概念和常用操作。数组是一种线性数据结构,元素存储在连续内存中,通过索引访问。主要操作包括初始化、随机访问、插入删除元素、遍历查找、扩容数组等。由于数组长度固定,插入删除操作效率较低。数组优势在于随机访问快,常用于排序搜索、查找表、机器学习等领域,也是实现其他数据结构的基础。文章还展示了各类操作的代码实现,并指出数组在内存中的存储特性使其具有特定的性能特点和应用场景。原创 2025-07-05 10:23:06 · 709 阅读 · 0 评论 -
C++_提高编程 模板Template
本文介绍了C++泛型编程中的函数模板技术。函数模板通过建立通用函数,将数据类型参数化,提高代码复用性。主要内容包括:1) 函数模板的基本语法和使用方法(自动类型推导和显式指定类型);2) 使用注意事项:类型推导必须一致,模板必须确定数据类型才能使用;3) 通过交换函数示例演示了模板的实际应用。函数模板是STL的重要基础,通过template关键字实现类型通用化,使代码更加灵活高效。原创 2025-07-04 15:40:38 · 238 阅读 · 0 评论 -
C++核心编程_职工管理系统(PART08清空文件及职工数据)
摘要:本文分析了职工管理系统数据清空功能的实现问题。原代码仅将指针数组元素设为NULL而未释放内存,存在内存泄漏风险。正确做法应先使用delete释放堆内存,再置为nullptr避免悬空指针。关键区别在于:delete释放内存但需后续处理,而单纯置NULL仅断开引用不释放内存。改进方案应结合两者,先释放内存再置空指针,确保内存安全。该案例凸显了指针操作中内存管理的重要性。原创 2025-07-03 09:57:52 · 236 阅读 · 0 评论 -
C++_核心编程_职工管理系统Part05(修改职工信息)
摘要:本文实现了一个职工信息修改功能,通过职工编号定位需要修改的记录。系统首先验证数据文件是否为空,然后根据输入的职工编号查找对应记录。找到后显示原信息,并允许修改职工ID、姓名和岗位类型(普通职工/经理/老板)。修改后的信息会替换原记录并保存到文件中。若查找失败会提示"查无此人"。该功能采用面向对象设计,使用派生类处理不同岗位类型,确保数据修改后能及时持久化保存。原创 2025-07-02 16:15:25 · 128 阅读 · 0 评论 -
C++_核心编程_职工管理系统Part05(删除职工信息)
摘要:该功能实现通过职工ID删除职工信息并保存至文件。主要步骤:1)检查职工是否存在(IsExist函数);2)若存在则使用数组前移方式删除数据(m_EmpArray[i]=m_EmpArray[i+1]);3)更新职工总数(m_EmpNum--)并保存文件(save函数)。删除前会验证文件是否为空,删除后提示操作结果。关键点包括ID查找、数组元素移动和数据持久化保存。原创 2025-07-02 15:54:02 · 224 阅读 · 0 评论 -
算法详解_选择排序(C++实现)及与冒泡排序的比较
本文详细介绍了选择排序和冒泡排序两种基础排序算法。选择排序通过反复查找未排序部分的最小元素并交换位置实现排序,时间复杂度为O(n²),但交换次数固定为O(n),效率较高。冒泡排序通过相邻元素比较交换使较大元素"冒泡"至末尾,时间复杂度同样为O(n²),但交换次数可能高达O(n²),稳定性更好。文章对比了两者在时间复杂度、交换次数、稳定性等方面的差异,指出选择排序更适合小规模数据且不要求稳定性的场景,而冒泡排序则适合需要稳定性的情况。最后通过C++代码示例展示了两种算法的具体实现,并提供了原创 2025-07-02 15:47:02 · 913 阅读 · 0 评论 -
hello算法_C++_ 最差、最佳、平均时间复杂度
摘要:文章探讨了在随机打乱的数组中查找特定元素的时间效率问题。通过生成1到n的随机数组并在其中查找数字1的索引,说明算法性能与输入数据分布相关。提供的C++代码展示了数组生成、随机打乱和线性查找的实现过程,验证了在最坏情况下时间复杂度为O(n)的结论。该实验表明,对于随机分布的输入数据,查找效率取决于目标元素的位置分布。原创 2025-07-01 21:56:08 · 746 阅读 · 0 评论 -
C++_核心编程_职工管理系统Part03(文件交互写文件保存职工数据)
摘要:本文描述了一个职工管理系统的文件读写功能实现方案。首先通过添加文件操作接口实现职工数据保存功能,包括指定文件路径、声明保存接口和实现保存操作。其次针对程序初始化时的三种不同情况(文件未创建、文件存在但为空、文件存在且有数据)分别进行处理:使用标志位判断文件状态,通过字符读取检测文件是否为空,并在添加职工时更新标志位。对于有数据的情况,详细说明了如何读取职工信息并初始化数组,包括获取职工人数、按部门类型创建不同职工对象并存入数组的操作流程。原创 2025-06-25 16:34:49 · 463 阅读 · 0 评论 -
C++ 指针 vs 数组
指针与数组既有联系又有区别:指针可以通过算术运算访问数组元素,数组名本质上是一个不可修改的指针常量。示例程序展示指针ptr可以遍历数组var并修改元素值,但直接对数组名var进行自增运算(var++)是非法的,因为数组名是常量指针。不过仍可用指针表达式*(var+2)来修改数组元素,这种形式不会改变数组名本身的值。这体现了指针和数组在访问元素时的相似性,以及数组名作为常量指针的特殊性。原创 2025-06-23 17:16:20 · 156 阅读 · 0 评论 -
C++二级指针的用法指向指针的指针(多级间接寻址)
C++二级指针(指向指针的指针)通过存储指针变量的地址来实现多级间接访问。普通指针指向数据,而二级指针指向指针变量本身,其类型为数据类型加*(如int**)。二级指针常用于访问指针数组,例如字符串指针数组,通过指针偏移和解引用操作可以方便地遍历数组元素。示例展示了如何用const char**类型的二级指针访问月份字符串数组,通过用户输入的数字获取对应的月份名称。这种机制增强了指针操作的灵活性,适用于需要处理指针集合的场景。原创 2025-06-23 16:54:15 · 718 阅读 · 0 评论 -
C++_核心编程_职工管理系统Part02(二级指针、数组、工厂模式)
摘要:本文讲解了如何实现批量添加职工功能,核心是利用堆区数组和二级指针管理不同类型职工对象。主要步骤包括:1) 计算新数组大小(原数据+新增数);2) 创建新堆数组并拷贝原数据;3) 通过工厂模式创建具体的职工子类对象;4) 释放原数组并更新指针;5) 实现用户交互界面录入职工信息。关键点在于动态内存管理和多态指针数组的应用,通过Worker**二级指针实现灵活的对象管理。原创 2025-06-23 16:37:46 · 176 阅读 · 0 评论 -
C++_核心编程_职工管理系统Part01(多态特性)
摘要:本文介绍了一个基于C++多态实现的职工管理系统设计方案。系统分为三类职工(普通员工、经理、老板),需管理编号、姓名、岗位和职责信息。主要功能包括:增删改查职工信息、排序、清空数据等。设计思路包括:创建管理类、菜单功能接口、职工抽象类及其派生类(普通员工、经理、老板),通过多态实现不同职工类型的管理。系统采用文件存储数据,界面交互式操作,提供完整的企业职工管理解决方案。原创 2025-06-22 21:20:38 · 349 阅读 · 0 评论 -
C++_核心编程_二进制文件操作
摘要:本文展示了C++中二进制文件读写操作。通过定义Person类(含姓名和年龄字段),演示了如何使用ofstream的write方法将对象数据写入文件,以及ifstream的read方法从文件读取数据并还原为对象。写操作将对象强制转换为char指针写入二进制文件,读操作反向还原数据并输出验证,实现了简单的对象序列化与反序列化功能。原创 2025-06-19 21:58:26 · 84 阅读 · 0 评论 -
C++_核心编程_文本文件操作
摘要:C++文件操作指南 文件类型:文本文件(ASCII)和二进制文件 头文件:<fstream> 三种操作类: ofstream:写文件 ifstream:读文件 fstream:读写文件 示例代码: 写文件示例(注释状态) 4种读文件方式(注释状态) 注意:文件操作可实现数据持久化,程序结束后不丢失原创 2025-06-19 21:53:19 · 95 阅读 · 0 评论 -
C++核心编程_多态案例三-电脑组装
本文展示了使用C++实现电脑组装的案例。通过定义CPU、显卡和内存条的抽象基类,以及Intel和Lenovo厂商的具体实现类,构建了一个模块化的电脑组装系统。Computer类通过组合方式集成三大组件,调用各组件的工作方法实现电脑运行。测试时组装了三台不同配置的电脑(全Intel、全Lenovo、混合配置),验证了系统的灵活性。该设计体现了面向对象的抽象、封装和多态特性,便于扩展新的硬件厂商。代码示例展示了接口抽象、组件组装和资源管理的完整实现流程。原创 2025-06-17 17:03:03 · 76 阅读 · 0 评论 -
C++_核心编程_虚析构和纯虚析构
摘要:本文演示了C++中虚析构函数和纯虚析构函数的使用方法。通过在Animal基类中声明虚析构函数或纯虚析构函数(virtual ~Animal()=0),可以确保父类指针释放子类对象时正确调用子类析构函数。代码示例展示了Cat子类继承自Animal的情况,其中包含堆区数据,需要正确析构。核心要点包括:1)虚析构/纯虚析构解决父类指针释放子类对象的问题;2)若子类无堆区数据可不使用;3)包含纯虚析构函数的类为抽象类。原创 2025-06-16 21:41:37 · 103 阅读 · 0 评论 -
C++_核心编程_多态案例二-制作饮品
摘要:本文通过C++多态技术实现饮品制作流程。定义抽象基类AbstractDrinking,包含煮水(boilWater)、冲泡(brewMethods)、倒杯(pourCup)和加料(pourSeasonings)四个纯虚函数,以及规定流程的makeDrinking方法。派生类MakeCaffe和MakeTea分别实现咖啡和茶的具体制作步骤。测试函数DoWork通过基类指针调用不同饮品的制作方法,展示多态特性。程序输出显示咖啡制作需加糖和牛奶,而茶则加柠檬,体现了不同饮品制作过程的差异。原创 2025-06-10 15:30:38 · 391 阅读 · 0 评论 -
C++_核心编程_纯虚函数和抽象类
本文介绍了C++中纯虚函数和抽象类的概念。通过代码示例说明,当父类中的虚函数没有实际意义时,可以将其声明为纯虚函数(使用=0语法)。包含纯虚函数的类称为抽象类,其特点是无法实例化对象,且子类必须重写纯虚函数,否则该子类也会成为抽象类。示例展示了抽象类Base及其子类Son的实现,以及如何通过基类指针调用子类重写的虚函数方法。原创 2025-06-10 14:39:33 · 123 阅读 · 0 评论 -
C++_核心编程_多态案例一-计算器类
本文展示了利用多态技术实现计算器类的案例。通过定义抽象基类AbstractCalculator和具体运算子类(加法、减法、乘法),演示了多态在代码组织、可读性和扩展性方面的优势。每个子类重写getResult()方法实现特定运算,主函数通过基类指针调用不同运算,体现了"一个接口,多种实现"的多态特性。相比普通写法,多态实现更易维护和扩展,只需添加新子类即可支持更多运算,而无需修改现有代码。案例突出了多态在面向对象程序设计中的核心价值。原创 2025-06-10 14:26:54 · 188 阅读 · 0 评论 -
C++_核心编程_多态的基本概念
摘要:本文介绍了C++中的多态概念,分为静态多态和动态多态。静态多态包括函数重载和运算符重载,在编译时确定函数地址;动态多态通过虚函数和继承实现,在运行时确定函数地址。通过Animal、Cat、Dog类的示例演示了动态多态的实现:父类定义虚函数speak(),子类重写该函数,当父类引用指向子类对象时,运行时会调用相应子类的函数。多态需满足继承关系和虚函数重写条件,是C++面向对象编程的重要特性之一。原创 2025-06-09 10:41:21 · 255 阅读 · 0 评论 -
C++_核心编程_菱形继承
摘要:菱形继承指两个派生类继承同一基类,而另一个类同时继承这两个派生类,形成类继承的菱形结构。主要问题包括数据二义性和重复继承。示例中,Animal是基类,Sheep和Tuo继承它,SheepTuo同时继承Sheep和Tuo,导致m_Age成员出现两份。通过虚继承(virtual public)可解决该问题,确保最终派生类只保留一份基类成员。测试代码展示了虚继承前后成员访问的差异。原创 2025-06-08 22:03:42 · 272 阅读 · 0 评论 -
C++核心编程_继承同名静态成员处理方式
问题:继承中同名的静态成员在子类对象上如何进行访问?静态成员和非静态成员出现同名,处理方式一致。访问子类同名成员 直接访问即可。访问父类同名成员 需要加作用域。原创 2025-06-08 17:07:11 · 486 阅读 · 0 评论 -
C++核心编程_继承同名成员处理方式
当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数。问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?子类对象加作用域可以访问到父类同名成员。子类对象可以直接访问到子类中同名成员。访问子类同名成员 直接访问即可。访问父类同名成员 需要加作用域。原创 2025-06-08 17:06:16 · 338 阅读 · 0 评论