![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++小工修炼之路
文章平均质量分 87
没有撤退可言~
花有重开日,人无再少年
展开
-
c++小工修炼之路Ⅰ
第一门面向对象的语言是 Simula67C语言是1972年stl = Standard Template Library标准模板库c89 有32个关键字c99 有37个关键字c++98有64个关键字//命名空间的定义方式//两种命名空间的定义方式,一个命名空间就相当于是一个作用域namespace N1{}//命名空间可以嵌套namespace N1{ namesp...原创 2019-10-23 09:49:59 · 95 阅读 · 0 评论 -
C++小工修炼之路Ⅱ
1.引用的概念:别名,与其引用的实体公用同一块内存空间(方便理解)2.引用的定义:引用变量必须与其应用的实体的类型相同,引用类型的变量在定义的时候必须初始化3.如果不想通过引用变量改变其引用的实体,引用变量最好给成const类型的引用#include<iostream>using namespace std;int main(){ const int a = 10; ...原创 2019-10-23 13:58:03 · 160 阅读 · 0 评论 -
C++小工修炼手册Ⅲ
void test(int a){ cout << "test(int a)" << endl;}void test(int *a){ cout << "test(int* a)" << endl;}int main(){ test(0); //调用整形参数 test(NULL); //调用整型参数,但是实际上我们想...原创 2019-10-23 19:23:37 · 95 阅读 · 0 评论 -
C++小工修炼手册Ⅳ(类和对象3)
函数体内的所有局部变量你不给值的话,全部存放的都是0xCCCCCCCC,因为栈空间的初始化全部都是按照0xcccccccc来进行初始化的每个对象在生命周期内只会调用一次构造函数和析构函数为什么只能初始化一次,说个通俗易懂的例子就是,人出生只能出生一次,所以对象也只能出生一次构造函数可以重载无参构造函数被称为默认的构造函数如果类中有了有参构造,那么类 将不在生成无参构造无参构造函数和全...原创 2019-10-24 17:27:26 · 89 阅读 · 0 评论 -
C++小工修炼手册Ⅴ(类和对象)
#include<iostream>using namespace std;class date{public: date(int x) :a(x) {}private: const int a; //在类内定义的const类型的变量可以不用初始化};int main(){ //const int a; //函数内部的const类型的变量必须初始化不然...原创 2019-10-25 12:31:47 · 149 阅读 · 0 评论 -
C++小工修炼手册Ⅵ(类和对象收尾,日期类)
如果将<<运算符重载成类的成员函数,其第一个参数就是this因此调用方式和常规是反的,所以一般不会把<<重载为成员函数#include<iostream>#include<string>using namespace std;class date{ friend ostream& operator<<(ostream&...原创 2019-10-25 19:37:58 · 103 阅读 · 0 评论 -
C++小工修炼手册Ⅶ(动态内存管理)
操作系统将我们的内存空间分成了很多的区段,每个区段都存放不同的数据,这是为了存数据和取数据方便,而划分的,从下到上依次是,受保护的头,代码段,未初始化全局变量,已初始化全局变量,以及堆,文件映射区,栈,内核操作系统。动态申请空间的方式:malloc,calloc,realloc相同点:都是从堆上开辟空间,返回值类型相同都是void*申请空间失败,返回值都是NULL申请空概念都需要手...原创 2019-10-26 14:18:18 · 198 阅读 · 1 评论 -
C++小工修炼手册Ⅶ(模板&STL简介)
导致内存泄露的常见场景有哪些1.在申请空间之后忘记释放空间,这样的话就会导致内存泄露 2.一些误操作,比如浅拷贝问题,两个指针指向一块空间,但是其中一个指针的空间未被释放3.异常安全问题,在空间未释放之前就被异常捕获,而去执行其他代码,没有释放空间内存泄漏的危害:长期运行的程序 出现内存泄漏 ,影响很大,就会导致相应越来越慢,导致最终卡死内存泄露一般分为两种一种是堆上用户申请的空间资源泄...原创 2019-10-26 18:06:21 · 100 阅读 · 0 评论 -
C++小工进阶之路Ⅷ(string类的应用)
STL:对数据进行管理,对常见的数据结构的封装线性容器:C++98 string:对char* 格式的字符串进行封装 vector:动态的顺序表 list:带头结点你的双向循环链表 deque:双端队列---了解 stack:栈 queue: 队列 priority_queue:优先级队列--堆C++11: array:静态类型的顺序表(用的不多) forwar...原创 2019-10-27 18:27:48 · 139 阅读 · 0 评论 -
C++小工修炼之路Ⅸ(深浅拷贝解决办法,两种)
string 类中的几个内置函数,容易遗忘1.clear()清空有效字符2.erase()删除某一个位置的字符,就和在固定位置进行数组元素的删除差不多3.insert(),在固定位置插入元素,或者字符串4.assign()截断,和substr()差不多5.replace()替换,字符串的替换strcpy是如何实现的 char* a = "12345"; char* b = new...原创 2019-10-28 14:09:35 · 235 阅读 · 0 评论 -
C++小工修炼之路Ⅹ(string类)
浅拷贝如何解决:深拷贝----让每个对象都拥有自己独立的资源—拷贝的不是对象本身的内容,而是对象管理资源中的内容a传统版解决办法,对产生对象的函数都进行深拷贝的操作b.现代版的解决办法,代码量少,提高了代码的复用率2.在浅拷贝的基础上,加上引用计数的方法,再加上写时拷贝,就大概可以实现浅拷贝的问题但是不建议写这种写是拷贝的代码,因为在所有的进行写操作或者,push_back操作的代码...原创 2019-10-28 19:26:43 · 118 阅读 · 0 评论 -
C++小工进阶之路Ⅺ(vector和string区别)
vector底层结构:动态类型的顺序表既然是顺序表,那么就什么类型都可以存放,那么也就是可以存放字符类型,那么为什么又要有string类型呢?其实这个就是字符数组和字符串的区别?字符数组不一定是字符串,因为字符串一定有’\0’,其次就是刚初始化好的vector类里面就是空的,什么都没有,而定义好的string空类,里面就有16个字节的空间,其中第一个自己存放的是’\0’,所以有效空间就是15...原创 2019-10-29 10:18:38 · 1253 阅读 · 0 评论 -
C++小工修炼手册Ⅻ(vector实现)
T():如果T代表的是内置类型, T()代表的是 0如果T代表的是自定义类型,那么T()代表的就是调用这种类型的无参构造函数erase()函数用迭代器参数,删除元素之后又会返回一个迭代器,按道理来说迭代器不应该失效的,但是STL让迭代器失效了,这样做的目的就是,假如你删的是最后一个元素,尾位置只需要前移,这样的话,迭代器就失效了。一般我们看STL的源码看的都是SGI版本的因为,SGI版本的...原创 2019-10-29 16:26:20 · 149 阅读 · 0 评论 -
C++小工修炼手册XIV(list)
list:底层结构就是带头头结点的双向循环链表vector类型的变量的打印方式有三种,范围for迭代器,还有就是for循环+下标list类型的变量只有两种打印方式,没有for循环+下标,因为list类型的 变量不支持随机访问list<int> L;auto it = L.begin()while(it != L.end()){ cout<<*it<&l...原创 2019-10-30 17:28:36 · 105 阅读 · 0 评论 -
C++小工进阶之路 XV(list总结以及deque介绍)
在list类中,因为list底层使用的是带头结点的双向循环链表,所以list这个容器的迭代器既有++操作,又有--操作,但是对于forward list来时底层是单链表,所以模拟实现的时候只有迭代器只有++操作,没有--操作,所以迭代器一定要视情况而定。在类中给迭代器取别名,例如typedef ---->这样做的目的是为了在更多的容器中统一接口我们自己实现的迭代器也存在失效问题 ...原创 2019-10-31 09:47:40 · 211 阅读 · 0 评论 -
C++小工修炼之路XVI(栈和队列,优先级队列)
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)bool IsPopOrder(vector<int> pushV,vector&l...原创 2019-10-31 15:38:39 · 246 阅读 · 0 评论 -
C++小工修炼之路XVII
什么是STL?C++标准库:标准模板库通俗说:对常见的数据结构的封装+通用的算法(算法可以操作任意类型的数据,因为这些数据都是按照模板的方式给出的,可以是内置类型的数据,也可以是自定义类型的数据。而且这些算法对于各种数据结构都是适用的,无论你将数据承载在哪种数据结构中都可以进行处理)sort:排序算法,无论你对vector,还是list都是通用的STL六大组件: 容器: 组织数据...原创 2019-11-02 21:53:21 · 227 阅读 · 0 评论 -
C++小工进阶之路XVIII(类型萃取,反思)
写一个通用的拷贝函数,要求效率尽可能的高memcpy()是一种按照字节的,内存拷贝,容易发生浅拷贝。#define _CRT_SECURE_NO_WARNINGS#include<iostream>using namespace std;template<class T>void Copy(T* A, T* B, int _size){ //memcpy(...原创 2019-11-03 17:16:25 · 144 阅读 · 0 评论 -
C++ : 小工进阶手册XIX(继承上)
继承:什么是继承?通俗的说就是: 龙生龙 凤生凤 老鼠的儿子会打洞继承机制是面向对象程序设计使代码可以复用的最重要的手段,它允许在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。=================================...原创 2019-11-18 14:31:54 · 144 阅读 · 0 评论 -
C++小工进阶之路XX(继承下)
public继承方式:基类和子类是is—a的关系is—a:可以将一个子类对象看成是一个基类对象(所有用到基类对象的位置,都可以使用子类的对象来代替)验证:类成员函数传参,以及对象模型在基类中存在拷贝构造函数的情况下,就算派生类没有显示提供拷贝构造函数,但是编译器还是会自己提供默认的拷贝构造函数,在派生类的默认拷贝构造函数的初始化列表自动的去调用基类的拷贝构造函数,但是建议在基类中存在拷贝构造...原创 2019-11-19 12:13:22 · 177 阅读 · 0 评论 -
C++小工修炼之路XXI(多态上)
什么是多态?你对多态的认识?简单来说就是同一事物在不同的场景下表现出的多种形态。栗子:网上的例子,见人说人或话,见鬼说鬼话。一个人见到不同身份的人说话的态度不一样。多态的实现条件:在继承的体系下基类中必须有虚函数,被virtual修饰的成员函数(注意一定是成员函数),友元函数不是虚函数在派生类中必须要对基类中的虚函数进行重写对于虚函数的调用:必须使用基类的指针或者引用调用多态。...原创 2019-11-19 15:01:35 · 281 阅读 · 0 评论 -
C++小工进阶之路(智能指针上)XXIII
C++将内存的管理交给了用户自己来管理,所以很有可能会申请空间后忘记释放,引起内存泄漏。原创 2019-11-28 10:13:25 · 98 阅读 · 0 评论 -
C++小工修炼手册XXII(多态中)
C++11给出了一个关键字override:只能修饰派生类中的虚函数作用:让编译器帮助用户检测派生类中某个虚函数是否重写了基类的哪个虚函数。主要作用就是防止在派生类中重写基类虚函数的时候手滑把函数名写错了,此时用户将派生类中的函数当作对基类的重写去使用,虽然此时编译可以通过,但是此时结果已经不正确了。C++11:final关键字修饰类,表示该类不能被继承修饰类中的函数,表示该函数不能...原创 2019-11-28 15:07:01 · 177 阅读 · 0 评论 -
C++小工修炼手册XXIV(多态下)
虚函数的调用:原创 2019-12-01 18:04:05 · 97 阅读 · 0 评论 -
C++小工进阶之路XXV(智能指针下)
继承的总结和反思 1. 很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有 菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在 复杂度及性能上都有问题。 2. 多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。 3. 继承和组合public继承是一种is-a的关系。也就是说每个...原创 2019-12-04 13:05:26 · 177 阅读 · 0 评论 -
C++小工修炼手册XXVII (二叉搜索树的简单实现以及原理解释)
二叉搜索树的介绍:二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树二叉搜索树操作1.二叉搜索树的查找: 若根结点不为空: 如果根节点的val == 查找的val直接返回true 如果根节点的val &g...原创 2019-12-28 13:50:13 · 113 阅读 · 0 评论 -
L7ZZ压缩算法
LZ77压缩算法LZ77是一种基于字典的算法,它将长字符串(也称为短语)编码成短小的标记,用小标记代替字典中的短语,从而达到压缩的目的。 LZ77使用的是一个前向缓冲区和一个滑动窗口来维护字典。它首先将一部分数据载入前向缓冲区,一旦数据中的短语通过前向缓冲区,那么它将移动到滑动窗口中,并变成字典的一部分,随着滑动窗口移动,字典中的内容也在不断的更新,也就是说它是变更新字典,边进行压缩。...原创 2019-12-31 10:52:16 · 666 阅读 · 0 评论 -
文件压缩 1
文件压缩:ZIP1.什么是文件压缩? 数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。2.为什么需要对文件进行压缩? a.文件太大,为了节省空间 b.提高数据在网络上传输的效率 c.压缩之后,对文件可以起到加密的作用。在文件传输的过程中更安全3.文件压...原创 2020-01-07 11:09:20 · 359 阅读 · 0 评论 -
文件压缩2
这个是压缩后的文件,这是一些简单的文件,所以压缩出来的都是比较简单的关于解压缩 还有一个问题就是解压缩,如果要解压缩的话,单单知道压缩内容是没有用的,因为必须知道每种字符的编码,有多少种字符,文件大小,文件类型,以及编码信息行数(就是前多少行是辅助解压的其他信息), 知道这些信息的话才可以进行解压缩。 这样说的话我们就需要在压缩文件的开头将这些信息,也写入文件,其他的先不考虑...原创 2020-01-11 17:54:11 · 142 阅读 · 0 评论 -
C++小工修炼手册XXVIII------AVL(平衡二叉搜索树)超级详细
二叉搜索树虽然可以提升搜索的效率,但是有缺陷,就是建树的时候的参数,是有序的,或者是接近有序的,那么就会退化成单支树,搜索效率就会变成o(n)于是发明了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行调整),即可降低树的高度,从而减少平均搜索长度。为了纪念发明这种解法的人,所以就叫作AVL树(AVL树又叫平衡二叉搜...原创 2020-01-12 15:53:59 · 187 阅读 · 0 评论 -
哈希简单介绍,以及如何解决哈希冲突
关联式容器:map,set,mutil_map,mutil_set,unordered_map,unordered_set,搜索:静态搜索场景:一个序列的数据顺序查找----for遍历----->o(n)二分查找---->要求:带查找的数据必须是有序的—>o(logN).要求是数据必须是有序的动态搜索二叉搜索树—在插入删除之后会自动进行调整—>但是如果插入的元素接近有序的话那么就会形成单支树,所以平均时间复杂度就是1/2n,所以时间复杂度就是O(N)AVL:二叉搜索树原创 2020-06-23 16:24:21 · 1221 阅读 · 0 评论 -
关联式容器,海量数据问题,位图
C++11底层是哈希结构的关联式容器?什么是关联式容器?KV模型,或者K模型给一个文件:存储IP地址,找出出现次数对做的前K条IP地址,也就是top k问题1.统计每个ip地址出现的次数-----><IP,出现次数>键值对2.优先级队列创建的是小堆。...原创 2020-06-23 16:24:38 · 89 阅读 · 0 评论 -
布隆过滤器
上面这个方法可以找出一定的交集,但是会存在一定的误差,这是因为,不同的query查询记录有可能会算出相同的整形数据,然后会影响最终的结果准确的方法:布隆过滤器这里就不介绍了,之前的和左神一起练算法里面已经介绍过了。...原创 2020-06-23 16:40:06 · 83 阅读 · 0 评论 -
红黑树,关联式容器的异同
在学习红黑树之前先看这篇文章红黑树和2-3树之间的联系红黑树:是一颗平衡二叉搜索树,给书中的结点增加颜色(红色和黑色) + 红黑树性质的限制保证:最长路径中结点个数不会超过最短路径中结点个数的两倍不像AVL树觉得平衡红黑树是一颗近似平衡的二叉搜索树---->时间复杂度:O(logN)大量的应用表明:红黑树的性质比AVL树的性能好,并且实现起来也比红黑树简单一些,所以在很多地方我们使用的其实是红黑树**红黑树的概念:**红黑树,是一种二叉搜索树,但在每个节点上增加一个存储位表示节点的颜色,原创 2020-06-23 16:40:11 · 97 阅读 · 0 评论 -
C++11
CSV文件的操作map和unordered_map的区别?共同点:都是C++标准库提供的关联式容器,即里面放的元素都是K-V键值对,要求key是不能重复的。给出的时间:map是在C++98中已经存在,unordered_map是在C++11中才给出的应用:1.包含的头文件2.应用的场景只要不关心是个否有序,那么就直接使用unordered_map接口不同,接口的实现原理不同,一个是红黑树,一个是哈希桶哈希的基本实现与缺点:map的迭代器可以双向移动,–>按照中序遍历的方式进行原创 2020-06-23 16:40:18 · 211 阅读 · 0 评论 -
右值引用
右值引用:引用(C++98):别名,引用变量与其引用的实体公用同一块内存空间引用的底层实现原理:就是按照指针的方式实现的在C++中: 需要用到一级指针---->可以使用引用来代替需要用到二级指针---->可以使用一级指针的引用来代替在C++中,如果是自定义类型的参数,在传参时尽量使用引用来进行传递如果想要通过形参改变外部实参---->T&如果不想通过形参改变外部实参---->const T&引用的性质 引用作为函数参数 引用作为函数的返回值(原创 2020-06-23 16:40:27 · 713 阅读 · 0 评论 -
lambda表达式
我们要对一个数组进行排序的话一般使用的是,sort这个算法,使用的时候要包含#include < algorithm>头文件vector<int> vec = {7,4,1,8,5,2,0,9,6,3};sort(vec.begin(),vec.end());//上述的默认是升序排序假如你要使用的是降序的话sort(vec.begin(),vec.end(),greater<int>());假如现在是自定义类型的数据在C++11之前我们可以通过仿函数,自原创 2020-06-23 16:40:34 · 213 阅读 · 0 评论 -
C++11线程库
C++11提供的线程库的好处:可以跨平台 + 提供了原子类型的变量C++11中最重要的特性就是对线程进行了支持,是的C++在并行编程时不需要依赖第三方库,而且 在原子操作中还引入了原子类的概念,要使用标准库中的线程,必须包含< thread >头文件。注意:1.线程是操作系统中的一个概念,线程对象可以关联一个线程,用来控制线程以及获取线程的状态。2.当创建一个宣传对象后,没有提供线程函数,该对象实际没有对应任何线程3.当创建一个线程后,并且给线程关联线程函数,该线程函数就被启动,与主原创 2020-06-23 16:40:40 · 500 阅读 · 0 评论 -
秋招准备1
为什么选择deque作为stack和queue的底层默认容器?首先要知道,stack是一种后进先出的特殊线性数据结构,因此只要具有push_back()和pop_back()操作的线性结构,都可 以作为stack的底层容器,比如vector和list都可以;queue是先进先出的特殊线性数据结构,只要具有 push_back和pop_front操作的线性结构,都可以作为queue的底层容器,比如list。但是STL中对stack和 queue默认选择deque作为其底层容器,主要是因为:stack和q原创 2020-06-23 16:40:45 · 130 阅读 · 0 评论 -
秋招准备2
原创 2020-06-23 16:40:51 · 106 阅读 · 0 评论