- 博客(53)
- 收藏
- 关注
原创 C++(29):结构体
结构体(struct)是一种用户自定义的复合数据类型,用于将多个不同类型的变量组合成一个逻辑单元,主要用于数据聚合和简化复杂数据管理。与类(class)相比,结构体默认访问权限为public,适用于数据聚合场景,而类更适合封装数据与复杂行为。结构体的定义包括成员变量和成员函数,支持构造函数、运算符重载等高级特性。内存布局上,结构体涉及内存对齐和位域优化。结构体还支持继承和多态,并能与标准库容器交互。最佳实践建议优先使用类进行数据封装,结构体适用于开放数据成员的情况,并注意初始化安全和内存管理。
2025-05-22 21:00:00
1130
原创 C++(28):容器类 <map>
<map> 是 C++ 中的一种关联容器,用于存储键值对(pair<const Key, Value>),其中键是唯一的。其核心特性包括自动排序(默认按键升序)、基于红黑树的高效操作(插入、删除、查找的时间复杂度为 O(logn)),以及键的唯一性。基本操作包括声明、初始化、插入、访问、遍历和删除元素。<map> 适用于需要有序键值对且频繁查找的场景,如字典或配置管理。与其他容器相比,<map> 在有序性和查找效率上具有优势,但内存开销较大。通过自定义比较函数
2025-05-22 11:05:42
877
原创 C++(27): 标准库 <iterator>
本文介绍了C++中迭代器的核心概念、基本语法、特点及其在STL中的应用。迭代器是访问和遍历容器元素的通用接口,支持多种类型(如输入、输出、前向、双向和随机访问迭代器),并通过统一接口实现算法与容器的解耦。文章详细讲解了迭代器的声明、遍历方法、特有成员函数与工具(如std::advance、std::distance、插入迭代器和流迭代器),并分析了其内存与性能特点。此外,提供了示例代码展示插入迭代器、流迭代器及迭代器操作函数的用法,并总结了使用场景和注意事项,如迭代器失效、类别匹配和性能优化等。
2025-05-21 21:17:35
794
原创 C++(26): 标准库 <queue>
【摘要】C++中的queue是一种遵循先进先出(FIFO)原则的容器适配器,默认基于deque实现。它提供受限的操作接口(push、pop、front等),不支持随机访问或遍历。queue在任务调度、BFS算法等需要严格顺序处理的场景中表现优异,其操作时间复杂度均为O(1)。使用时需注意空队列风险、底层容器选择差异(deque/list/vector)以及线程安全问题。示例展示了如何创建队列、插入/删除元素及获取队列信息。queue通过限制操作类型保证了数据处理的顺序性,是标准库中实现FIFO逻辑的高效工具
2025-05-21 18:18:09
1299
原创 C++(25): 标准库 <deque>
双端队列(deque)是一种允许在头部和尾部高效插入和删除元素的线性数据结构,支持随机访问。与vector相比,deque在两端操作更高效(O(1)复杂度),但与list相比,中间操作效率较低(O(n)复杂度)。deque的内存结构由多个固定大小的连续内存块组成,支持动态扩展。在C++中,使用<deque>头文件进行声明和操作。deque的特点包括高效的双端操作、分块连续内存、支持随机访问,但中间操作效率较低。特有成员函数如push_front、pop_front等。deque适用于需要双端操作
2025-05-19 23:15:00
996
原创 C++(24):容器类<list>
C++中的<list>是一个双向链表容器,适用于频繁插入和删除操作的场景。其核心特性包括双向链表结构、非连续内存分配和双向迭代器支持。<list>允许在任意位置快速插入和删除元素,时间复杂度为O(1),但不支持随机访问,访问第n个元素需要遍历前n-1个节点。<list>提供了丰富的成员函数,如push_front、push_back、insert、erase、sort、unique和splice等,用于操作链表元素。与vector相比,<list>在插入和删除
2025-05-19 14:45:41
1138
原创 C++(23):容器类<vector>
本文介绍了C++标准模板库(STL)中的vector容器,它是一种动态数组,支持快速随机访问和自动内存管理。文章首先阐述了vector的核心概念,包括其连续存储元素的特点和与普通数组的区别。接着,详细讲解了vector的基本语法,如头文件的包含、声明与初始化的多种方式。随后,列举了vector的常用操作,如push_back()、pop_back()、size()等,并分析了它们的时间复杂度。最后,通过具体实例展示了size()、front()、back()、push_back()、pop_back()、c
2025-05-18 19:45:00
469
原创 C++(22):fstream的一些成员函数
本文介绍了C++中文件操作的基本方法,包括遍历读取文件、读取文件大小、存取文字、重载输入输出运算符以及追加内容到文件。通过eof()方法可以检测文件是否到达末尾,seekg()和tellg()用于文件定位和获取文件大小。read()和write()方法用于二进制数据的读取和写入。此外,文章还展示了如何重载<<和>>运算符以操作用户自定义数据类型,以及如何使用ios::app模式在文件末尾追加内容。这些方法为C++程序员提供了灵活的文件处理工具。
2025-05-18 13:45:00
695
原创 C++(21):fstream的读取和写入
本文介绍了C++中文件操作的基本方法,包括文件打开模式、字符读写及行读取。ios::out用于写入数据,若文件不存在则创建新文件;ios::in用于读取数据,文件不存在时打开失败。is_open用于检查文件是否成功打开。put()方法用于向文件中写入单个字符,get()方法用于读取字符,支持读取单个或多个字符,并可设置终止符。getline()方法则用于读取整行数据,并丢弃分隔符。通过这些方法,可以实现文件的读写操作。
2025-05-18 08:30:00
495
原创 C++(20): 文件输入输出库 —— <fstream>
<fstream> 是 C++ 标准库中用于文件输入输出的核心组件,提供了文本和二进制文件的读写功能。其核心类包括 ofstream(写操作)、ifstream(读操作)和 fstream(读写操作)。通过示例展示了文本文件的写入、读取以及二进制文件的操作方法。文件打开模式支持多种组合,如读取、写入、追加和二进制模式。文件指针操作允许定位和获取当前读写位置。错误处理技巧包括检查文件状态和重置错误标志。实际应用场景包括配置文件读写、数据持久化、日志系统和大数据处理。掌握这些功能可有效处理文件操作需
2025-05-17 19:45:00
520
原创 C++(19):内联(inline)函数
内联函数是C++中用于优化高频调用的小型函数的机制,通过在编译阶段将函数体直接替换到调用处,避免传统函数调用产生的额外开销,从而提升性能。内联函数适用于简单、高频调用的函数,如数学运算和模板函数。然而,编译器可能拒绝内联复杂函数,且过度内联会导致代码膨胀,影响性能。实际性能测试显示,内联函数显著优于普通函数调用。因此,内联函数应谨慎使用,主要用于高频调用的小函数和需要类型安全的操作。
2025-05-17 14:45:00
294
原创 C++(18):函数重载(Overload)
函数重载是C++中的一项重要特性,允许在同一作用域内定义多个同名函数,但这些函数的参数列表必须不同(类型、数量或顺序不同)。编译器会根据调用时传入的实参类型和数量,自动选择匹配的函数版本。函数重载解决了强类型语言中代码冗余和调用复杂的问题,通过统一接口语义,增强了代码的可读性和维护性。例如,处理不同类型数据的打印操作,传统C语言需要为每种类型编写不同名称的函数,而通过函数重载,可以统一使用一个函数名,编译器自动匹配对应的实现。然而,函数重载也可能引发匹配歧义,如参数隐式转换冲突、默认参数引发歧义等。为避免歧
2025-05-17 08:30:00
799
原创 C++(17):引用传参
文章探讨了C++中引用传参的核心概念及其优势。引用作为变量的别名,允许直接操作原变量,避免了数据拷贝,尤其适合处理大型对象。通过代码示例对比了指针和引用传参的差异,引用传参在语法上更为简洁,避免了指针操作中的解引用和符号优先级问题。此外,引用传参支持const引用,既能保护数据不被意外修改,又能保持高效访问。总结指出,引用传参结合了值传递的简洁性和指针传递的高效性,适用于需要修改实参或传递大型对象的场景,但需注意引用必须绑定有效变量且无法重新绑定。
2025-05-16 21:15:00
329
原创 C++(16):“&”符号
文章主要介绍了C++中的取地址运算符和引用声明符的使用及其特点。取地址运算符(&)用于获取变量的内存地址,返回指针类型,可与指针配合使用。引用声明符(&)用于为变量创建别名,必须初始化且不可为空或重新绑定。引用常用于函数参数传递,避免拷贝并直接修改实参,也用于范围for循环中直接修改容器元素。与指针相比,引用必须初始化、不可为空、不可重新绑定,且无独立内存,直接使用无需解引用。引用作为别名,必须绑定实体,函数参数传递高效,不可空特性使其安全性高于指针,但牺牲了灵活性。
2025-05-16 14:16:27
327
原创 C++(15):默认值(default)
默认值是为函数参数或变量预先设定的值,当调用者未显式提供数据时,程序自动使用该默认值,确保程序的确定性和健壮性。默认值广泛应用于函数参数、构造函数参数和变量初始化中。在函数参数中,默认值允许调用者选择性省略参数,简化调用并提高代码灵活性。在构造函数中,默认值允许灵活初始化对象。在变量声明时,默认值可直接赋予变量,避免未定义行为。默认值的优势包括简化调用、提高代码灵活性和防止未定义行为。然而,使用默认值时需注意默认参数顺序、避免头文件与实现文件冲突,并谨慎使用以防止代码可读性下降。
2025-05-16 12:09:32
292
原创 C++(14):值传参与指针传参
本文对比了C++中的值传参和指针传参两种参数传递方式。值传参通过复制实参的值传递给函数,函数内修改的是副本,原数据不受影响;指针传参则传递实参的内存地址,函数内通过指针直接操作原数据,修改会反映到原数据。值传参适用于小型数据或不需要修改原数据的场景,具有安全性和代码简单直观的优点,但复制大对象时效率低。指针传参适合大型数据或需要修改原数据的场景,高效且支持动态内存操作,但需处理空指针风险和代码可读性降低的问题。建议优先使用引用传参,结合了值传参的安全性和指针传参的高效性,除非需要处理动态内存或兼容C代码。
2025-05-16 08:45:00
1067
原创 C++(13):函数的声明与定义
函数声明与定义是编程中的两个关键概念。函数声明用于告知编译器函数的存在、名称、返回类型和参数列表,但不包含具体实现,通常以分号结尾,可多次声明。函数定义则提供函数的具体实现,包含函数体,以{}包裹代码,且只能定义一次。两者在函数名、返回类型和参数类型上必须一致,但声明中可以省略参数名。函数声明通常放在头文件或代码开头,而函数定义则放在源文件中。常见错误包括重复定义、声明与定义不匹配以及忘记声明。正确使用函数声明和定义有助于实现代码的模块化和可维护性。
2025-05-16 00:41:08
329
原创 C++(12):using声明
using 声明用于将特定命名空间中的名称引入当前作用域,使得代码可以直接使用这些名称,而无需添加命名空间前缀。它有两种形式:单独引入特定名称(推荐)和引入整个命名空间(谨慎)。单独引入特定名称可以减少名称冲突的风险,而引入整个命名空间可能导致名称冲突,特别是在大型项目中。最佳实践包括优先单独引入明确需要的名称,限制作用域在函数或代码块内部使用 using,避免在头文件中使用 using 声明或 using namespace,以及对易冲突名称直接使用命名空间前缀。通过这些方法,可以最小化命名冲突,最大化代
2025-05-15 21:15:00
605
原创 C++(11): 取模运算符 %
取模运算符 % 用于计算两个整数相除后的余数,其结果的符号与被除数一致。基本语法为 result = dividend % divisor。若被除数能被除数整除,结果为 0。取模运算仅适用于整数,且除数不能为 0。典型应用包括判断奇偶性、周期性操作、循环队列索引、哈希函数和时间转换等。例如,15 % 5 结果为 0,-10 % 3 结果为 -1。取模运算在编程中广泛用于处理循环、索引和数值计算等场景。
2025-05-15 15:15:00
549
原创 C++(10):赋值运算符
本文介绍了赋值运算符的基本概念和分类,包括基本赋值运算符和复合赋值运算符。复合赋值运算符分为算术类和位运算类,分别用于简化数学运算和位操作。文章还列举了赋值运算符的常见应用场景,如计数器累加、数学公式简化和位标志管理。最后,强调了使用赋值运算符时需注意操作数类型匹配、避免未初始化变量以及运算符优先级等问题。通过代码示例,展示了各类赋值运算符的具体用法和效果。
2025-05-15 10:16:20
284
原创 C++(9):位运算符进阶版
本文介绍了位运算符的基本概念及其在实际编程中的应用。首先定义了两个变量A和B,分别赋值为45和25,并展示了它们的二进制表示。接着,详细列出了常见的位运算符(按位与、按位或、按位异或、按位取反、左移、右移)的规则和实例,并通过C++代码验证了这些运算符的结果。文章还说明了位运算符的关键规则,如按位与、按位或、按位异或的具体计算方式,以及位移运算符的等价数学操作。最后,通过实际应用场景(如标志位组合、快速乘除、权限校验)展示了位运算符的实用价值,并提醒了使用时的注意事项,如位数限制、符号位影响和溢出风险。
2025-05-11 15:45:00
354
原创 C++(8):类型限定符
本文介绍了C++中几种常见的关键字及其用途。const用于定义常量,确保变量值不可修改;volatile修饰易变变量,禁止编译器优化;restrict(C++非标准)确保指针是访问数据的唯一方式;mutable允许在const成员函数中修改成员;static用于静态存储,延长变量生命周期或限定作用域;register(已弃用)建议将变量存入寄存器。这些关键字在C++中分别属于类型限定符和存储类说明符,restrict在C++中需依赖编译器扩展。
2025-05-11 13:15:00
372
原创 C++(7):位运算符入门版
本文介绍了基本的位运算符及其应用。位运算符包括与(&)、或(|)、异或(^)和非(~),用于对二进制位进行操作。与运算用于掩码操作,或运算用于组合标志位,异或运算可用于数据加密,非运算按位取反。此外,位移运算符(<<、>>)用于快速乘除操作。文章还提供了代码示例,展示了如何在实际场景中使用这些运算符,如权限系统和快速乘除运算。需要注意的是,右移运算符的行为受符号位影响,位移范围不应超过变量位数,且位运算符优先级较低,建议使用括号明确优先级。
2025-05-11 08:00:00
229
原创 C++(6):逻辑运算符
本文介绍了C++中逻辑运算符的基础用法、短路求值特性、实际应用场景及注意事项。逻辑运算符包括&&(与)、||(或)、!(非),用于组合或修改布尔表达式。通过代码示例展示了基础用法和条件判断,如验证输入合法性和游戏状态判断。短路求值特性在&&和||中体现,若第一个操作数已确定结果,则不再计算第二个操作数。注意事项包括操作数隐式转换为布尔值,以及区分逻辑与&&和按位与&的不同用途。
2025-05-10 23:36:28
465
原创 C++(5):有符号整数和无符号整数差异
本文通过代码实例展示了有符号和无符号短整数(16位)在不同赋值情况下的行为差异。当无符号数j=50000赋值给有符号变量i时,由于50000超出有符号短整数的范围(-32768到32767),导致溢出,输出结果为-15536。文章详细分析了二进制位模式和补码机制,解释了这一现象。此外,通过对比合法范围赋值和错误示例,强调了范围检查的重要性,并提供了修正方法。最后,总结了有符号和无符号整数的特性及适用场景,并扩展至32位整数的溢出实例。
2025-05-10 12:15:00
869
原创 C++(4):const关键字
const关键字用于声明不可修改的常量,其值在初始化后固定不变。常量的命名通常使用大写字母以区分变量,如MAX_SIZE。与普通变量不同,const常量必须在声明时初始化,且不可修改。const常量的优势包括防止意外修改、明确标识固定值以及可能的编译器优化。它适用于数学常量、配置参数及需要保护的数据场景。const还可与指针和函数参数结合使用,进一步限制数据的可变性。此外,未初始化常量或尝试修改常量都会导致编译错误。通过合理使用const,可以增强代码的安全性和可维护性。
2025-05-10 10:30:00
280
原创 C++(3):字符串常量
本文详细介绍了C++中字符串常量的基本规则、使用方法及注意事项。字符串常量由双引号包裹,可包含普通字符、转义序列和Unicode字符,并以空字符\0结尾,占用内存长度为字符数加1。文章通过代码实例展示了基本字符串、转义字符、多行字符串和C++11原始字符串字面量的用法,并提供了常见错误示例及其修正方案。此外,强调了字符与字符串的区别、字符串拼接、通用字符支持和换行符差异等注意事项。总结表概括了字符串的定义、转义字符、多行书写、原始字符串和内存特性等关键点。
2025-05-10 08:45:00
324
原创 C++(2):浮点常量
文章摘要: 浮点常量的表示有两种主要形式:小数形式和指数形式。小数形式必须包含小数点,而指数形式必须包含指数部分,且小数点或整数/小数部分至少存在一个。合法示例包括3.14159(小数形式)和314159E-5L(指数形式),而非法示例如510E(缺少指数值)和210f(整型常量无法加f后缀)。浮点常量可通过后缀指定类型,如f/F表示float,l/L表示longdouble。注意事项包括负号的使用、可读性建议、类型范围的实现依赖以及C++17起支持的十六进制浮点常量。总结表列出了各种形式的必需部分、合法与
2025-05-10 02:00:00
983
原创 C++(1):整数常量
本文详细介绍了不同进制的表示方法及其在编程中的应用。首先,文章解释了十进制、八进制和十六进制的格式和示例,强调了八进制中不能以0开头和十六进制中字母大小写不敏感的特点。接着,文章讨论了通过后缀(如U、L)指定整数类型的方法,并提供了后缀组合的示例。此外,文章还指出了在使用这些表示法时需要注意的陷阱,如八进制的误用和后缀的可读性问题。最后,文章总结了各进制的表示规则和类型推断规则,帮助读者更好地理解和应用这些概念。
2025-05-09 21:35:12
315
原创 Python学习(二)
可以看到我们先定义了两个变量,在使用加号连接时,我们不仅使用了两个变量还有一个“ ”,这也是允许的,我们可以在“ ”里面添加其他字符来和变量进行连接,为了美观我们选择了空格。可以发现,我们使用rstrip()方法删除空白后,只是临时的,并没有改变变量name,要想永久的删除空白,必须将删除的结果再次存回变量中。在Python中,字符串是不可变序列,用引号括起来的就是字符串,引号可以是单引号(' ')、双引号(" ")或者三引号('" "')。可以看出,变量后面加“ . ”再加方法就是执行方法的操作。
2024-04-01 23:28:03
1278
原创 【无标题】
在非线性量化中,像素的状态可以在量子系统之间进行更复杂的相互作用,这种相互作用在线性量化中是不允许的。在抽样过程中,量化器将连续的模拟信号划分为若干个离散的小区间,并对每个小区间内的信号值进行采样。在量化过程中,量化器将采样得到的信号值转换为有限个离散整数值,即量化后的信号值。量化器的精度决定了图像数字化后的质量,精度越高,图像的质量越好。非线性量化在图像数字化过程中具有更高的精度、更丰富的色彩、更好的对比度和更平滑的图像表现等特点,能够提供更好的图像质量和更丰富的视觉效果。
2024-03-23 17:47:44
1021
1
原创 使用matalab进行数字图像处理(三)
这个像素信息工具显示的是鼠标光标所在图像的像素点的信息,并且可以显示该图像窗口中的所有图像中的像素的信息。优点:这种方法对每个像素进行了处理,根据其灰度值的大小进行了不同的变换,可以更准确地控制图像的灰度化。将输入图像映射为输出图像,输出图像每个像素点的灰度值仅由对应的输入像素点的灰度值决定,运算结果不会改变图像内像素点之间的空间关系,通常用于调整图像的对比度和亮度。此外,对灰度值进行不同的变换可能需要更复杂的计算和编程。是像素的坐标,这个函数返回的信息包括像素值、颜色、坐标和其他有关像素的信息。
2023-10-22 20:35:57
2165
原创 使用matalab进行数字图像处理(二)
然后,使用带有参数形式的 imwrite 函数将该图像数据矩阵写入到名为 'output.jpg' 的文件中,并设置压缩质量为 90%,使用 JPEG 压缩算法进行压缩。在MATLAB中,对图像进行操作和处理时,经常需要知道图像文件的文件名、文件格式、图像大小、图像类型、数据类型等信息,可以直接调用MATLAB函数imfinfo()来读取图像文件的信息。其中,'fmt' 表示图像文件的格式,例如 '.jpg'、'.png'、'.bmp' 等。例如,您可以指定要读取的图像帧的索引,或者设置背景颜色等。
2023-10-21 15:21:27
789
1
原创 MySQL数据库(一)
在开始菜单中搜索“命令提示符”,然后右键点击“以管理员身份运行”选项,在弹出的命令提示符界面输入net start mysql80,按回车键即可启动MySQL服务。首先要配置好环境变量,此电脑——属性——高级系统设置——环境变量——path——新建——找到MySQl安装的文件目录,找到bin文件所在文件夹——复制文件路径——所有步骤完成后点击所有确定,完成环境变量配置。在开始菜单中搜索“命令提示符”,点击打开,输入命令:net start mysql,然后按回车键,即可启动MySQL服务。
2023-10-15 22:47:03
6810
1
原创 使用matalab进行数字图像处理(一)
在MATLAB 中一个数据矩阵就相当于一幅数字图像,只是在数字图像中对应的数组元素必须在一定的取值范围,因此,只要将对应数据矩阵中的元素按一定规律进行转换,就可以将矩阵转换为图像了。或者,可以使用自定义的颜色值创建一个颜色表。需要注意的是,index2rgb函数需要指定颜色图map作为输入参数,因为只有知道颜色图map中每种颜色的RGB值,才能将索引图像中的像素值转换为正确的颜色。,n是灰度级数,默认值为2,[X,mapl对应转换后的索引图像,map中对应的颜色值为颜色图gray(n)中的颜色值。
2023-10-14 14:43:55
5394
1
原创 欢庆端午之C语言实现云·赛龙舟
这样,端午节赛龙舟的传统就诞生了。同时,我们还定义了偏移量数组,根据玩家的不同位置,计算出小人和船在赛道上的位置。为了支持双人游戏,我们可以通过从网络或者串口上获取玩家的位置信息,将其传递给打印函数,控制小人在赛道上的位置。我们使用了srand()函数初始化了随机数种子,使用rand()函数生成了随机的步长,模拟了运动员和电脑的比赛过程,计算得分并输出结果。在游戏开始时,双方龙舟和小人的初始位置都为 0 ,游戏通过不断循环获取键盘输入并更新位置,并且每个循环中龙舟都会前进随机距离(1 ~ 10 米)。
2023-06-21 15:40:52
507
原创 C语言实现几种常见排序方法
首先将待排序序列建立成大根堆(或小根堆),然后将根节点与最后一个节点交换位置,这时候最后一个节点已经是有序的了,再对剩余部分的序列进行堆化,得到新的根节点,再将根节点与倒数第二个节点交换位置,以此类推,不断缩小排序范围,直到整个序列有序。桶排序是一种常用的排序算法,它需要根据数据的特点构建若干个桶,将数据分配到相应的桶中并对每个桶中的数据进行排序,最后按照桶的顺序依次输出所有数据。在桶排序过程中,需要将待排序序列分配到若干个桶中,然后对每个桶中的数据进行排序,最后按照桶的顺序依次输出所有数据。
2023-06-19 01:29:55
3611
原创 色环电阻的识别方法
色环电阻:小功率碳膜和金属膜电阻,一般都用色环表示电阻阻值的大小,色环电阻分为:4色环电阻、5色环电阻、6色环电阻。现介绍四色环和五色环,各种颜色表示如下:分辨色环时先将电阻身上有金色或银色的一端放于右边,,第1环代表数值的第1位数(即数目字列出在左边的第1个数) ,第2环代表数值的第2位数(即数目字向右的第2个数) ,第3环代表第3位数(即数目字的第3个数) ,第4环代表电阻值的误差值,,但价格会稍高。
2023-06-15 13:07:26
9166
C/C++数据结构-二叉树的存储和遍历
2025-05-22
判断一个整数是否为回文数
2023-06-15
基于51单片机的智能交通灯控制系统
2023-06-09
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人