自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 收藏
  • 关注

原创 C++ STL 专家容器:关联式、哈希与适配器

摘要: C++ STL中的关联式容器(如map、set)基于红黑树实现,提供O(log n)查找效率,通过维护有序性支持二分查找;哈希容器(如unordered_map)则利用哈希表实现平摊O(1)查找,但需处理冲突(拉链法/开放地址法)和重哈希问题。priority_queue作为容器适配器,基于堆结构实现优先级管理。自定义类型需重载比较运算符或提供哈希函数才能作为键值。这些容器针对不同场景(有序性、速度、优先级)优化,理解其底层数据结构和性能权衡是C++面试的核心考察点。

2025-08-26 15:40:46 137

原创 C++ 类型转换深度解析

本文解析 C++ 四种类型转换的设计目的与特性。C++ 用它们替代 C 风格转换,解决其意图模糊和安全性问题,强制明确转换意图并增强检查。

2025-08-25 21:03:06 389

原创 C++ 字符串与内存操作函数深度解析

本文深度解析C++字符串与内存操作函数,比较C语言传统函数(strcpy、memcpy、sprintf)与C++现代化替代方案的优劣。 核心要点: C函数设计哲学强调性能与灵活性,但缺乏安全性检查,易导致缓冲区溢出等漏洞 C++现代化替代方案: std::string替代strcpy,提供自动内存管理和丰富接口 std::copy/std::vector替代memcpy,保证类型安全 std::stringstream/std::format替代sprintf,实现类型安全格式化 底层原理分析包括缓冲区溢出

2025-08-25 20:55:55 559

原创 C++ extern 关键字面试深度解析

摘要:C++中extern关键字主要用于处理程序跨文件共享和语言兼容性问题。它作为声明关键字,允许在一个编译单元中使用其他编译单元定义的全局变量和函数,实现分离式编译。extern "C"则用于解决C++与C混合编程时的链接兼容性问题,通过抑制C++的名称修饰功能,使两者能正确链接。在实际项目中,extern常用于头文件声明全局变量/函数,而extern "C"则用于处理跨语言接口调用,通常配合__cplusplus宏来编写兼容C/C++的头文件。

2025-08-25 20:48:26 596

原创 C++ new/delete vs malloc/free深度解析

本文深入解析C++中new/delete与malloc/free的核心区别,强调new创建的是对象(调用构造函数),而malloc仅分配内存。关键对比包括类型安全、错误处理、数组处理等特性,指出new/delete是C++面向对象的基石。最佳实践建议在C++中完全避免malloc/free,仅在与C库交互时使用。文章还模拟了面试问答场景,解释混用风险及new重载的应用场景,最后用简答题总结核心要点:构造/析构函数调用、数组处理差异以及与C库交互的合理用途。

2025-08-25 20:47:12 690

原创 C++ 内存安全与智能指针深度解析

现代C++通过智能指针实现内存安全,核心是RAII机制将资源生命周期与对象绑定。默认使用std::unique_ptr实现独占所有权,需要共享时采用std::shared_ptr配合引用计数,循环引用问题通过std::weak_ptr解决。创建时应优先使用make_unique和make_shared,既能保证异常安全又提升性能。智能指针从设计上消除了手动内存管理的风险,是现代C++内存管理的最佳实践。

2025-08-25 16:50:34 553

原创 C++ 指针与引用面试深度解析

C++指针与引用面试解析摘要 指针和引用是C++中实现间接访问的两种机制,各有特点和适用场景。指针存储对象地址,支持空值和重定向,但存在安全隐患;引用是对象别名,必须初始化且不可为空,更安全但限制更多。最佳实践中,优先使用引用处理函数参数和返回值,指针则用于可选对象或需改变指向的情况。关键区别在于指针暴露底层地址概念,引用提供高级抽象。返回引用时需确保目标对象生命周期长于引用,避免悬垂引用。

2025-08-25 16:44:06 607

原创 C++ static 关键字面试深度解析

