
C++
文章平均质量分 94
Asher_qq
这个作者很懒,什么都没留下…
展开
-
【C++11 —— 智能指针】
内存泄漏是指程序在动态分配内存后,在不需要使用该内存时未能及时释放,结果导致内存空间被一直占用,直到程序运行结束。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,造成了内存的浪费。内存泄漏的危害:性能下降:内存泄漏会导致程序占用的内存越来越多,从而降低程序的运行速度。系统崩溃:严重的内存泄漏会导致程序占用的内存耗尽,从而引发系统崩溃或程序异常退出。资源浪费:内存泄漏会导致系统中的可用内存越来越少,从而浪费系统资源。代码示例。原创 2024-09-19 21:01:44 · 713 阅读 · 0 评论 -
【C++11 —— 异常】
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。在软件开发中,尤其是复杂系统的开发中,使用自定义异常体系可以帮助团队规范化异常管理。通过定义一套继承体系,所有抛出的异常都是特定基类的派生类,这样外层调用者可以通过捕获基类来处理所有相关的异常。使用自定义异常可以提供更具体的错误信息,使得代码的可读性和可维护性得到提升。原创 2024-09-17 16:12:30 · 1428 阅读 · 0 评论 -
【C++11 —— 线程库】
在C++11之前,涉及到多线程的问题,都是和平台相关的,比如windows和Linux下各有自己的接口,这使得代码的可移植性比较差。C++11的线程库提供了对多线程编程的支持,使得程序能够并发执行多个任务。从而不再需要依赖于第三方库,而且在原子操作中引入了原子类的概念。在使用标准库里的线程,必须包含头文件。线程 (std::thread)互斥量 (std::mutex)条件变量 (std::condition_variable)原子操作 (std::atomic)原创 2024-09-16 21:14:23 · 1051 阅读 · 0 评论 -
【C++11 —— 包装器】
function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。这些包装器主要用于提供一致且适合的接口以便于处理各种可调用对象,如函数、函数对象、lambda表达式等。其中:是被调用函数的返回类型。是被调用函数的参数类型列表。// func 可以存储接受两个 int 参数并返回 int 的可调用对象bind也是一种函数包装器,也叫做适配器。它可以接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表,C++中的bind本质是一个函数模板。F。原创 2024-09-13 21:58:07 · 980 阅读 · 0 评论 -
【C++11 ——— lambda表达式】
它使得函数可以作为参数传递,同时也可以作为返回值返回,从而增强了C++的函数式编程能力。Lambda表达式的语法简洁,能够有效减少代码的冗余,提高可读性和可维护性。原创 2024-09-10 21:11:37 · 776 阅读 · 1 评论 -
【C++11 ——— 可变参数模板】
/Args是一个模板参数包//args是一个函数参数包//声明一个参数包Args... args,这个参数包中可以包含0到任意数量个模板参数。中的Args...表示一个模板的参数包,它可以包含0个或多个模板参数。中的args...表示一个函数的参数包,允许函数接受任意数量的参数。...在参数包中的作用...用于声明一个可以包含多个参数的包,一般位于参数名称之前。...用于表示这个函数可以接受多个参数,一般位于参数名称之后。//Args是一个模板参数包//args是一个函数参数包。原创 2024-09-10 17:38:28 · 1438 阅读 · 0 评论 -
【C++11 ——— 类的新功能】
比如:我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字显示指定移动构造生成。这种在类内部就地初始化成员变量的方式,相比于在构造函数的初始化列表中进行初始化,可以使代码更加简洁和易读。当然,如果需要根据传入的参数进行不同的初始化,仍然需要在构造函数中进行处理。可以看到,即使我们没有在构造函数中显式初始化这些成员变量,它们仍然被赋予了在类内部指定的默认值。总之,C++11 引入的这种在类内部指定成员变量默认值的功能,大大简化了类的定义和初始化过程,提高了代码的可读性和可维护性。原创 2024-09-09 19:14:57 · 1091 阅读 · 0 评论 -
【C++11 ——— 右值引用和移动语义】
右值引用和移动语义原创 2024-09-09 18:41:17 · 788 阅读 · 0 评论 -
【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 · 1416 阅读 · 0 评论 -
【C++ —— 认识哈希和unordered_set、unordered_map的介绍及模拟】
哈希冲突(Hash Collision)是指两个或多个不同的键通过哈希函数映射到同一个位置。当哈希表发生冲突时,需要使用某种机制来解决冲突,确保所有键值对能够正确存储和查找。哈希函数的定义哈希函数(Hash Function)是将键值转换为哈希值的函数。哈希值用于确定键值在哈希表中的存储位置。一个好的哈希函数能均匀分布键,减少冲突,提高哈希表的性能。原创 2024-07-28 23:04:42 · 792 阅读 · 0 评论 -
【C++ —— 用一棵红黑树同时封装出map和set】
{}// 各种操作符重载模板参数T:表示树节点存储的数据类型。Ref:引用类型,用于 operator* 的返回类型。Ptr:指针类型,用于 operator-> 的返回类型。成员变量:_node:当前迭代器指向的节点。原创 2024-07-27 23:27:07 · 593 阅读 · 0 评论 -
【C++ —— 红黑树】
红黑树是一种自平衡二叉搜索树,它在插入和删除操作后,仍能保持树的平衡,从而保证了在最坏情况下,基本动态集合操作的时间复杂度为OlognO(log n)Ologn。这种高效性使得红黑树在许多应用中得到了广泛使用,例如C++的标准模板库(STL)中的map和set。RED,BLACK, _kv(kv){}这里通过枚举常量来控制红黑树每个节点的颜色。原创 2024-07-21 17:19:10 · 934 阅读 · 0 评论 -
【C++ —— AVL树】
int _bf;//存储当前节点的平衡因子//构造函数,_kv(kv),_bf(0){}这里使用了pair来存储节点的值,_bf表示改节点的平衡因子。原创 2024-07-19 19:47:29 · 1053 阅读 · 0 评论 -
【STL详解 —— map和set的使用】
set是按照一定次序存储元素的容器。默认情况下,std::set 使用 std::less 作为比较函数,这意味着它会使用小于运算符(原创 2024-07-17 23:01:11 · 1147 阅读 · 0 评论 -
【C++ —— 多态】
必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上= 0,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数更体现出了接口继承。class Car //包含纯虚函数所以叫抽象类public:virtual void Drive() = 0 //纯虚函数{}原创 2024-05-02 22:46:12 · 949 阅读 · 1 评论 -
【C++ 继承】
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了。原创 2024-04-28 17:24:25 · 1022 阅读 · 0 评论 -
【C++模板详解 —— 函数模板与类模板】
C++模板 ——— 函数模板和类模板原创 2024-04-18 20:30:05 · 1201 阅读 · 4 评论 -
【STL详解 —— priority_queue的使用与模拟实现】
priority_queue模拟原创 2024-04-16 21:05:13 · 2217 阅读 · 0 评论 -
【STL详解 —— stack和queue的模拟实现】
stack与queue的模拟原创 2024-04-16 20:14:52 · 586 阅读 · 0 评论 -
【STL详解 —— stack和queue的介绍及使用】
首先先介绍一下容器适配器。容器适配器是一种设计模式,用于在现有容器的基础上提供新的接口或修改现有接口,以满足特定的需求或者提供特定的功能。在C++中,容器适配器通常是通过组合一个已有的容器来实现的。在C++标准库中,容器适配器是通过模板类来实现的,它们提供了特定的接口,使得用户可以方便地使用已有的容器来实现不同的数据结构或算法。常见的容器适配器包括:stack(栈):提供了后进先出(LIFO)的数据结构,只允许在栈顶进行插入和删除操作。原创 2024-04-14 21:24:03 · 1105 阅读 · 1 评论 -
【STL详解 —— list的模拟实现】
如果 ListNode 的 _data 成员是内置类型(如 int, double, char 等),或者是一些简单的、不需要特殊资源管理的自定义类型(例如不涉及动态内存管理的类),那么编译器生成的默认析构函数足以正确清理 ListNode 对象。对于拷贝构造函数,我们先申请一个头结点,并让其前驱指针和后继指针都指向自己,然后将所给容器当中的数据,通过遍历的方式一个个尾插到新构造的容器后面即可。这样的封装提供了清晰的职责分离,并模仿了 STL 的设计哲学,每个类都具有特定的功能和目的。原创 2024-04-14 16:36:18 · 1008 阅读 · 0 评论 -
【STL详解 —— list的介绍及使用】
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。原创 2024-04-13 22:43:02 · 781 阅读 · 0 评论 -
【C++STL详解 —— vector的模拟实现】
start_finish和。这些成员变量共同管理着vector的存储空间和元素。_start:指向数组开始的指针,也就是vector中第一个元素的位置。_finish:指向数组中最后一个有效元素之后的位置,这个位置是新元素插入的地方。:指向分配的内存空间结束的位置之后的那个位置。这个位置标记了vector可以在不重新分配内存的情况下扩展到的最远位置。:从start到end_of_storage的区域是vector当前分配的整个内存空间,它决定了vector能够容纳的最大元素数量(容量)。原创 2024-04-04 17:57:55 · 855 阅读 · 0 评论 -
【C++STL详解 —— vector的介绍及使用】
在C++中,vector是一个非常重要和常用的容器类型,它是标准模板库(Standard Template Library, STL)的一部分。简单来说,vector是一个能够存储任意类型元素的动态数组,其大小可以在运行时自动扩展或缩减。与普通数组不同,vector可以根据需要动态地增加或减少元素,而不需要程序员手动管理内存。vector是一个模板类,意味着它可以用来存储任意类型的对象。例如,vector用于存储整数,vector用于存储字符串。vector自动管理其存储的元素的内存。原创 2024-04-04 14:44:48 · 1185 阅读 · 0 评论 -
【C++STL详解 —— string类的模拟实现】
【代码】【C++STL详解 —— string类的模拟实现】原创 2024-03-09 12:11:57 · 497 阅读 · 1 评论 -
【C++STL详解 —— string类】
string s();//构造一个空字符串//复制s所指向的字符序列//复制s所指向的字符序列的前n个字符//生成n个c字符的字符串//生成str的复制//复制str中字符位置pos开始并且跨越len个字符的部分。原创 2024-03-06 20:36:31 · 2448 阅读 · 10 评论 -
【C++ 模板初阶】
class 类模板名// 类内成员定义下面来实现一个模板Vector,并且在内里定义的函数如果要在内外定义,需要加模板参数列表。public:,_size(0)//使用析构函数,在类内声明,内外定义~Vector();除此之外,类模板不支持分离编译,即声明在xxx.h文件中,而定义却在xxx.cpp文件中。原创 2024-02-27 19:17:47 · 997 阅读 · 1 评论 -
【C/C++内存管理详解】
new的原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造delete的原理在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请在申请的空间上执行N次构造函数delete[]的原理在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理。原创 2024-02-15 17:44:29 · 1098 阅读 · 3 评论 -
【C++类与对象(下)】
关键字explicit来修饰构造函数。原创 2024-02-10 13:03:52 · 998 阅读 · 0 评论 -
【C++类与对象(中)】
首先我们先了解一下:在C++中,数据类型可以分为。原创 2024-01-30 16:06:26 · 861 阅读 · 0 评论 -
【C++类与对象(上)】
首先来观察一下类的结构// 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号class为定义类的关键字className为类的名字{ } 中为类的主体注意:类定义结束时后面的分号;不能省略类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者成员函数。声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。类声明放在.h文件中成员函数定义放在.cpp文件中,注意:成员函数名前需要加类名.// 我们看看这个函数,是不是会产生歧义。原创 2024-01-27 17:02:02 · 932 阅读 · 0 评论 -
【C++入门基础】
C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。为了解决软件危机, 20世纪80年代, 计算机界提出了:面向对象)思想,支持面向对象的程序设计语言应运而生。1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。C++是基于C语言而产生的,它既可以进行C语言的过程化程序设计,又可以进行。原创 2024-01-26 16:36:10 · 827 阅读 · 6 评论