
C++
文章平均质量分 90
C++基本知识
未知陨落
前路漫漫亦灿灿, 往事堪堪亦澜澜
展开
-
C++:特殊类设计及类型转换
拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此将拷贝构造函数与赋值运算符重载只声明不定义,并且将其访问权限设置为私有即可C++11扩展delete的用法,delete除了释放new申请的资源外,如果在默认成员函数后跟上 =delete,表示让编译器删除掉该默认成员函数。原创 2024-12-01 00:01:58 · 3062 阅读 · 59 评论 -
智能指针讲解
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内 存、文件句柄、网络连接、互斥量等等)的简单技术在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在 对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象原创 2024-11-29 00:01:09 · 1252 阅读 · 63 评论 -
C++异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了// 服务器开发中通常使用的异常继承体系public:{}protected:int _id;原创 2024-11-27 00:03:45 · 1765 阅读 · 57 评论 -
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++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2024-11-26 00:30:32 · 1655 阅读 · 41 评论 -
海量数据处理面试题
给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?方案1:将其中一个文件1的整数映射到一个位图中,读取另外一个文件2中的整数,判断在不在位图,在就是交集。消耗500M内存方案2:将文件1的整数映射到位图1中,将文件2的整数映射到位图2中,然后将两个位图中的数按位与。与之后为1的位就是交集。消耗内存1G原创 2024-11-25 07:15:00 · 1242 阅读 · 22 评论 -
位图和布隆过滤器
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概 率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存 在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间原创 2024-11-24 07:15:00 · 1142 阅读 · 35 评论 -
C++:模拟实现unordered_map和unordered_set
因为unordered_set和unordered_map要支持迭代器遍历,所以为哈希表中添加迭代器。unordered_set和unordered_map的实现通过调用哈希表即可。原创 2024-11-22 07:15:00 · 837 阅读 · 29 评论 -
数据结构——哈希
顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素 时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即 O(log2N),搜索的效率取决于搜索过程中元素的比较次数理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元素的存储位置与它的关键码之间能够建立 一一映射的关系,那么在查找时通过该函数可以很快找到该元素原创 2024-11-21 07:15:00 · 1712 阅读 · 35 评论 -
unordered_map和unordered_set的使用
unordered_set和unordered_map的使用与map和set基本相同,那么他们之间有什么区别和联系?都可以实现key和key/value的搜索场景,功能和使用基本相同.map和set底层使用红黑树,遍历出来是有序的,增删查改的时间复杂度是O(log2N).unordered_set和unordered_map底层使用的是哈希表,遍历出来是无序的,增删查改的时间复杂度是O(1).map和set是双向迭代器,unordered_set和unordered_map是单向迭代器原创 2024-11-20 07:15:00 · 1205 阅读 · 29 评论 -
C++:模拟实现STL的map和set
map和set底层都是通过红黑树实现的,但是set中存放是key,map中为key,value,我们不会去写两棵红黑树来实现他们,因为代码会重复,我们需要对红黑树内部进行改造为了可以同时处理set和map,我们传一个T过去,是set的时候为key,map为pair对于set和map他们的排序,set可以直接通过key来排序,而map的排序规则与set不同,先比较key,如果相同比较value,所以我们传一个KOfT原创 2024-11-19 07:15:00 · 1957 阅读 · 52 评论 -
C++STL容器——map和set
在初阶阶段,我们已经接触过STL中的部分容器,比如:vector、list、deque、 forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高原创 2024-11-15 07:15:00 · 1981 阅读 · 33 评论 -
C++----多态
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会 产生出不同的状态原创 2024-11-13 07:15:00 · 1206 阅读 · 3 评论 -
C++----继承
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用public:protected:// 姓名// 年龄protected:int _stuid;// 学号protected:int _jobid;// 工号int main()Student s;原创 2024-11-12 07:15:00 · 820 阅读 · 2 评论 -
模板进阶讲解
模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2024-11-11 07:30:00 · 887 阅读 · 0 评论 -
C++STL容器适配器——stack和queue
stack文档介绍stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下操作empty:判空操作back:获取尾部元素操作。原创 2024-11-10 18:07:38 · 1166 阅读 · 0 评论 -
C++:模拟实现STL的list
拷贝构造时我们需要创建一个新的节点,将值依次插入尾部即可,可以通过迭代器遍历,也可以通过范围for。对于erase来说,我们只需要找到删除节点的prev和next,将他们两个连接,删除当前节点即可。析构在这里我们用到clear函数,clear是清空所以数据,只留头节点,但是析构头节点也要释放。因为list是双向带头循环链表,所以我们只需要让头节点的prev和next都指向头节点。赋值是不需要创建新节点的,因为已经有了,所以只需要插入值即可。任意插入一个值,我们需要创建一个节点,并将其与前后节点连接。原创 2024-11-08 07:30:00 · 776 阅读 · 0 评论 -
C++STL容器详解——list
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代原创 2024-11-06 07:30:00 · 1146 阅读 · 0 评论 -
C++:模拟实现STL的vector
上一节中了解了vector中部分接口的使用,在这里我们模拟实现vector,为了避免与库中的起冲突,在这里使用命名空间原创 2024-11-05 07:30:00 · 593 阅读 · 0 评论 -
C++STL容器详解——vector
插入6时正常是因为插入5个元素时,容量扩为了6,所以再插入一个元素就不会有问题,当再次插入时,有7个元素,而容量只有6就会出问题,所以迭代器当对元素处理完需要的时候在定义,定义完后就不要对元素在进行空间上的处理,容易失效。当我们知道删除的元素在哪个位置时,可以通过迭代器删除,而不知道时,就需要find来查找,但是vector中没有find的接口,这时候就需要用到算法中的find。这是因为删除了it后迭代器就失效了,因为it的位置不对,想要正常实现就需要保存删除元素的下一个迭代器。原创 2024-11-04 07:30:00 · 1217 阅读 · 0 评论 -
C++:模拟实现STL的string
在前一节中我们了解了STL中string的部分接口,在这里我们实现一个自己的string类当我们实现自己的string类时,名字会与库内的冲突,所以可以选择用命名空间解决原创 2024-11-03 07:30:00 · 687 阅读 · 0 评论 -
C++STL容器详解——string
s1构造了一个空的string对象,s2构造了一个"hello",s3复制了s2的前两个字符,s4为一个拷贝构造,s5,s6时从一个位置开始复制几个字符,当复制的字符个数超过字符串时也不会报错,而s7中的npos在文档中的说明为。我们可以看到capacity逐渐增大,但是会有浪费,在这里是因为插入的少一些所以浪费不多,若是数据较大,浪费的会较多,那么是否有其他方式扩容?我们可以看到没有增容,reserve()的作用是直接开出一个特定大小的空间,但是其实并不一定是100,应为需要存放\0,会多开一些空间。原创 2024-11-02 07:30:00 · 2307 阅读 · 1 评论 -
模板初阶及STL简介
STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架原创 2024-11-01 07:30:00 · 1728 阅读 · 0 评论 -
C&C++内存管理
mallo申请一段空间,calloc申请一段空间并初始化所有位为0,realloc对已有的空间进行扩容C语言内存管理方式在C++中可以继续使用,但有些地方就无能为力,而且使用起来比较麻烦,因此C++又提出了自己的内存管理方式:通过new和delete操作符进行动态内存管理原创 2024-10-31 07:30:00 · 1016 阅读 · 0 评论 -
C++:日期类的实现
在前面几节的内容中,我们学习了类的基本知识,其中比较重要的是类的6个默认成员函数,在这节中我们主要对前几节的内容进行实际应用,实现一个简单的日期类。原创 2024-10-30 07:30:00 · 1223 阅读 · 0 评论 -
类与对象(三)
虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能将其称为对对象中成员变量 的初始化,构造函数体中的语句只能将其称为赋初值,而不能称作初始化。内部类是一个独立的类, 它不属于外部类,更不能通过外部类的对象去访问内部类的成员。用 static修饰的成员函数,称之为静态成员函数。注意:内部类就是外部类的友元类,参见友元类的定义,内部类可以通过外部类的对象参数来访 问外部类中的所有成员。友元函数可以直接访问类的私有成员,它是定义在类外部的普通函数,不属于任何类,但需要在 类的内部声明,声明时需要加。原创 2024-10-29 00:02:10 · 1143 阅读 · 0 评论 -
类与对象(二)类的6个默认成员函数
如果一个类中什么成员都没有,简称为空类空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员 函数默认成员函数:用户没有显式实现,编译器会生成的成员函数称为默认成员函数原创 2024-10-28 08:00:00 · 905 阅读 · 0 评论 -
类与对象(一)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。类体中内容称为类的成员:类中的变量称为类的属性或成员变量;原创 2024-10-27 08:00:00 · 1030 阅读 · 0 评论 -
C++入门
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{} 中即为命名空间的成员我们可以定义变量,函数,类型int val;原创 2024-10-26 08:30:00 · 1325 阅读 · 0 评论