摘要:C++ static 关键字面试深度解析 static 关键字在 C++ 中控制变量/函数的生命周期和可见性,有三大应用场景: 函数内静态局部变量:延长生命周期至程序结束,用于计数器或单例模式 全局静态变量/函数:限制为内部链接,仅在当前文件可见(现代C++建议用匿名命名空间替代) 类静态成员:属于类而非对象,所有实例共享。静态函数无this指针,不能访问非静态成员 关键区别:普通全局变量具有外部链接,而静态全局变量只有内部链接。匿名命名空间比static更优,因其能封装类型(class/struct

2025-08-25 16:42:42 489

原创 C++ const 关键字解析

本文深入解析C++中const关键字的核心价值与应用场景。const作为"不变性"契约,既保证编译期安全性,又增强代码可读性,还能优化性能。重点剖析const修饰指针的三种情况:常量指针(不能修改指向值)、指针常量(不能修改指向地址)和指向常量的常指针(两者皆不可修改)。此外还探讨const在函数参数、返回值、成员函数中的使用,以及与#define、constexpr、mutable等关键字的对比。文章最后通过模拟面试问答,展示如何在实际对话中清晰表达const的理解和应用。

2025-08-25 16:40:47 766

原创 C++ 对象生命周期核心函数深度解析

C++对象生命周期管理核心机制解析 本文深入剖析C++对象生命周期管理的六大核心特殊成员函数(默认构造、拷贝构造、拷贝赋值、移动构造、移动赋值和析构函数)。从"三法则"到"五法则"的演进路径揭示C++资源管理哲学的发展,重点分析了编译器自动生成规则及其底层原理。通过实际项目案例对比传统C风格资源管理与现代RAII实现方式,展示如何利用这些机制构建安全高效的系统。文章特别强调移动语义的性能优势及其在大型数据传输场景中的关键作用,为C++开发人员提供全面的对象生命周期管理

2025-08-25 11:43:37 471

原创 【软件工程复习】

​ 1983年IEEE给出的定义:“软件工程是开发、运行、维护和修复软件的系统方法方法、工具和过程。程序单元测试工具组装测试工具系统测试工具​模块或软件构件间的接口设计软件与其他软硬件系统之间的接口设计软件与人之间的交互设计​UML(Unified Modeling Language 统一建模语言)用例模型、对象模型、交互模型​ 风格是一种带有倾向性的模式。介绍:抽象工厂模式提供一个接口,用于创建一组相关或相互依赖的对象,而无需指定它们具体的类。

2024-12-17 15:34:26 1234

原创 【Linux网络 —— 网络基础概念】

TCP/IP 协议的本质是一种解决方案TCP/IP协议(Transmission Control Protocol/Internet Protocol)是一组用于计算机网络通信的协议,构成了互联网的基础。它定义了数据在网络中如何被分割、传输和重组,并确保不同设备之间能够有效地进行信息交换。TCP/IP应用层传输层网络层和链路层,每一层都负责特定的功能,协同工作以实现端到端的数据传输。通过这一协议,设备能够在全球范围内互联互通,支持各种类型的网络应用。在计算机网络中,

2024-09-24 16:21:52 1057

原创 【C++11 —— 智能指针】

内存泄漏是指程序在动态分配内存后,在不需要使用该内存时未能及时释放,结果导致内存空间被一直占用,直到程序运行结束。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,造成了内存的浪费。内存泄漏的危害:性能下降:内存泄漏会导致程序占用的内存越来越多,从而降低程序的运行速度。系统崩溃:严重的内存泄漏会导致程序占用的内存耗尽,从而引发系统崩溃或程序异常退出。资源浪费:内存泄漏会导致系统中的可用内存越来越少,从而浪费系统资源。代码示例。

2024-09-19 21:01:44 764

原创 【C++11 —— 异常】

实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。在软件开发中,尤其是复杂系统的开发中,使用自定义异常体系可以帮助团队规范化异常管理。通过定义一套继承体系,所有抛出的异常都是特定基类的派生类,这样外层调用者可以通过捕获基类来处理所有相关的异常。使用自定义异常可以提供更具体的错误信息,使得代码的可读性和可维护性得到提升。

2024-09-17 16:12:30 1498

原创 【C++11 —— 线程库】

在C++11之前,涉及到多线程的问题,都是和平台相关的,比如windows和Linux下各有自己的接口,这使得代码的可移植性比较差。C++11的线程库提供了对多线程编程的支持,使得程序能够并发执行多个任务。从而不再需要依赖于第三方库,而且在原子操作中引入了原子类的概念。在使用标准库里的线程,必须包含头文件。线程 (std::thread)互斥量 (std::mutex)条件变量 (std::condition_variable)原子操作 (std::atomic)

2024-09-16 21:14:23 1112

原创 【C++11 —— 包装器】

function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。这些包装器主要用于提供一致且适合的接口以便于处理各种可调用对象,如函数、函数对象、lambda表达式等。其中:是被调用函数的返回类型。是被调用函数的参数类型列表。// func 可以存储接受两个 int 参数并返回 int 的可调用对象bind也是一种函数包装器,也叫做适配器。它可以接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表,C++中的bind本质是一个函数模板。F。

2024-09-13 21:58:07 1023

原创 【C++11 ——— lambda表达式】

它使得函数可以作为参数传递,同时也可以作为返回值返回,从而增强了C++的函数式编程能力。Lambda表达式的语法简洁,能够有效减少代码的冗余,提高可读性和可维护性。

2024-09-10 21:11:37 837 2

原创 【C++11 ——— 可变参数模板】

/Args是一个模板参数包//args是一个函数参数包//声明一个参数包Args... args,这个参数包中可以包含0到任意数量个模板参数。中的Args...表示一个模板的参数包,它可以包含0个或多个模板参数。中的args...表示一个函数的参数包,允许函数接受任意数量的参数。...在参数包中的作用...用于声明一个可以包含多个参数的包,一般位于参数名称之前。...用于表示这个函数可以接受多个参数,一般位于参数名称之后。//Args是一个模板参数包//args是一个函数参数包。

2024-09-10 17:38:28 1500

原创 【C++11 ——— 类的新功能】

比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字显示指定移动构造生成。这种在类内部就地初始化成员变量的方式,相比于在构造函数的初始化列表中进行初始化,可以使代码更加简洁和易读。当然,如果需要根据传入的参数进行不同的初始化,仍然需要在构造函数中进行处理。可以看到,即使我们没有在构造函数中显式初始化这些成员变量,它们仍然被赋予了在类内部指定的默认值。总之,C++11 引入的这种在类内部指定成员变量默认值的功能,大大简化了类的定义和初始化过程,提高了代码的可读性和可维护性。

2024-09-09 19:14:57 1116

原创 【C++11 ——— 右值引用和移动语义】

右值引用和移动语义

2024-09-09 18:41:17 839

原创 【C++11 —— 常用语法】

在2003年,C++标准委员会提交了一份技术勘误表(简称TC1),使得C++03这个名称取代了C++98,成为C++11之前的最新C++标准名称。不过,由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分没有改动,因此人们习惯性地将这两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准经历了十年的磨砺,第二个真正意义上的标准终于问世。相比于C++98/03C++11带来了数量可观的变化,包含约140个新特性,并修正了C++03标准中约600个缺陷。

2024-09-08 16:21:19 1474

原创 【Linux —— POSIX信号量 - 基于环形队列的生产消费模型】

POSIX信号量提供了一组函数来创建、操作和销毁信号量。环形结构起始状态和结束状态都是一样的,不好判断为空或者为满,所以可以通过加计数器或者标记位来。但是我们现在有信号量这个计数器,就很简单的进行多线程间的同步过程。另外也可以预留一个空的位置,作为满的状态。POSIX信号量是一种用于进程和线程之间。信号量是一种同步原语,通常表现为一个。操作(等待操作),尝试获取信号量。,知道信号量的值增加到允许的范围。如果一个进程尝试将信号量的值。: 初始化未命名信号量。

2024-08-28 21:03:46 1365

原创 【Linux —— 生产者消费者模型】

生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。生产者和消费者,它们通过共享的缓冲区进行通信。生产者负责生成数据并将其放入缓冲区,而消费者则从缓冲区中获取数据并进行处理。生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题。生产者和消费者彼此之间不直接通讯,而共享的缓冲区进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给缓冲区,消费者不找生产者要数据,而是直接从缓冲区取,平衡了生产者和消费者的处理能力。这个缓冲区就是用来给生产者和消费者解耦的。

2024-08-27 22:00:40 1175 1

原创 【Linux —— 线程同步 - 条件变量】

当线程调用该函数时,互斥锁会被自动解锁,允许其他线程访问和修改共享资源。线程在等待条件变量时,必须持有互斥锁,以防止竞争条件,并在被唤醒后重新获取互斥锁,以确保对共享资源的安全访问。在唤醒线程之后,主线程会打印一条消息,表示已经唤醒了一个线程,并睡眠 2 秒钟。来进入等待状态时,互斥量会被自动解锁,允许其他线程修改共享资源和条件状态。被唤醒的线程在继续执行之前,必须重新获取互斥量并检查条件是否满足。:唤醒一个等待该条件变量的线程。,允许线程在某个条件不满足时进入等待状态,直到其他线程通知条件已满足。

2024-08-26 21:38:36 827

原创 【Linux —— 线程互斥】

互斥是一种同步机制,旨在确保同一时刻只有一个执行流(线程或者进程)可以进入临界区。互斥通常通过互斥量(mutex)来实现。互斥量是一种锁,线程或进程在访问临界资源之前需要获取这个锁,完成后释放它。

2024-08-21 23:48:13 1111 1

原创 【Linux —— 理解pthread库和底层逻辑】

这些函数都是对系统调用的封装,提供高效、标准化的多线程编程接口,它通过动态加载和链接机制,不仅节省了系统资源,还提供了灵活的升级路径。在使用pthread库时,程序可以享受标准线程操作接口的便利,而不必关心底层复杂的线程管理和调度细节。实际上,pthread_t 在内部可能是一个线程控制块(TCB)的指针,或者是一个可以唯一标识线程的 ID。标准下的线程管理功能,它提供了**创建、管理、同步和销毁线程的函数。的主要任务就是在一个进程中创建一个新的线程,新的线程共享地址空间和部分资源。,即一个无符号长整型。

2024-08-15 11:26:02 1510

原创 【Linux —— 线程控制】

Linux 线程控制

2024-08-15 09:22:42 825

原创 【Linux —— 虚拟地址空间与二级页表的管理与转换】

二级页表(Two-Level Page Table)是一种内存管理结构,主要用于减少虚拟地址空间管理中的内存开销。页目录索引、页表索引和页内偏移量。二级页表通过引入页目录和页表两级结构,减少了直接使用单级页表所需的巨大内存。

2024-08-12 21:36:17 1698

原创 【Linux进程信号】

下面我们通过图来理解一下:用户态进程正在执行正常的程序指令,因为中断、异常或系统调用,CPU从用户态切换到。

2024-08-08 15:09:14 1073

原创 【C++ —— 认识哈希和unordered_set、unordered_map的介绍及模拟】

哈希冲突(Hash Collision)是指两个或多个不同的键通过哈希函数映射到同一个位置。当哈希表发生冲突时,需要使用某种机制来解决冲突,确保所有键值对能够正确存储和查找。哈希函数的定义哈希函数(Hash Function)是将键值转换为哈希值的函数。哈希值用于确定键值在哈希表中的存储位置。一个好的哈希函数能均匀分布键,减少冲突,提高哈希表的性能。

2024-07-28 23:04:42 832

原创 【C++ —— 用一棵红黑树同时封装出map和set】

{}// 各种操作符重载模板参数T:表示树节点存储的数据类型。Ref:引用类型,用于 operator* 的返回类型。Ptr:指针类型,用于 operator-> 的返回类型。成员变量:_node:当前迭代器指向的节点。

2024-07-27 23:27:07 625

原创 【C++ —— 红黑树】

红黑树是一种自平衡二叉搜索树,它在插入和删除操作后,仍能保持树的平衡,从而保证了在最坏情况下,基本动态集合操作的时间复杂度为OlognO(log n)Ologn。这种高效性使得红黑树在许多应用中得到了广泛使用,例如C++的标准模板库(STL)中的map和set。RED,BLACK, _kv(kv){}这里通过枚举常量来控制红黑树每个节点的颜色。

2024-07-21 17:19:10 969

原创 【C++ —— AVL树】

int _bf;//存储当前节点的平衡因子//构造函数,_kv(kv),_bf(0){}这里使用了pair来存储节点的值,_bf表示改节点的平衡因子。

2024-07-19 19:47:29 1084

原创 【STL详解 —— map和set的使用】

set是按照一定次序存储元素的容器。默认情况下,std::set 使用 std::less 作为比较函数,这意味着它会使用小于运算符(

2024-07-17 23:01:11 1212

原创 【明解c语言中级篇第四章练习答案】

明解c语言中级篇第四章练习答案

2024-07-06 18:02:57 317

原创 【明解c语言中级篇第三章练习答案】

明解c语言中级篇第三章练习答案

2024-07-05 14:12:11 413

原创 【明解c语言中级篇 第二章练习答案】

明解c语言中级篇 第二章练习答案

2024-06-17 16:53:48 531

原创 【明解c语言中级篇 第一章练习答案】

明解C语言中级篇 第一章练习答案

2024-06-16 20:45:08 396

原创 【Linux 进程间通信 —— systemV 信号量】

在并发编程中,多个进程或线程可能同时访问共享资源,如果不加以限制,就会出现竞态条件(Race Condition)。竞态条件指的是多个进程或线程在相同的资源上进行读写操作时,由于执行顺序的不确定性,导致程序的行为出现异常或结果不一致的情况。

2024-05-16 16:37:03 935

原创 【Linux 进程间通信 —— systemV 共享内存】

因为共享内存其自身的特点,没有额外的拷贝过程,所以共享内存是进程最快的方式,所以共享内存并不保证通信的同步,数据在读取之后也不会清空,所以就能看到一直在之前所读到底字符串后面添加继续打印,。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据.此时再运行程序,即可发现关联该共享内存的进程数由0变成了1,而共享内存的权限显示也不再是0,而是我们设置的666权限。来创建了一个共享内存,打印出其key的十六进制数和shmid。

2024-05-16 16:23:03 1307

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除