
C++从入门到进阶
文章平均质量分 97
在c语言的基础上学习C++
大耳朵土土垚
越努力,越幸运。
展开
-
【C++11】深入理解与应用右值引用
区分右值还是左值的关键在于是否可以取地址,对于左值的引用是左值引用,右值的引用是右值引用,它们都是给对象取别名。const左值引用可以引用右值,右值引用可以引用move后的左值;右值一般是临时对象,是将亡值,所以我们就可以在类中专门写一个供右值对象使用的拷贝构造和赋值重载函数,来置换它们的资源,从而减少不必要的深拷贝,我们将这两个函数称为移动构造和移动赋值。原创 2024-09-04 21:44:32 · 1368 阅读 · 113 评论 -
【C++11】入门基础
C++11是C++编程语言的一个重要版本,它于2011年发布。相比于C++98/03C++11给C++带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。C++11能更好地用于系统开发和库开发、语法更加泛化和简单化,更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率,公司实际项目开发中也用得比较多,所以我们要作为一个重点去学习。原创 2024-08-18 18:49:11 · 1659 阅读 · 155 评论 -
【C++深度探索】unordered_set、unordered_map封装
unordered_map和unordered_set的底层都是使用哈希表来实现的,然后在外面套了一层壳,为了能够更好的实现代码复用,我们对哈希表进行了很多修改还使用了仿函数,封装了普通迭代器和const迭代器等,最终成功对unordered_map和unordered_set实现了封装原创 2024-08-16 19:00:00 · 2451 阅读 · 106 评论 -
【C++深度探索】哈希表介绍与实现
在C++中,哈希(Hash)是一种常用的数据结构技术,用于将数据转换为固定长度的哈希值。哈希值是唯一的,可以用于快速查找、比较和索引。原创 2024-08-14 22:20:01 · 1252 阅读 · 93 评论 -
【C++深度探索】红黑树实现Set与Map的封装
红黑树和AVL树都是高效的平衡二叉树,增删改查的时间复杂度都是O(log2Nlog_2 Nlog2N),但是红黑树不追求绝对平衡,其只需保证最长路径不超过最短路径的2倍,相对AVL树而言,降低了插入和旋转的次数,所以在经常进行增删的结构中性能比AVL树更优,而且红黑树实现比较简单,所以实际运用中红黑树更多。今天我们就可以利用之前实现过的红黑树来对C++STL库中的set和map进行模拟实现。原创 2024-08-08 00:37:28 · 1835 阅读 · 111 评论 -
【C++深度探索】红黑树的底层实现机制
红黑树与AVL树一样,也是一种自平衡的二叉搜索树,它在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black,通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。因为红黑树也是二叉搜索树,其他的类似查找节点,析构函数和构造函数都与二叉搜索树类似,对于删除节点,可按照二叉搜索树的方式将节点删除,然后再进行调整,大家有兴趣可以自己查找了解一下原创 2024-08-05 01:54:01 · 1978 阅读 · 106 评论 -
【C++深度探索】AVL树的底层实现机制
AVL树就是在二叉搜索树的基础上引入了平衡因子,因此AVL树也可以看成是二叉搜索树.一棵AVL树或者是空树,或者是具有以下性质的二叉搜索树:它的左右子树都是AVL树,左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1).接下来我们继续学习AVL树底层实现的部分机制.原创 2024-07-29 23:53:15 · 1860 阅读 · 104 评论 -
【C++深度探索】AVL树与红黑树的原理与特性
二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现。而AVL树和红黑树是常用的自平衡二叉搜索树。它们在插入、删除和查找操作上具有较好的性能,并且在各种应用场景中被广泛使用。原创 2024-07-27 14:55:32 · 3288 阅读 · 102 评论 -
【C++深度探索】map与set的基础介绍与实用指南
关联式容器,关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高。根据应用场景的不同,STL总共实现了两种不同结构的关联式容器:树型结构与哈希结构。原创 2024-07-22 19:52:09 · 2130 阅读 · 108 评论 -
【C++深度探索】二叉搜索树的全面解析与高效实现
二叉搜索树(BST,Binary Search Tree)又称二叉排序树,是一种特殊的二叉树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树原创 2024-07-18 14:02:12 · 2695 阅读 · 100 评论 -
【C++深度探索】全面解析多态性机制(二)
C++多态实现有两个条件——一是基类的指针或引用调用虚函数,另一个是基类中有虚函数并且在派生类中实现虚函数重写;这两个条件缺一不可,这与多态实现的底层原理有关。原创 2024-07-13 21:47:28 · 2992 阅读 · 82 评论 -
【C++深度探索】全面解析多态性机制(一)
在C++中,多态(Polymorphism)是指通过基类指针或引用来访问派生类对象的一种机制。简单来说,它允许我们在基类类型的指针或引用上调用派生类对象的成员函数。通俗来说,就是多种形态,或者说完成某个行为时,当不同的对象去完成会产生出不同的状态。例如:买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;军人买票时是优先买票。不同的对象去完成同一个行为——买票,会产生不同的状态。在代码中的具体体现则依赖于虚函数在基类中,可以将某个成员函数声明为虚函数,而在派生类中重写该函数。原创 2024-07-11 11:17:45 · 3047 阅读 · 95 评论 -
【C++深度探索】继承机制详解(二)
菱形继承是指在C++中使用多重继承时,出现了多个派生类继承同一个基类,而最终有一个类同时继承了这些派生类,形成了一个菱形的继承结构。原创 2024-07-08 22:26:59 · 3288 阅读 · 100 评论 -
【C++深度探索】继承机制详解(一)
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类或子类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。原创 2024-06-30 22:38:22 · 3740 阅读 · 102 评论 -
【C++】模板进阶
模板的特化是指为具体类型或具体参数提供专门的实现。通常情况下,模板的特化是为了解决某些特殊类型或参数的处理需求,使得模板能更好地适应不同的情况。函数模板的特化步骤:必须要先有一个基础的函数模板关键字template后面接一对空的尖括号函数名后跟一对尖括号,尖括号中指定需要特化的类型函数形参表: 必须要和模板函数的基础参数类型完全相同,如果不同编译器可能会报一些奇怪的错误。注意:一般情况下如果函数模板遇到不能处理或者处理有误的类型,为了实现简单通常都是将该函数直接给出。原创 2024-06-07 05:30:00 · 3331 阅读 · 180 评论 -
【C++】优先级队列介绍与模拟实现
优先级队列是一种特殊的队列,其中的元素都被赋予了优先级。元素的优先级决定了它们在队列中的顺序。在优先级队列中,元素按照优先级从高到低的顺序出队列。优先级队列可以通过不同的数据结构来实现,常用的有二叉堆、二叉搜索树和斐波那契堆等。优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue。注意:默认情况下priority_queue是大堆。原创 2024-06-05 11:19:59 · 3170 阅读 · 106 评论 -
【C++】STL:栈和队列模拟实现
C++中的stack(栈)和queue(队列)是两种常见的数据结构,用于存储和管理数据。栈是一种先进后出(LIFO)的数据结构,类似于我们平时堆叠的一摞书,只能在顶部进行操作。在C++中,可以使用std::stack模板类来创建栈。栈的主要操作包括压入(push)元素到栈顶、弹出(pop)栈顶元素以及获取栈顶元素等。队列是一种先进先出(FIFO)的数据结构,类似于排队等候的人群,新元素插入队尾,最早插入的元素在队头。在C++中,可以使用std::queue模板类来创建队列。原创 2024-06-03 06:00:00 · 2492 阅读 · 30 评论 -
【C++】List模拟实现
C++中的list是一种双向链表(doubly linked list)的实现。它是C++标准库中的一种容器,可以存储一系列元素,并且允许在任意位置插入、删除和访问元素。对于双向链表有疑问的可以点击查看数据结构——带头双向循环链表详解对于list大部分和前面学习过的vector类似,关键点在于理解list的迭代器的封装以及const迭代器,还有list实现包括了三个类,它们分别都有类模板,容易绕晕,需要好好理解清楚原创 2024-05-31 22:05:14 · 3205 阅读 · 115 评论 -
【C++】Vector的简易模拟与探索
C++STL标准库中vector的模拟实现了,在实现过程中,我们使用了动态内存分配来实现vector的大小动态调整,并通过指针来管理内存。我们还实现了一些常用的成员函数,如push_back、pop_back、at等,以及一些运算符重载,如[]、=等。通过实现这个简单的vector类,我们不仅加深了对vector容器的理解,还学习了一些C++的底层原理和技巧。同时我们也遇见并解决了一些问题比如迭代器失效,深浅拷贝原创 2024-05-27 13:14:34 · 2522 阅读 · 124 评论 -
【C++】探索STL中的高效容器:vector
C++中的vector是标准模板库(STL)提供的一种容器,用于存储和操作动态数组。功能类似于我们之前学习的顺序表,它可以在运行时动态调整大小,与C++内置的数组相比,提供了更多的功能和便利性。原创 2024-05-20 20:07:06 · 3397 阅读 · 154 评论 -
【C++】string类模拟实现:探索其内部机制
string类的模拟实现最主要是实现string类的**构造、拷贝构造、赋值运算符重载**以及**析构函数**,以下是对模拟实现string类变量以及函数的封装,自主实现string类的所有内容原创 2024-05-16 22:30:50 · 3296 阅读 · 130 评论 -
【C++】 string类:应用与实践
①使用getline函数(后文有解析)获取一行字符串;②使用rfind函数(使用方法在后文)从字符串末尾往前找到第一个空格,返回该空格的位置;③使用size函数得到整个字符串长度,减去之前空格的位置再-1,得出最后一个单词的长度。//获取一行字符串//从后往前遍历找到空格的位置//计算最后一个单词长度//打印长度🥳🥳getline使用方法getline是C++中用于从输入流中读取一行文本的函数。原创 2024-05-13 22:03:37 · 2346 阅读 · 130 评论 -
【C++】学习string类:字符操作的艺术
C++的string类是用于处理字符串的标准库类。它定义在头文件中,并位于std命名空间下。C++的string类提供了一系列成员函数和操作符,用于操作和处理字符串。在使用string类时,必须包含#include头文件以及详情可以点击链接查看——string类文档介绍总的来说,C++的string类提供了丰富的方法和操作符,方便我们对字符串进行各种操作。使用string类可以避免手动处理字符串的繁琐和容易出错的问题,提高代码的可读性和可维护性。原创 2024-05-09 21:37:44 · 2289 阅读 · 99 评论 -
【C++】模板初阶:泛型编程的起点
使用C++模板,可以定义函数模板和类模板。函数模板是一种通用的函数定义,可以用于处理多种类型的输入参数。例如,可以编写一个通用的排序函数模板,可以用于排序整数、浮点数、字符等类型的数据。类模板是一种通用的类定义,它可以用于创建具有相似结构和行为的多种类对象。例如,可以编写一个通用的容器类模板,可以用于存储不同类型的数据。C++中的模板是一种强大的机制,可以实现泛型编程,提高代码的可重用性和灵活性。它是C++中重要且常用的特性之一。原创 2024-05-05 16:45:08 · 2967 阅读 · 99 评论 -
【C++】探索C++内存管理:机制揭秘与内存安全
C++使用的内存管理方式:通过new和delete操作符进行动态内存管理。相较于C语言得maloc,new不用计算开辟空间的大小也不需要进行类型的强制转换,还可以进行初始化;此外new和delete对于自定义类型除了开辟空间和释放空间,还可以自动调用它得构造函数和析构函数;通过合理的内存管理,可以提高程序的性能和稳定性,减少内存相关问题的发生。原创 2024-05-02 16:33:20 · 3123 阅读 · 99 评论 -
【C++类和对象】探索static成员、友元以及内部类
static静态成员在一些场景下可以用来保存全局数据或提供公共的工具函数,也可以用来实现单例模式等。但需要注意,在多线程环境下操作静态成员时需要考虑线程安全性。友元关系提供了一种在需要的情况下访问其他类的私有成员的机制。但由于友元关系破坏了封装性,一般不使用。内部类是指在一个类的内部定义的另一个类。内部类可以直接访问外部类的成员,包括私有成员,而外部类则不能直接访问内部类的成员。。原创 2024-04-25 09:36:55 · 2935 阅读 · 103 评论 -
【C++类和对象】初始化列表与隐式类型转换
初始化列表是C++类和对象中初始化成员变量的方式,在一些情况下可以提高效率和代码可读性。隐式类型转换在某些情况下可以方便地进行类型转换,但有时也会导致意外的结果或者不可预测的行为,所以C++提供了explicit来禁止隐式类型转换。原创 2024-04-22 16:25:12 · 2717 阅读 · 90 评论 -
【C++类和对象】const成员函数及流插入提取
在类和对象的成员函数中只读函数可以加const,因为其内部不涉及修改生成;取地址与const取地址这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载;此外流插入运算符和流提取运算符通常都是以友元函数的形式定义在类的声明内部,这允许它们访问类的私有成员。原创 2024-04-21 15:27:02 · 2539 阅读 · 89 评论 -
【C++类和对象】日期类的实现
以上只是一个简单的日期类示例,实际的日期类可能还包括其他功能,例如日期的格式化等操作。这里只是提供了一个起点,大家可以根据自己的需求对日期类进行扩展原创 2024-04-20 11:33:08 · 2874 阅读 · 89 评论 -
【C++类和对象】拷贝构造与赋值运算符重载
对于C++类和对象的拷贝构造函数与运算符重载它们一个是在创建对象时使用另一个创建好的对象来进行赋值(拷贝构造),另一个则是在两个已经创建好的对象之间进行赋值(赋值运算符重载);此外它们两个如果没有在类中显式实现编译器都会默认生成对应的函数,而此时默认生成的函数对于内置类型会进行浅拷贝,对于自定义类型则会调用它的拷贝构造函数或赋值运算符重载;所以如果是简单的日期类,类中未涉及到资源管理,就可以使用编译器默认生成的函数,对于类含有指针或动态分配的资源比如栈类就不能依靠编译器要自己显式实现对应的函原创 2024-04-17 21:31:29 · 3095 阅读 · 110 评论 -
【C++类和对象】构造函数与析构函数
构造函数和析构函数都是特殊的成员函数,构造函数在对象被创建时自动调用,它的主要作用是初始化对象的数据成员;而C++析构函数在对象销毁时会自动调用,其主要作用是在对象销毁时执行清理操作,例如释放动态分配的内存和关闭文件。原创 2024-04-14 13:01:11 · 3035 阅读 · 45 评论 -
【C++类和对象】类和对象的引入
C++中通过类可以将数据以及操作数据的方法进行完美结合,通过访问权限可以控制哪些方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一件事物的认知。原创 2024-04-13 12:32:25 · 2423 阅读 · 113 评论 -
【C++入门】内联函数、auto与基于范围的for循环
auto是一个C++11引入的关键字,用于自动推导变量的类型。通过使用auto关键字,编译器可以根据变量的初始化表达式自动推断出其类型。使用auto关键字可以简化变量类型的声明,特别是当变量的类型相当复杂或较长时。原创 2024-04-10 19:26:47 · 3559 阅读 · 109 评论 -
【C++入门】缺省参数、函数重载与引用
缺省参数函数重载以及引用的出现是为了补充C语言语法的不足以及对C语言设计不合理的地方进行优化,引用的出现大大降低了我们学习C语言时相对于指针的难度,也便于我们更好的理解和使用原创 2024-04-07 22:47:37 · 2701 阅读 · 119 评论 -
【C++入门】关键字、命名空间以及输入输出
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。// tutu是命名空间的名字,一般开发中是用项目名字做命名空间名。// 1. 正常的命名空间定义// 命名空间中可以定义变量/函数/类型//(1)命名空间中定义变量//(2)命名空间中定义函数//(3)命名空间中定义类型int val;//2. 命名空间可以嵌套int a;int b;//嵌套N2int c;int d;原创 2024-04-05 18:04:42 · 2448 阅读 · 91 评论 -
【C++入门】初识C++
✨✨ C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的程序,需要高度的抽象和建模时,C语言则不合适。✨✨ 为了解决软件危机, 20世纪80年代, 计算机界提出了OOP(object oriented programming:面向对象)思想,支持面向对象的程序设计语言应运而生。✨✨1982年,Bjarne Stroustrup博士在C语言的基础上引入并扩充了面向对象的概念,发明了一种新的程序语言。为了表达该语言与C语言的渊源关系,命名为C++。原创 2024-04-03 22:59:55 · 2560 阅读 · 42 评论