C++
文章平均质量分 81
C++
杰深入学习计算机
莫道桑榆晚,为霞尚满天。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【C++】IO流
在C++中,可以使用stringstream类对象来避开此问题。在程序中如果想要使用stringstream,必须要包含头文件。在该头文件下,标准库三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作,本文主要介绍stringstream。1.将数值类型数据格式化为字符串int main()string sa;// 将一个整形变量转化为字符串,存储到string类对象中s > sa;原创 2023-08-01 16:51:58 · 217 阅读 · 0 评论 -
【C++】类型转换
每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,原创 2023-08-01 15:51:09 · 309 阅读 · 0 评论 -
【C++】特殊类的设计
为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时期,七国之间经常打仗,就发现打仗也是。原创 2023-08-01 15:29:27 · 333 阅读 · 0 评论 -
【C++11】智能指针
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。原创 2023-07-31 16:29:22 · 389 阅读 · 0 评论 -
C++11 线程库
/ 声明一个类型为T的原子类型变量t注意:原子类型通常属于"资源型"数据,多个线程只能访问单个原子类型的拷贝,原创 2023-07-30 19:59:37 · 211 阅读 · 0 评论 -
C++11(4)——包装器
function包装器 也叫作适配器。C++中的function本质是一个类模板,也是一个包装器。那么我们来看看,我们为什么需要function呢?包装器可以很好的解决上面的问题有了包装器,如何解决模板的效率低下,实例化多份的问题呢?原创 2023-07-17 14:54:29 · 245 阅读 · 0 评论 -
C++异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;public:{}原创 2023-07-18 08:55:10 · 130 阅读 · 0 评论 -
C++11(3)——lambda表达式
实际在底层编译器对于lambda表达式的处理方式,完全就是按照函数对象的方式处理的,即:如果定义了一个lambda表达式,编译器会自动生成一个类,在该类中重载了operator()。通过上述例子可以看出,lambda表达式实际上可以理解为无名函数,该函数无法直接调用,如果想要直接调用,可借助auto将其赋值给一个变量。函数对象,又称为仿函数,即可以想函数一样使用的对象,就是在类中重载了operator()运算符的类对象。都要重新去写一个类,如果每次比较的逻辑不一样,还要去实现多个类。随着C++语法的发展,原创 2023-07-17 10:02:42 · 127 阅读 · 0 评论 -
C++11(2)——右值引用和移动语义
左值引用只能引用左值,不能引用右值。但是const左值引用既可引用左值,也可引用右值。原创 2023-07-17 09:31:23 · 174 阅读 · 0 评论 -
C++11(1)——新增用法零碎总结
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2023-07-16 22:02:58 · 231 阅读 · 0 评论 -
哈希的应用(2)——布隆过滤器
我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉那些已经看过的内容。用服务器记录了用户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那些已经存在的记录。比如:删除上图中"tencent"元素,如果直接将该元素所对应的二进制比特位置0,“baidu”元素也被删除了,因为这两个元素在多个哈希函数计算出的比特位上刚好有重叠。,插入元素时给k个计数器(k个哈希函数计算出的哈希地址)加一,删除元素时,给k个计数器减一,X越大,发生冲突的概率越小。原创 2023-07-15 14:25:57 · 167 阅读 · 0 评论 -
哈希的应用(1)——位图
2^30大约等于10亿1byte=8bit--一个字节等于八个比特位左移操作符原创 2023-07-15 00:07:47 · 274 阅读 · 0 评论 -
模拟实现unordered_set和unordered_map
/ V: 不同容器V的类型不同,如果是unordered_map,V代表一个键值对,如果是。// KeyOfValue: 因为V的类型不同,通过value取key的方式就不同,详细见。// Hash: 哈希函数仿函数对象类型,哈希函数使用除留余数法,unordered_map/set的实现。3. 增加通过key获取value操作。unordered_set,V 为 K。需要将Key转换为整形数字才能取模。1. 模板参数列表的改造。// K:关键码类型。2. 增加迭代器操作。原创 2023-07-13 18:32:39 · 171 阅读 · 0 评论 -
unordered系列的底层结构——哈希表
桶的个数是一定的,随着元素的不断插入,每个桶中元素的个数不断增多,极端情况下,可能会导致一个桶中链表节点非常多,会影响的哈希表的性能,因此在一定条件下需要对哈希表进行增容,那该条件怎么确认呢?开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子集合,是通过散列函数Hash(x)对元素的关键码 key 进行计算得到的位置,m是表的大小。,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。因此,在元素个数刚好等于桶的个数时,可以给哈希表增容。原创 2023-07-13 10:47:47 · 145 阅读 · 0 评论 -
unordered系列关联式容器
在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同。map和set底层结构是红黑树,而unordered_map和unordered_set底层结构是哈希表。unordered_map介绍。原创 2023-07-13 08:16:18 · 129 阅读 · 0 评论 -
map和set的封装
map和set用红黑树来实现的;红黑树的前三个模板参数分别表示:得到key的类型,结点存储的类型,map定义红黑树的参数是:key类型,pair,得到K类型。上一个文章已经大体实现了红黑树的结构,我们只需要将相应的修改相关细节即可!set定义红黑树的参数是:key类型,key类型,得到key类型。++操作——二叉树遍历的非递归实现。哪一个类型来进行比较。原创 2023-07-08 12:03:36 · 171 阅读 · 0 评论 -
红黑树的介绍
思考:在节点的定义中,为什么要将节点的默认颜色给成红色的?答案:插入红色会可能会影响性质3,而插入黑色必定会影响性质4;影响了性质3容易修改,而影响性质4,难以修改,所以我们要默认插入的结点为红色,在对相应的情况进行调整!原创 2023-07-07 18:12:21 · 228 阅读 · 0 评论 -
平衡搜索二叉树——AVL树
/ 该节点的左孩子 AVLTreeNode < T > * _pRight;// 该节点的右孩子 AVLTreeNode < T > * _pParent;// 该节点的双亲 T _data;int _bf;// 该节点的平衡因子 };验证其为二叉搜索树如果中序遍历可得到一个有序的序列,就说明为二叉搜索树验证其为平衡树每个节点子树高度差的绝对值不超过1(注意节点中如果没有平衡因子)节点的平衡因子是否计算正确。原创 2023-07-07 06:49:59 · 200 阅读 · 0 评论 -
C++ set和map使用
T: set中存放元素的类型,实际在底层存储的键值对。Compare:set中元素默认按照小于来比较Alloc:set中元素空间的管理方式,使用STL提供的空间配置器管理。原创 2023-07-05 12:30:00 · 172 阅读 · 0 评论 -
二叉树进阶——搜索二叉树
插入的结点位置比是叶子结点。原创 2023-07-02 20:23:53 · 192 阅读 · 0 评论 -
初识EasyX图形库
这个函数用来初始化绘图窗口函数声明:int width,width:绘图窗口的宽度height:绘图窗口的高度flag:绘图窗口的样式,默认为NULL。可为一下值返回值:返回新创建绘图窗口的句柄。原创 2023-06-23 23:40:57 · 4228 阅读 · 0 评论 -
C++多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写在虚函数的后面写上 =0 ,则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,生类才能实例化出对象。原创 2023-05-24 17:21:55 · 726 阅读 · 0 评论 -
C++的继承
继承原创 2023-05-22 23:13:42 · 386 阅读 · 0 评论 -
C++模板进阶
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。【优点】模板复用了代码,节省资源,更快的迭代开发,C++的标准模板库(STL)因此而产生增强了代码的灵活性【缺陷】模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息非常凌乱,不易定位错误。原创 2023-05-21 17:45:03 · 540 阅读 · 0 评论 -
C++的priority_queue
优先队列是一种堆,默认是大根堆,可以通过greater的仿函数可以建立小根堆empty():检测容器是否为空size():返回容器中有效元素个数front():返回容器中第一个元素的引用push_back():在容器尾部插入元素pop_back():删除容器尾部元素标准容器类vector和deque满足这些需求。默认情况下,如果没有为特定的priority_queue类实例化指定容器类,则使用vector。原创 2023-05-19 23:05:58 · 402 阅读 · 0 评论 -
C++的stack和queue
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。deque(双端队列):是一种双开口的"连续"空间的数据结构,双开口的含义是:可以在头尾两端进行插入和删除操作,且时间复杂度为O(1),与vector比较,头插效率高,不需要搬移元素;与list比较,空间利用率比较高。原创 2023-05-19 21:37:34 · 416 阅读 · 0 评论 -
C++的list使用
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。与其他序列式容器相比,原创 2023-05-18 23:48:43 · 370 阅读 · 0 评论 -
C++的vector使用
vector是和数组类似的序列容器,它可以改变大小和数组一样,vector用连续的存储器来存储元素,这意味着它存储的元素也可以通过用常规的指针偏移来访问,和数组一样有效率。但是和数组不一样的是,vector的大小可以动态分配,其中它们的存储通过容器来自动解决。本质上,vector用一个动态的分配数组来存储它们的元素。这个数组可能需要分配空间,为了增长空间大小,在插入新的元素的时候,这意味着重新申请一个新的数组和拷贝所有的元素到新的数组里面。原创 2023-05-16 22:59:40 · 795 阅读 · 0 评论 -
C++string类的模拟实现
在构造时,将资源的计数给成1,每增加一个对象使用该资源,就给计数增加1,当某个对象被销毁时,先给该计数减1,然后再检查是否需要释放资源,如果计数为1,说明该对象时资源的最后一个使用者,将该资源释放;如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以当继续对资源进项操作时,就会发生发生了访问违规。就像一个家庭中有两个孩子,但父母只买了一份玩具,两个孩子愿意一块玩,则万事大吉,万一不想分享就你争我夺,玩具损坏。原创 2023-05-13 13:18:46 · 511 阅读 · 0 评论 -
C++的string类使用介绍
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。在OJ中,有关字符串的题目基本以string类的形式出现,而且在常规工作中,为了简单、方便、快捷,基本都使用string类,很少有人去使用C库中的字符串操作函数。原创 2023-05-12 22:45:40 · 547 阅读 · 0 评论 -
STL介绍
STL介绍原创 2023-05-12 21:10:25 · 94 阅读 · 0 评论 -
C++模板初阶
class 类模板名// 类内成员定义。原创 2023-05-11 17:12:09 · 577 阅读 · 0 评论 -
C/C++的内存管理
注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。new实现原理调用operator new函数申请空间在申请的空间上执行构造函数,完成对象的构造delete的原理在空间上执行析构函数,完成对象中资源的清理工作调用operator delete函数释放对象的空间new T[N]的原理调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请。原创 2023-05-11 16:42:23 · 542 阅读 · 0 评论 -
C++类和对象(思维导图小结)
注意:类型要和实体对象的类型相同const 类型&接受1.增强代码的复用性2.提高性能围内用于迭代的变量,第二部分则表示被迭代的范围。这五个操作符能重载函数返回的时候依据情况用引用返回:用拷贝构造初始化一个对象,不要用赋值运算符重载进行赋值:可以的话,用匿名对象做返回值。原创 2023-05-09 11:35:27 · 1189 阅读 · 0 评论 -
C++类和对象(6)
概念:如果一个类定义在另一类的内部,这个内部类就叫做内部类。内部类是一个独立的类,它不属于外部类,更不能通过外部类的对象去访问内部类的成员。类是对某一类实体(对象)来进行描述的,描述该对象具有那些属性,那些方法,描述完成后就形成了一种新的自定义类型,才用该自定义类型就可以实例化具体的对象。可以直接访问类的成员,它是定义在类外部的普通函数,不属于任何类,但需要在类的内部声明,声明的时候加上friend关键字。注意:内部类就是外部类的友元类,内部类可以通过外部类的对象参数来访问外部类中的所有成员。原创 2023-05-07 17:24:50 · 449 阅读 · 0 评论 -
C++类和对象(5)
将const修饰的“成员函数”称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。通过函数重载,可以对流插入运算符和流提取运算符进行运算符重载。这两个运算符一般不需要重载,使用编译器生成的默认取地址的重载即可,只有特殊情况,才需要重载,比如想让别人获取到指定的内容!③ 为了一行实现多次,函数值返回相应的类型,流插入返回类型:ostream&;① 流提取和流插入的运算符重载,建议不要写成成员函数;原创 2023-05-05 22:40:55 · 406 阅读 · 0 评论 -
C++类和对象(4)
注意:在编译器生成的默认拷贝构造函数中,内置类型是按照字节方式直接拷贝的,而自定义类型是调用其拷贝构造函数完成拷贝的。原创 2023-04-27 16:45:51 · 440 阅读 · 0 评论 -
C++类和对象 (3)
析构函数:与构造函数功能相反,析构函数不是完成对对象本身的销毁,局部对象销毁工作是由编译器完成的。而对象在销毁时会自动调用析构函数,完成对象中资源的清理工作。对于Date类,可以通过 Init 公有方法给对象设置日期,但如果每次创建对象时都调用该方法设置信息,未免有点麻烦,那能否在对象创建时,就将信息设置进去呢?注意:C++11 中针对内置类型成员不初始化的缺陷,又打了补丁,即:内置类型成员变量在类中声明时可以给默认值。是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并。原创 2023-04-22 20:10:55 · 435 阅读 · 0 评论 -
C++的类和对象(2)
C++中通过类可以将数据以及操作数据方法进行完美结合,通过访问权限可以控制哪些方法在类外可以被调用,即封装,在使用时就像使用自己的成员一样,更符合人类对一切事物的认识。缺陷:每个对象中成员变量是不同的,但是调用同一份函数,如果按照此种方式存储,当一个类创建多个对象时,每个对象中都会保存一份代码,相同代码保存多次,浪费空间。结构体重只能定义存放数据的结构,操作数据的方法不能放在结构体中,即数据和操作数据的方式都是分离开的,而且实现上相当复杂一点,涉及到大量指针操作,稍微不注意可能就会出错。原创 2023-04-22 19:18:21 · 585 阅读 · 0 评论 -
C++的类和对象(1)
/ 类体:由成员函数和成员变量组成// 一定要注意后面的分号【说明】class是定义类的关键字,className是类的名字,{}中为类的主体,注意{}最后存在分号,不能省略。类中内容称为类的成员:类中的变量称为类的属性或成员变量;类中的函数称为类的方法或者是成员函数。声明和定义全部放在类体中,需注意:成员函数如果在类中定义,编译器可能会将其当成内联函数处理。类中函数的声明和定义都在类中的话,如果函数里面的指令少,就可能会是内联函数。【类的成员命名建议】原创 2023-04-21 20:11:54 · 429 阅读 · 0 评论
分享