
C++
文章平均质量分 87
The August
这个作者很懒,什么都没留下…
展开
-
C++的类型转换
每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。dynamic_cast用于将一个父类对象的指针/引用转换为子类对象的指针或引用(动态转换)reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,向上转型子类对象指针/引用->父类指针/引用(不需要转换,赋值兼容规则)因此C++提出了自己的类型转化风格,注意因为。...原创 2022-07-28 17:19:33 · 670 阅读 · 42 评论 -
C++-智能指针
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:智能指针的原理std::auto_ptrauto_ptr的实现原理:注:unique_ptr的实现原理注意:C++98 – 2011年中原创 2022-07-27 17:36:37 · 498 阅读 · 42 评论 -
C++-异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常(对象类型太多,无法捕获),那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了(异常的抛出和匹配原则5)//服务器开发中通常使用的异常继承体系classException{public};public";";};public";}};cin>>i;...原创 2022-07-24 20:26:53 · 360 阅读 · 38 评论 -
C++11新特性详解
相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的修正,这使得C++11更像是从C++98/03中孕育出的一种新语言。相比较而言,C++11能更好地用于系统开发和库开发、语法更加泛华和简单化、更加稳定和安全,不仅功能更强大,而且能提升程序员的开发效率。在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。thread在线文档说明stdreturn0。...原创 2022-07-23 20:11:24 · 9587 阅读 · 31 评论 -
C++的IO流
使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据(其单位可以是bit,byte,packet)的抽象描述。C语言中用到的最频繁的输入输出方式就是scanf()与printf()。...原创 2022-07-21 20:05:42 · 1347 阅读 · 36 评论 -
特殊类设计
总结C++98这种方式不够直接,这里是可以继承的,但是Derive不能创建对象,因为Derive的构造函数,必须要调用父类NonInherit构造,但是NonInherit的构造函数私有了,私有在子类不可见,那么这里继承不会报错,继承的子类创建对象会报错。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息,这种方式简化了在复杂环境下的配置管理。C++11的不能被继承的方式,直观、简单明了。...原创 2022-07-14 20:43:30 · 778 阅读 · 29 评论 -
【手撕STL】bitset(位图)、布隆过滤器
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。这两个方案存在一个致命的缺陷——40亿个数据量太大内存存不下补充:1G=1024MB1MB=1024KB1KB=1024byte1byte=8bit1G大约是10亿个字节位图的应用快速查找某个数据是否在一个集合中排序求两个集合的交集、并集等操作系统中磁盘块标记给定100亿个整数,设计算法找到只出现一次的整数?这道题跟上面的题类似,利用位图解决:找出只出现一次的整数(无非有三种情况原创 2022-07-13 16:41:40 · 1034 阅读 · 29 评论 -
【手撕STL】unordered_set、unordered_map(用哈希表封装)
unordered_map在线文档说明注意:unordered_set在线文档说明注:在功能上和map、set是一样的区别在于,这两个容器遍历出来不是有序的,他们是单向迭代器运行结果:注:unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构。总结:注: 当存储的数据没有特定说明需要排序时,一定要用unordered系列的关联式容器;当需要存储的序列为有序时,应该选用ordered系列的关联式容器对于两个数据元素的关键字 ki和kj (i != j),有ki !=kj ,但有:原创 2022-07-11 21:12:28 · 1885 阅读 · 38 评论 -
【手撕STL】map和set
这里写目录标题setset的使用举例map三级目录setset文档介绍set是按照一定次序存储元素的容器在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过key访问单个元素的速度通常比unordered_set容器慢,但它们允许根据顺序对子集进行直接迭原创 2022-07-09 22:06:24 · 869 阅读 · 29 评论 -
【手撕STL】红黑树
红黑树一级目录二级目录三级目录红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的注:AVL树:左右高度差不超过1,严格平衡红黑树:最长路径不超过最短路径的2倍,近似平衡红黑树的性质:每个结点不是红色就是黑色根节点是黑色的如果一个节点是红色的,则它的两个孩子结点是黑色的 (树里面没有连续的红节点)对于每个结点,从该结点原创 2022-07-07 22:46:54 · 921 阅读 · 52 评论 -
【手撕STL】AVL树
AVL树AVL树的概念AVL树的旋转三级目录AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下。因此,找到了解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。AVL树的性质:它的左右子树都是AVL树左右子树高度之差(简称平衡因子)的绝对值不超过1(-1/0/1)如果一棵二叉搜索树是高原创 2022-07-05 20:02:25 · 882 阅读 · 33 评论 -
字符串匹配算法(BF算法&&KMP算法)
字符串匹配算法暴力匹配(BF)算法KMP算法next数组求next数组的练习暴力匹配(BF)算法BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。eg:注:只要在匹配的过程当中,匹配失败,那么:i回退到刚刚位置的下一个,j回退到0下标重新开原创 2022-03-20 16:26:07 · 2775 阅读 · 52 评论 -
C++--多态
C++—多态多态的定义及实现多态的构成条件虚函数虚函数的重写多态的定义及实现多态:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为在继承中要构成多态有两个条件:必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>原创 2022-03-13 18:04:57 · 2664 阅读 · 69 评论 -
【手撕STL】二叉搜索树
这里写目录标题二叉搜索树二叉搜索树操作二叉搜索树的插入二叉搜索树的查找二叉搜索树的删除二叉搜索树的实现二叉搜索树二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树注:二叉搜索树查找一个值最多查找高度次二叉搜索树操作二叉搜索树的插入a. 树为空,则直接插入b. 树不空,按二叉搜索树性质查找插入位置,插入新节点原创 2022-03-12 19:17:56 · 2132 阅读 · 44 评论 -
【手撕STL】priority_queue
这里写目录标题priority_queue的介绍和使用priority_queue的使用priority_queue的模拟实现仿函数priority_queue的介绍和使用优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹原创 2022-02-23 11:41:11 · 1035 阅读 · 53 评论 -
【手撕STL】stack&queue
stack&queue一级目录二级目录三级目录stack的介绍和使用stack的使用一级目录二级目录三级目录stack的介绍和使用stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。stack的底层容器可以是任何标准的容器类模板或者一些其他特原创 2022-02-19 21:37:27 · 686 阅读 · 39 评论 -
【手撕STL】list
目录list的介绍及使用list的迭代器失效list的模拟实现三级目录list的介绍及使用list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。与其他的序列式容器相比(array,vector,deque),li原创 2022-02-11 18:33:44 · 1055 阅读 · 34 评论 -
【手撕STL】vector类
vector类标准库中的vector类vector的介绍vector的使用vector的定义vector iterator 的使用vector 增删查改vector的遍历vector 空间增长问题vector类的其他接口标准库中的vector类vector的介绍vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理原创 2022-02-06 16:10:22 · 832 阅读 · 31 评论 -
C++-继承
C++-继承继承继承关系和访问限定符继承基类成员访问方式的变化继承继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承是类设计层次的复用。继承的定义:#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;cl原创 2022-02-13 12:34:38 · 1589 阅读 · 52 评论 -
C++模板进阶
模板进阶非类型模板参数模板的特化函数模板特化(用的少)类模板特化(用的多)全特化偏特化模板分离编译模板的按需实例化模板总结非类型模板参数模板参数分类类型形参与非类型形参。类型形参即:出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参,就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using names原创 2022-01-02 16:50:38 · 408 阅读 · 6 评论 -
【手撕STL】string类
string类标准库中的string类string类string类的常用接口说明三级目录标准库中的string类string类字符串是表示字符序列的类标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作单字节字符字符串的设计特性。string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_tra原创 2021-12-30 11:02:40 · 1246 阅读 · 2 评论 -
STL简介
STL简介什么是STLSTL的版本STL的六大组STL的重要性STL的缺陷什么是STLSTL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。STL的版本原始版本Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。原创 2021-12-12 16:58:16 · 339 阅读 · 1 评论 -
C++模板初阶
C++模板初阶泛型编程函数模板函数模板的原理函数模板的实例化模板参数的匹配原则类模板泛型编程泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。模板是泛型编程的基础。#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>using namespace std;template<class T>void Swap(T& x1, T& x2){ T tmp = x1; x1 = x2; x2 =原创 2021-12-12 15:15:16 · 821 阅读 · 1 评论 -
C/C++内存管理
C/C++内存管理C/C++内存分布二级目录三级目录C/C++内存分布https://blog.youkuaiyun.com/AI_ELF/article/details/121775461二级目录三级目录原创 2021-12-11 16:24:12 · 1814 阅读 · 7 评论 -
C/C++内存分布
C/C++内存分布【说明】栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以上增长的。数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。注意:函数调用建立栈帧参数、函数中的局部变量都存在在栈帧中在堆上,理论上而言,后malloc的内存地址比先malloc要大,但是也不一定,因为有可能下一次申请的是之前别原创 2021-12-07 18:28:26 · 1014 阅读 · 0 评论 -
再谈类与对象
再谈类与对象再谈构造函数初始化列表二级目录三级目录再谈构造函数初始化列表在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 虽然构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。class Date{pub原创 2021-12-06 15:10:18 · 716 阅读 · 1 评论 -
析构函数与构造函数——对象的优先级问题
class A{public: A() { cout << "A()" << endl; } ~A() { cout << "~A()" << endl; }};class B{public: B() { cout << "B()" << endl; } ~B() { cout << "~B()" << endl; }};class C{publi原创 2021-12-02 21:46:18 · 357 阅读 · 1 评论 -
编译器优化问题(类和对象)
编译器优化问题一般情况下,一个对象拷贝构造出一个临时对象,一个临时对象再去拷贝构造另一个对象,一般编译器会进行优化,中间对象优化掉,直接第一个拷贝构造第三个(要求:它是在一个表达式执行的连续步骤中)...原创 2021-12-01 21:25:33 · 271 阅读 · 0 评论 -
const成员(类和对象)
const成员const修饰类的成员函数const修饰类的成员函数d2.print();//d2的类型是const Date* , d2传参,d2的权限被放大void print()const == void print(const Date* this)//编译器对const成员函数的处理注:将const修饰的类成员函数称之为const成员函数,const修饰类成员函数,实际修饰该成员函数隐含的this指针,表明在该成员函数中不能对类的任何成员进行修改。总结:成员函数加const,原创 2021-11-30 17:23:39 · 1299 阅读 · 0 评论 -
类的默认成员函数
类的四大默认成员函数构造函数二级目录三级目录构造函数#define _CRT_SECURE_NO_WARNINGS 1#include<iostream>//using namespace std;class Data{public: void Init(int year,int month,int day) { _year = year; _month = month; _day = day; }private: int _year; int _mont.原创 2021-11-30 16:56:36 · 432 阅读 · 10 评论 -
类的成员函数this指针
this指针this指针this指针的特性this指针的使用this指针C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有成员变量的操作,都是通过该指针去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。代码1.class Date{public: void Display() { cout << _year << "-" << _month &原创 2021-10-10 17:22:23 · 3445 阅读 · 5 评论 -
类的认识及使用
类类的使用引用类的定义struct和class的区别封装类的作用域类的实例化类的使用引用C++兼容C结构体的语法C++中的struct已经不仅仅是结构体,struct已经同时升级成类。类的定义class className{ // 类体:由成员函数和成员变量组成 }; // 一定要注意后面的分号class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号。类中的元素称为类的成员:类中的数据称为类的属性或者成员变量; 类中的函数称为类的原创 2021-10-10 15:14:29 · 535 阅读 · 5 评论 -
C++入门—namespace的使用傻傻分不清楚&C++中函数的参数也可以配备胎&面试常考题
C++入门关键字命名空间命名空间使用输入&输出缺省参数(备胎)函数重载(面试常考题)名字修饰(name Mangling)关键字定义:C++系统中预定义的、在语言或编译系统的实现中具有特殊含义的单词。例如关键字不能用作变量名、函数名等命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这问题的。原创 2021-09-25 17:03:42 · 701 阅读 · 5 评论 -
数据结构(链表——双向链表的实现)
链表——双向链表的实现链表的概念及结构链表的分类带头双向循环链表的介绍(重点)双向链表的实现模型思路(独一份)双链表的各种方法实现创建结构体并创建结构体指针变量实现双向表初始化实现双向链表销毁实现双向链表打印实现双向链表在任意位置的前面进行插入实现双向链表的头插和尾插实现双向链表在任意位置进行删除实现双向链表的头删和尾删实现双向链表查找链表的概念及结构概念: 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。结构:链表的分类实际中链表的原创 2021-08-05 11:03:56 · 1414 阅读 · 6 评论 -
程序环境和预处理(二)
程序环境和预处理(二)一、 预定义符号介绍预处理详解预定义符号例子:二、 预处理指令 #define#define#define 定义标识符(#define是定义符号的)在编译常出现的几个列子思考:#define 定义宏定义语法#define 替换规则#和###的使用##的使用带副作用的宏参数三、宏和函数的对比命名约定四、命令行定义五、预处理指令 #include文件包含本地文件包含库文件包含嵌套文件包含六、预处理指令 #undef作用:语法七、条件编译常见的条件编译指令:一、 预定义符号介绍预处理详解原创 2021-07-24 19:32:24 · 569 阅读 · 1 评论 -
动态内存分配(二)
动态内存分配(二)常见的动态内存错误对NULL指针的解引用操作对动态开辟空间的越界访问对非动态开辟内存使用free释放使用free释放一块动态开辟内存的一部分对同一块动态内存多次释放动态开辟内存忘记释放(内存泄漏)经典的笔试题C/C++程序的内存开辟柔性数组常见的动态内存错误对NULL指针的解引用操作eg:#include<stdio.h>int main(){ int* p = (int*)malloc(10000000000); int i = 0; for (i =原创 2021-07-21 14:09:11 · 568 阅读 · 2 评论 -
自定义类型:结构体,枚举,联合(二)
自定义类型:结构体,枚举,联合 【二】 本节重点结构体结构体内存对齐修改默认对齐数结构体传参结构体实现位段(位段的填充&可移植性)枚举枚举类型的定义及使用枚举的优点本节重点结构体结构体内存对齐引例#include<stdio.h>struct S{ char c; int i; char c2;};int main(){ struct S s = { 0 }; printf("%d\n", sizeof(s)); return 0;}分析要点原创 2021-06-13 19:53:48 · 1198 阅读 · 5 评论 -
字符串函数和字符函数(二)
字符串函数和字符函数字符分类函数字符转换函数内存函数二级目录三级目录字符分类函数函数 如果他的参数符合下列条件就返回真iscntrl 任何控制字符isspace 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车‘\r’,制表符’\t’或者垂直制表符’\v’isdigit 十进制数字 0~9isxdigit 十六进制数字,包括所有十进制数字,小写字母af,大写字母AFislower 小写字母a~zisupper 大写字母A~Zisalpha 字母az或AZisalnum 字母或者数字原创 2021-06-13 13:28:40 · 1301 阅读 · 4 评论 -
【C语言从青铜到王者】初识指针
初识指针本章重点1.内存2.指针变量3.指针的使用指针变量的大小内存1.定义2.内存单元的地址解释内存是怎么编号的一个内存单元是多大空间指针变量指针的使用指针变量的大小本章重点1.内存2.指针变量3.指针的使用指针变量的大小内存1.定义内存是电脑上特别重要的存储器,计算机中所有程序的运行都是在内存中进行的 。所以为了有效的使用内存,就把内存划分成一个个小的内存单元,每个内存单元的大小是1个字节。2.内存单元的地址为了能够有效的访问到内存的每个单元,就给内存单元进行了编号,这些编号被称为该原创 2021-06-03 18:17:35 · 394 阅读 · 0 评论 -
深度剖析数据在内存中的存储(一)
深度剖析数据在内存中的存储(其一)本章重点数据类型详细介绍数据类型介绍类型的基本归类整形家族浮点数家族构造类型指针类型空类型整形在内存中的存储大小端介绍引例什么是大端小端练习练习本章重点1.整形在内存中的存储:原码、反码、补码2.大小端字节介绍及判断3.数据类型详细介绍数据类型详细介绍数据类型介绍基本的内置类型:char //字符数据类型short //短整型int //整形long //长整型long long //更长的整形float //单精度浮点型double原创 2021-05-23 12:52:20 · 1258 阅读 · 5 评论