![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
e我所欲也
在很窄的胡同里长跑
展开
-
C++ 智能指针
文章目录为什么需要智能指针?内存泄漏什么是内存泄漏内存泄漏的危害内存泄漏分类如何避免内存泄漏智能指针的使用及原理RAII智能指针的原理std::auto_ptrstd::unique_ptrstd::shared_ptrshared_ptr的线程安全std::shared_ptr的循环引用为什么需要智能指针?C++由于没有gc(Java的自动回收机制),new/malloc 等出来的资源,是需要我们去手动释放。在开发过程中常常会出现这两种问题:1、忘记释放(粗心大意)2、发生异常安全问题(由于抛异原创 2020-07-28 11:52:06 · 331 阅读 · 0 评论 -
C++ 异常
文章目录C语言传统的处理错误的方式C++异常概念异常的使用异常的抛出和捕获异常的重新抛出异常安全异常规范自定义异常体系异常的优缺点总结C语言传统的处理错误的方式传统的错误处理机制:终止程序,如assert,exit,缺陷:用户难以接受。如发生内存错误,除0错误时就会终止程序。返回错误码,缺陷:需要程序员自己去查找对应的错误。如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误实际中C语言基本都是使用返回错误码的方式处理错误,部分情况下使用终止程序处理非常严重的错误。这种传统的原创 2020-07-25 20:06:45 · 817 阅读 · 0 评论 -
C++11 常用的基础特性
文章目录列表初始化内置类型的列表初始化自定义类型的列表初始化变量类型推导auto类型推导decltype类型推导范围for循环final与override新增加容器默认成员函数控制显式缺省函数删除默认函数NULL与nullptr 空值指针右值引用右值引用概念左值与右值引用与右值引用比较值的形式返回对象的缺陷移动语义右值引用引用左值完美转发lambda表达式lambda表达式语法函数对象与lambda表达式C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这原创 2020-07-22 16:14:07 · 380 阅读 · 0 评论 -
哈希应用 位图与布隆过滤器 及海量数据处理问题
文章目录位图布隆过滤器海量数据面试题思路分析位图先介绍一个题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。解决方案:遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN把数据放入map或者unordered_map中,树形结构查找位图解决面对这个问题我们首先想到的就是前三种。但是前三种做法的前提就是需要把数据移到内存上才可以运行,但是40亿个整型,差不多16个G(十亿字节差不多为一个G,一个整型占四个字节),而原创 2020-07-14 15:36:33 · 406 阅读 · 0 评论 -
哈希表 底层原理及unordered_map/unprdered_set的简单实现
文章目录前言unordered_map/_set的介绍底层结构哈希概念哈希冲突哈希函数哈希冲突解决闭散列开散列开散列增容与插入开散列与闭散列比较模拟实现unordered_set模拟实现unordered_map前言在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(log2N),即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到.因此在C++11中,STL又提供了4个unordered系列的原创 2020-07-13 20:19:37 · 3161 阅读 · 0 评论 -
红黑树 插入元素时的旋转着色分析及Map/Set的简单实现
文章目录序列式容器与关联式容器Map与Set的简单介绍set的简单介绍map的简单介绍红黑树红黑树的概念红黑树节点的定义封装搜索树的迭代器红黑树插入节点的控制红黑树的迭代器红黑树的检测set的简单模拟(插入操作和迭代器遍历)map的简单模拟(插入操作和迭代器遍历)序列式容器与关联式容器我们之前已经接触过STL中的部分容器,比如:vector、list、deque等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。而关联式容器也是用来存储数据的,与序列式容器不同的是,其里原创 2020-07-11 18:22:29 · 502 阅读 · 0 评论 -
平衡搜索树AVL 插入操作及旋转分析
文章目录AVL树的概念AVL树节点的定义AVL树的插入如何根据平衡因子维护平衡AVL树的旋转右单旋左单旋双旋:先左单旋再右单旋双旋之先右单旋再左单旋AVL树的验证AVL树的性能AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下(O(N))。因此,两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左原创 2020-06-30 14:06:11 · 476 阅读 · 0 评论 -
二叉搜索树 增删查操作
文章目录二叉搜索树二叉搜索树的实现增(插入)操作查找操作删除操作改?二叉搜索树的应用前言:在现在数据为王的时代,数据的存储量一般都是很大的,为了在大量信息中找到某些值,就需要用到查找技术,为了提高查找效率,需要对数据进行排序。排序和查找的数据处理量几乎是整个数据处理量的80%,故排序和查找的有效性直接影响到基本算法的有效性。因而查找和排序是十分重要的处理技术。往期基于线性表的排序方法--------》八大排序C语言实现版本而基于线性表的查找方法一般分为: 顺序查找和二分查找。接着便是学习基于树结原创 2020-06-13 20:07:38 · 529 阅读 · 0 评论 -
网络基础(二)应用层HTTP协议
文章目录TCP协议的面向字节流特性以及引申出来的粘包问题HTTP协议介绍通用资源定位符URLweb服务器以两种不同的方式向客户端提供内容:简单的URL格式分析:Http协议的组成1.HTTP请求2.HTTP响应应用层: 负责应用程序之间的数据传输,我们程序员就工作在这一层上TCP协议的面向字节流特性以及引申出来的粘包问题从套接字编程角度对于传输层TCP协议特点里的—面向字节流解读从创建一个TCP的socket起, 同时在内核中创建一个发送缓冲区和一个接收缓冲区;对于发送:1.调用write时原创 2020-06-08 14:29:55 · 785 阅读 · 0 评论 -
C++ 多态与虚函数
文章目录1. 多态的概念多态的性质多态的分类2. 虚函数实现动态多态性多态的构成条件虚函数虚函数重写的两个例外(不是特定规则)C++11 override 和 final3.纯虚函数与抽象类纯虚函数:抽象类接口继承和实现继承4.多态的原理虚函数表动态绑定与静态绑定(关联)5.单继承和多继承关系中的虚函数表多态的概念多态的定义及实现抽象类多态的原理单继承和多继承关系中的虚函数表继承和多态常见的面试问题1. 多态的概念多态的性质多态性是面向对象程序设计的一个重要特性。多态本意:一个事物有原创 2020-06-06 15:17:56 · 665 阅读 · 0 评论 -
C++ 继承(一)
文章目录前言:继承的概念及定义继承中的作用域(访问属性)1.继承的概念及定义2.基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数5.继承与友元6.继承与静态成员7.复杂的菱形继承及菱形虚拟继承8.继承的总结和反思9.笔试面试题前言:面向对象程序设计的四个主要特点:抽象、封装、继承、多态性,之前以了解了抽象和封装,现在开始总结继承的特征。问题:学校写一个管理系统,学生类和老师类里面都要用到年龄、姓名、性别等成员变量,或者相同的打卡、签到等成员函数,这样难免做了很多原创 2020-06-01 18:04:02 · 246 阅读 · 0 评论 -
c++ 输入输出流
文章目录输入输出流的含义标准I/O文件I/O文件概念文件流对象前言前面所用到的输入和输出,都是以终端为对象的,即从键盘输入数据,运行结果输出到显示器屏幕上。从操作系统的角度看,每个与主机相连的输入输出设备都看作一个文件。例如.终端键盘是输入文件,显示屏和打印机是输出文件。除了以终端为对象进行输入和输出外,还经常用磁盘或光盘作为输入输出对象,这时,磁盘文件既可以作为输入文件,也可以作为输出文件。说明:C语言采用函数实现输入输出(如scanf和printf函数),c++采用类对象来实现输入输出原创 2020-05-31 13:37:15 · 628 阅读 · 0 评论 -
c++ 模板进阶
文章目录非类型模板参数模板的特化函数模板特化类模板特化非类型模板参数模板参数分为类型形参与非类型形参。类型形参:即出现在模板参数列表中,跟在class或者typename之类的参数类型名称。非类型形参:就是用一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。以定义模板类型的静态数组为例:// 定义一个模板类型的静态数组,对于静态数组,一般都要提前知道开多大的空间,template<class T, size_t N = 10>class array原创 2020-05-30 15:32:08 · 239 阅读 · 0 评论 -
STL deque与常见的容器适配器 stack、 queue、 priority_queue
文章目录dequedeque的原理图deque的应用场景容器适配器stackqueuepriority_queuedequedeque双端队列是动态大小的序列式容器,其可以向两端进行伸缩。特定的库可以以不同的方式实现deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效。与vector不同的是,deque不能保证所有的元素存储原创 2020-05-25 21:50:12 · 285 阅读 · 0 评论 -
STL list模拟实现及vector与list的对比
文章目录list的介绍list模拟实现对比vector与listlist的介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中(不像vector、string等存储位置是连续的),所以在节点中通过指针指向其前一个元素和后一个元素使各个元素关联起来。与其他的序列式容器相比(string,vector,deque),优点是:list通常在任意位置进行插入、移除元素的执行效率更好。与其原创 2020-05-21 14:53:41 · 235 阅读 · 0 评论 -
STL vector模拟实现及迭代器失效问题
文章目录原创 2020-05-15 18:34:52 · 235 阅读 · 0 评论 -
STL string模拟实现及深浅拷贝问题
文章目录深浅拷贝问题现代版写法的String类string 增删查改等实现模拟实现string类,最主要是实现String类的构造、拷贝构造、赋值运算符重载以及析构函数。又因为string是要需要动态管理资源的,模拟实现时就不得不考虑深浅拷贝的问题。深浅拷贝问题浅拷贝:当创建一个对象,然后把它赋给另一个变量的时候,没有拷贝这个对象,而只是拷贝了这个对象的引用,我们称之为浅拷贝。浅拷贝...原创 2020-05-01 16:13:00 · 344 阅读 · 0 评论 -
c++ 泛型编程 初阶
文章目录泛型编程函数模板(function template)函数模板的原理函数模板的实例化模板参数的匹配原则类模板泛型编程还是先谈问题:之前学过的函数重载可以实现一个函数名多用,将实现相同或类似功能的函数用同一个函数名来定义。这样使编程者在调用同类函数时感到含义清楚,方法简单。但是在程序中仍然要分别定义每一个函数,如下三个Max函数的函数体是相同的,只是形参的类型不同,也要分别定义,只...原创 2020-04-11 12:31:13 · 251 阅读 · 0 评论 -
c++ 内存管理
文章目录C/C++内存分布C语言中动态内存管理方式C++中动态内存管理方式operator new与operator delete函数new和delete的实现原理定位new表达式(placement-new)内存泄漏常见面试题C/C++内存分布图示:C语言中动态内存管理方式回顾c语言中的内存分配规则----->c语言动态内存分配C++中动态内存管理方式在C语言中是利用库函数m...原创 2020-04-05 16:34:03 · 234 阅读 · 0 评论 -
c++类和对象(下)
文章目录再谈构造函数(处理对象的初始化)构造函数体赋值参数初始化列表explicit关键字static成员静态数据成员特性:静态成员总结友元友元函数友元类再谈构造函数(处理对象的初始化)构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。虽然构造函数调用之后,对象中已经有了一个初始值,但是不能将其称作为类对象成员的初始化,构造函数体中的语句只能将其称作...原创 2020-04-04 18:51:10 · 220 阅读 · 0 评论 -
c++ 类和对象(中)类的6个默认成员函数
文章目录构造函数析构函数拷贝构造函数赋值运算符重载取地址及const取地址操作符重载实现一个时间类(对本节知识的运用)问题:如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。class Date{};注意:虽然是空类,但是系统会为其分配1个字节来占位。构造函数构造函数是一个特殊的成员函数,名字...原创 2020-03-31 15:12:11 · 361 阅读 · 0 评论 -
c++ 类和对象(上)
文章目录类与对象的初步认知类的定义类的信息隐蔽及封装性类的对象大小类成员函数的this指针c语言到c++,必须要先知道的基础知识!请戳下面的文章链接---------------->>>>>点我,开始入门c++类与对象的初步认知C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件...原创 2020-03-28 20:44:32 · 395 阅读 · 0 评论 -
linux--进程控制
文章目录进程创建系统调用 fork进程终止进程等待进程等待必要性获取子进程status进程程序替换替换原理替换函数簇进程控制实例--简单shell的实现往期相关文章--------》深入理解进程进程创建系统调用 fork从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。进程调用fork,当控制转移到内核中的fork代码后,内核会做:1.分配新的内存块和内核数据结构(PCB...原创 2020-03-11 16:10:40 · 1857 阅读 · 0 评论 -
c++ 入门基础
文章目录从c到c++c++对c的扩充c++的输入输出函数重载为什么C语言不支持函数重载内联函数引用基本规则从c到c++书中这么写着:C语言是结构化和模块化的语言,它是面向过程的。在处理较小规模的程序时,程序员用C语言较为得心应手。但是当问题比较复杂、程序的规模比较大时,结构化程序设计方法就显出它的不足。C程序的设计者必须细致地设计程序中的每一个细节,准确地考虑到程序运行时每时刻发 生的事情,...原创 2020-03-07 20:01:58 · 3316 阅读 · 0 评论 -
c/c++ 运算符与结合性
运算符与结合性运算符 也被称位操作符,适用于在表达式中实现赋值、调用比较和执行算数运算等功能的符号。表达式的求值有三个影响的因素:1. 操作符的优先级2. 操作符的结合性3. 是否控制求值顺序。两个相邻的操作符先执行哪个?取决于他们的优先级。如果两者的优先级相同,取决于他们的结合性。说明:1.同一优先级的运算符,运算次序由结合方向决定。例如:" * “与“ / ”具有相同的优先...原创 2020-02-12 15:04:31 · 2261 阅读 · 0 评论 -
c++ 命名空间(这一篇就够了)
1.为什么需要命名空间? using namespace std;这句话我们几乎每次在c++程序中看见,这就是使用了命名空间std.命名空间是ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的命名冲突。在C语言中定义了3个层次的作用城:文件(编译单位)、函数和复合语句,C++又引人了类作用域,类是出现在文件内的。在不同的作用域中可以定义相同名字的变量。互不干扰,便于系统区...原创 2020-02-12 01:12:28 · 4414 阅读 · 1 评论