C++
am brother
这个作者很懒,什么都没留下…
展开
-
C++ map和set的常见问题
map和 set 相关的问题为什么map和set的插入删除比其它容器的效率高?对于关联式容器来说,不需要做内存的拷贝和内存的移动,他们的存储方式是以节点的方式存储,只需要保留对父子节点的指针,所以实现插入和删除的时候只需要移动节点的指针。insert的时候迭代器会不会失效?不会失效,map和set的节点是malloc申请出来的,尽管insert了新的节点,内存并没有变,变得只是指针的指向。所以insert的时候迭代器并不会失效。但是对于序列式容器来说来说,当插入一个新的元素,有可能需要扩容,原创 2020-08-17 14:32:18 · 844 阅读 · 0 评论 -
leetcode第197场周赛 之 5211概率的最大路径
emm,在这里给大家推荐两个方法,一个是我比赛的时候写的堆优化版本的dijkstra,和求最短路径的spfa算法。一般写题的时候都不是接口型的OJ,而leetcode上的oj是接口型的,所以遇到一些些大大小小的问题,一直耽搁了快一个小时,本来就起晚了,AC完这道题也就刚刚结束。看完排名前面大佬们写的dijkstra用的临界矩阵建图只写了30多行,而我的堆优化版的dijkstra写了70多行,才知道差距,中间有很多不足的地方。我们这里用两种建图的Dijkstra实现这道题。注:其实堆优化的Dijkstr原创 2020-07-12 14:02:18 · 348 阅读 · 0 评论 -
【C++】C++11之智能指针
//1.RAII管理资源//2. 像指针一样使用namespace lth{ template <class T> class auto_ptr { public: auto_ptr(T* ptr) :_ptr(ptr) { } ~auto_ptr() { cout << "delete" << " "<< _ptr << endl; delete[] _ptr; } T& op原创 2020-05-15 23:00:25 · 312 阅读 · 0 评论 -
【C++】vector类的模拟实现
#include <iostream>#include <cassert>using namespace std;template <class T>class Vector{ public: typedef T* iterator; Vector() :_start(nullptr) , _finish(nullptr) , ...原创 2020-05-05 17:48:34 · 426 阅读 · 0 评论 -
【C++】string类的模拟实现
#include <iostream>#include <cassert>using namespace std;class String{public: typedef const char* const_Iterator; typedef char* Iterator; Iterator begin() { return _str; } I...原创 2020-05-05 15:23:42 · 198 阅读 · 0 评论 -
【C++】vector迭代器失效问题
vector迭代器失效问题迭代器失效是什么?迭代器失效,是不能再去拿迭代器去访问vector中的元素,此时的迭代器指向的这块空间已经被释放了,也就是说此时的迭代器已经是野指针了。insert可能会导致迭代器失效当vector数组开辟一段的空间之后,调用insert函数,向数组中插入一个值后,有可能会导致原来的空间不足,这时候,vector要进行深拷贝,就会开辟一个更大的空间,将原来空间上的...原创 2020-05-04 23:38:58 · 296 阅读 · 0 评论 -
【C++】继承
C++中的继承1.继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称为派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。之前我们接触的复用都是函数复用,继承是类设计层次的复用。2.继承定义定义格式:下面我们看到Person是父类,也称作基类。Stud...原创 2020-04-27 16:53:57 · 280 阅读 · 0 评论 -
【C++】菱形继承以及菱形虚拟继承
C++三大特性 继承 封装 多态继承就是一种管理行为。为了使我们规范的去使用类里面的成员。把成员函数或者成员变量保护起来,必须通过对象去调用。继承: 其实是类级别的复用。对父类没有任何影响。子类将父类的成员都继承下来,只是关系发生了变化。继承分为三类:私有共有保护子类可以将子类的对象, 传给父类, 子类的指针,引用,赋值给父类的指针,引用虚拟继承指针 也叫做虚基表指针。虚基表其...原创 2020-04-27 15:10:27 · 389 阅读 · 0 评论 -
【C++】从没见过这么详细的lower_bound的讲解
我这两个函数在牛客上做题见到,就充满疑惑这两个函数还有第二种接口??,我上C++官网去学习,例子就一个是最基础的,我看明白了。虽然是两个函数的接口就两个,但是有时候看别人使用的时候,里面参数还可以放不同的仿函数,我懵逼了。就去网上搜,但是大家讲解的都是它的第一个接口。我只能再把文档一遍一遍过,代码一遍遍的尝试,调试。终于,我花了一天时间把这个函数才终于依靠着调试和 模仿着别人接口的使用,慢慢调弄...原创 2020-04-18 21:52:28 · 47987 阅读 · 11 评论 -
【C++】实现一个只能创建一个对象的类
实现一个只能创建一个对象的类,一个类按理来说肯定能创建出无数个对象,如何让一个类只创建一个对象呢?我们来一步步的看class A{public: A() {} };int main(){ A a1,a2,a3.....;}毫无疑问A这个类可以实例化出无数个对象。我们知道创建对象需要调用构造函数来创建对象所以我们可以这样一步步的来走:我们可以把对象的构造函数给屏蔽掉。...原创 2020-04-11 17:42:12 · 3470 阅读 · 4 评论 -
【C++】单例中的懒汉和饿汉 以及线程安全问题
单例模式:简单来说:一个类只能创建一个对象,也就是说一个类只能被实例化一次。单例模式的两种实现:饿汉模式:含义:在程序开始(main函数之前)之前,就先将所有资源准备好(最基本的就是创建一个唯一实例化对象)例子:class Singleton{public: static Singleton& GetInstance() { return _sInst; }pr...原创 2020-04-11 17:10:12 · 616 阅读 · 0 评论 -
【C++】C++11之右值引用
C++11-右值引用我们学习右值引用,本节以 循序渐进的从提出问题、回答问题来逐步理清什么是右值引用什么是左值? 什么是右值?什么是左值引用?什么是右值引用?我们来看例子:例1:int main(){ int x = 10; //x是左值;10是一个右值 int a = 10; //a是左值;10是一个右值 int b = a; //a是左值;b也是左值 i...原创 2020-03-30 13:28:55 · 447 阅读 · 1 评论 -
【C++】C++11之lambda表达式
匿名的,函数指针仿函数lamberCompare comp原创 2020-03-28 22:17:39 · 297 阅读 · 0 评论 -
编译链接的详细过程
程序走起来 要给CPU去执行写程序的人:规划 设计(设计实现代码,cpu不认识我们写的代码) 编译器 (中间中转工作) 指令集 交给CPU编译器进行了编译工作 机器的思考速度比人快的不厌其烦的工作如何被编译器进行执行的呢?一种语言需要编译: C C++ JAVA(先编译后执行)不需要编译的: python(一边编译,一边执行)并不是不被编译,cpu期望的是拿到同样...原创 2020-02-02 11:43:07 · 1354 阅读 · 0 评论 -
【C++】清楚明了的 多态原理
多态原理虚函数表我们先来看一段代码, 探究一下虚函数表究竟是什么东西。class Base{public: virtual void Func1() { cout << "Func1()" << endl; }private: int _b = 1 ; char _c;}我们思考一下sizeof(Base)对象是多大呢? 12个字节 那为...原创 2020-04-09 11:52:09 · 151 阅读 · 1 评论 -
【C++】VAL树的旋转(左单旋、右单旋、双旋)
AVL树的旋转[topc]AVL树是一个严格平衡的二叉搜索树,因为VAL树要求原创 2020-02-22 19:49:15 · 1479 阅读 · 2 评论 -
【C++】红黑树
红黑树红黑树的性质:每各节点不是黑色就是红色根节点是黑色如果一个节点是红色的,则它的两个孩子节点是黑色的对于每个节点,从节点到其所有后代叶节点的路径上,包含相同数目的黑色节点每个叶子节点都是黑色的(叶子节点是指空节点)我们根据上面五条性质,可以知道红黑树中最主要的性质是:红黑树中不会出现连续的红节点(第3条性质)每一条路径上的黑色节点的数量相同(第4条性质)还能由这五条...原创 2020-02-22 15:05:47 · 2848 阅读 · 0 评论 -
【Linux、C++】字节序转换函数 ntohs()、ntohl()、htons()、htons()和inet_addr、inet_pton()的解析(cpp编程 ip地址)
字节序转换接口unsigned short htons(unsigned short);unsigned short ntohs(unsigned short);unsigned long htonl(unsigned long);unsigned long ntohl(unsigned long);/*注释:h代表主机字节序,n代表网络字节序,s代表short,l代表long(lin...原创 2020-02-18 14:45:08 · 2282 阅读 · 0 评论 -
【C++】 模板的分离编译
模板的进阶非类型模板参数类模板的特化类模板特化的应用模板的分离编译非类型模板参数模板参数分为类型模板参数与非类型模板参数。类型形参:出现在模板参数列表中,跟在class或者typename后面的参数类型名称。非类型形参,就是一个常量作为类(函数)模板的一个参数,在类(函数)模板中可将该参数当成常量来使用。让我们来结合代码比较一下非类型模板参数的韵味.我们先来...原创 2020-02-09 16:15:08 · 368 阅读 · 0 评论 -
【C语言】指针和数组经典笔试题
指针数组经典笔试习题对于指针和数组我们最常见的习题就是sizeof操作符与strlen函数与数组和指针的结合进行出题,所以我就整理出了sizeof和strlen与数组和指针的一些习题,这也是我曾经踩过的坑,希望与大家共享。首先我们在做题之前先要了解sizeof()和strlen():最值得注意的是:sizeof()不是函数,sizeof()是一个操作符。而strlen()是< stri...原创 2020-01-31 13:59:49 · 1032 阅读 · 1 评论 -
【C++】优先级队列priority_queue
优先级队列priority_queue:初识优先级队列优先级队列是一种容器适配器,根据标准默认,它的第一个元素总是它所包含的元素中最大的优先级队列的本质就是对堆进行操作,堆中可以随意的插入元素,并且只能检索最大的对元素(类似于优先队列的顶部元素)优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。标准容器类vector...原创 2020-01-28 19:31:57 · 285 阅读 · 0 评论 -
【C++】多态类面试题
多态类面试题什么是多态?答: 不同的对象完成相同的事件(具有相同的函数),产生不同的结果(函数内部实现不同)。什么是重载、重写、重定义?作用域函数名、参数、返回值的要求其它的要求重载两个函数在同一作用域函数名、参数相同重写(覆盖)两个函数分别在基类和派生类的作用域函数名、参数、返回值都相同两个函数必须是虚函数重定义(隐藏)两个函数分别在...原创 2020-01-21 10:50:44 · 708 阅读 · 0 评论 -
【C++】vector的清理回收的方法
vector的清理回收方法方法一. 借助swap(#include< algorithm >)主要作用: 借助swap,清理数据(将size()置为0),并回收空间(将capacity()置为0)讲解:通过swap函数将已创建的vector数组(v) 与 空的匿名数组进行交换,来达到置空已创建vector数组(v)的目的写法:写法一: vector< int >...原创 2020-01-18 23:09:06 · 3893 阅读 · 1 评论 -
【C++】内存中常见的异常值(0xcccccccc、0xcdcdcdcd、0xfeeefeee)
0xcccccccc : Used by Microsoft’s C++ debugging runtime library to mark uninitialised stack memory0xcdcdcdcd : Used by Microsoft’s C++ debugging runtime library to mark uninitialised heap memory...转载 2019-12-28 21:46:04 · 1665 阅读 · 0 评论 -
【C++】二叉搜索树(代码实现)
二叉搜索树二叉搜索树又叫做 二叉排序树或者排序二叉树二叉搜索树概念:二叉搜索树又称为二叉排序树,它或者是一颗空树,或者是既有以下性质的二叉树:若它的左子树不为空,则左子树的所有节点的值都小于根节点的值若它的右子树不为空,则右子树的所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树二叉搜索树的特点:每一个根节点的左孩子都比根节点的值小,每一个根节点的右孩子都比根节点的值大...原创 2019-12-25 13:46:32 · 318 阅读 · 0 评论 -
【C++】多态篇之抽象类(纯虚函数)
抽象类概念:在虚函数后面写上 = 0, 则这个函数为纯虚函数。包含纯虚函数的类叫做抽象类(也叫做接口类),抽象类不能实例化出对象。派生类继承后也不能实例化出对象,只有重写纯虚函数,派生类才能实例化出对象。纯虚函数规范了派生类必须重写,另外纯虚函数也体现了接口继承。我们先来看一段代码:class Car //抽象类 接口类{ public: virtual void Drive()...原创 2019-12-24 19:05:24 · 456 阅读 · 0 评论 -
【C++多态篇】多态调用和普通调用
多态调用和普通调用C++中只有两个调用关系,分为普通调用和多态调用。不满足多态调用就是普通调用。多态必须构成的两个条件被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写(也就是必须满足重写)必须通过基类的指针或者引用调用虚函数(指针和引用) 多态调用:跟指向的对象有关,传的对象是谁的,调用的就是谁的。 普通调用:和类型有关。类型是什么调用就是什么,类型是Person的,那...原创 2019-12-23 14:28:33 · 969 阅读 · 0 评论 -
【C++】继承与组合
继承和组合继承是一种 is- a 的关系, 组合是一种 has-a 的关系public继承就是一种 is-a 的关系。 也就是说每一个派生类对象都是一个基类的对象Date和Time就是一种组合的关系, Date组合了Time, 每一个Date对象中都有一个Time对象在继承方式中, 基类的内部细节对子类可见。而且基类的改变,对派生类的影响很大,派生类和基类间的依赖关系很强,耦合度很高...原创 2019-12-22 20:33:39 · 334 阅读 · 0 评论 -
【C++】string是否以'\0'结尾
我今天做leetcode题的时候发现一个趣事。一个string的对象的s的[]可以取到string的size(), 即s[s.size()]。string对象的size()本应该是这个对象的大小,这个对象的区间范围应该是[0,size()-1]才对, 为什么这个对象可以取到 s[s.size()]。并且没有报错。我百思不得其解。我本来以为string不是以’\0’结尾的,是因为string类的对...原创 2019-12-20 15:39:43 · 3955 阅读 · 2 评论 -
【C++】定位new的表达式
new的定位表达式什么是new的定位表达式?new的表达式是在内存中new一块地址,然后将一个大小合适的实例化对象放入该地址中的操作。说白了就是在已申请的内存空间中调用构造函数new的定位表达式形式: new(obj)Tobj: 这个位置必须是一个指针,在这里obj已经是指向内存分配好的内存。T: 就是对象的类型,如果是内置类型,则自己会调用自己的构造函数,这里主要是针对于自定义类型...原创 2019-12-09 00:26:18 · 334 阅读 · 0 评论 -
【C++】动态规划法判断是否为回文串
动态规划的方法判断字符串是否为回文串先找状态假如状态 F(i) : 前i个字符是否为回文串那么F(i-1)表示前i-1个字符串为回文串, F[i]要和F[0]比较,那么此时就无法进行比较我们需要往小区间转换,所以一维的解决不了问题状态F(i,j):区间(i,j)是否为回文串F(i,j)转移方程:s[i] == s[j] && (i+1,j-1) 是否为回文串 。 也...原创 2019-11-30 22:02:08 · 1259 阅读 · 1 评论 -
C++内联函数
概念:以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数压栈的开销,可以提升程序运行的效率。本质:为了解决C语言的缺陷,C语言我们用的是宏定义来展开,宏有很大的缺陷,宏的最主要缺陷是:没有类型检查,不可调试。所以内联函数取代宏,方便,直接在调用的地方展开,一般是小函数(15行之内的)如果在上述函数前增加inline关键字将其改成内联函数,在编译...原创 2019-10-23 14:53:06 · 174 阅读 · 0 评论 -
C++中的引用详解
- 引用的概念引用不是新定义的一个变量,而是给已存在变量取了一个别名,编译器不会因为引用变量开辟内存空间,它和引用变量共用同一块内存空间。例如:在家里家人对你的称呼,在发小面前的外号,在同学面前的外号,当然这些称呼都是指的是你。引用的方式:类型&引用变量名(对象名) = 引用实体 ;注: 引用类型必须和引用实体是同种类型的- 引用特性引用在定义时必须初始化一个变量可以有...原创 2019-10-18 22:04:46 · 296 阅读 · 1 评论 -
C++中的缺省参数
缺省参数概念缺省参数是声明或定义函数时为函数参数指定一个默认值。在调用该函时,如果没有指定实参则采用该默认值,否则使用指定的实参。先来看一段简单的代码:void test(int c = 0){ cout << c << endl;}int main (){ test(); // 没有传参时,使用参数的默认值 ...原创 2019-10-18 20:19:13 · 664 阅读 · 0 评论 -
C++命名空间的使用与详解
C++命名空间的使用与讲解命名空间的引入原因:引入命名空间的主要原因:针对于命名冲突的问题在C语言中,我们都是规范命名变量或函数名称,尽量不与库里的关键字冲突;为了解决这一问题,C++引入了命名空间的概念。命名空间的提出主要就是针对于这类问题的。在C/C++中,变量、函数和类都是大量存在的,这些变量、函数和类的名称都将存在于全局作用域中,可能会导致很多的命名冲突。使用命名空间的目的是对标识...原创 2019-10-14 00:02:51 · 2877 阅读 · 1 评论