
C++
文章平均质量分 73
一纸一清风
滋滋有味的学习 津津有味的生活
展开
-
RTTI
这个神奇的东西用于存储类的相关信息,用于在运行时识别类对象的信息。C++里面只纪录类的名字和类的继承关系链。使得编译成二进制的代码,对象可以知道自己的名字,以及在继承链中的位置根据这个内存中模型,明显可以看到RTTI info存在于虚表的第一项。所以说RTTI依赖于虚表,所以说dynamic_cast对应的类中一定要有虚函数。验证:http://www.openrce.org/...原创 2019-11-04 19:19:46 · 318 阅读 · 0 评论 -
C++内存空间分布
如上所示即为典型C内存空间分布图,从高地址向低地址进行说明:1.stack,即栈区,存放自动变量,以及函数调用时保存的信息。每当进行函数调用时,函数的实参和返回地址以及调用者的上下文环境会被存放在栈中;栈区由编译器自动分配,从高地址向低地址扩展,为什么会这样?我也不知道2.heap,即堆区,动态内存分配都是发生在堆区,堆区由程序员分配释放,或程序结束后由操作系统自动回收,从低地址向高地址扩...原创 2019-10-24 15:53:38 · 479 阅读 · 0 评论 -
AVL树
概念为了防止二叉搜索树退化成单支树的例子,所以为二叉搜索树加入了限制条件,平衡因子,平衡因子是用父节点的右子树高度减去左子树高度,AVL树规定每个节点的平衡因子不能大于1也不能小于-1,所以每次进行插入操作时,都需要保证每个节点的左右子树高度之差不超过1,从而可以降低树的高度,从而减少平均搜索长度AVL树节点的定义template<class T>struct AV...原创 2019-08-22 10:53:05 · 228 阅读 · 0 评论 -
list和vector区别
vector list 底层结构 动态顺序表,一段连续的空间 带头节点的双向链表 随机访问 支持随机访问,访问某个元素效率O(1) 不支持随机访问,访问某个元素效率O(N) 插入和删除 任意位置插入和删除效率低,需要搬移元素,时间复杂度为O(N),插入是有可能会造成扩容,增容,开辟空间,拷贝元素,释放旧空间,导致效率更低 任意位置的插...原创 2019-08-13 11:58:56 · 595 阅读 · 0 评论 -
STL----list
list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素 list和forward_list非常相似:最主要的不同在于forward_list是单链表,只能向前迭代,让其更简单和高效 与其他序列式容器相比(array , vector, ...原创 2019-08-13 11:40:47 · 127 阅读 · 0 评论 -
STL----multiset
简介multiset是按照特定顺序存储元素的容器,其中元素是可以重复的 在multiset中,元素的value也会识别它(因为multiset中本身存储的就是<value, value>组成的键值对,因此value本身就是key,key就是value,类型为T),multiset元素的值不能在容器中进行修改(因为元素总是const的),但是可以从容器中插入或删除 在内部,mu...原创 2019-08-21 21:04:48 · 280 阅读 · 0 评论 -
STL----set
简介set是按照一定次序存储元素的容器 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们 在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序 set容器通过key访问单个元素的速度通常比unordered_s...原创 2019-08-21 20:54:16 · 193 阅读 · 0 评论 -
STL----sort()使用什么排序方法
STL的sort()算法,在数据大时采用Quick Sort,分段递归排序,一旦分段后的数据量小于某个门槛,为避免Quick Sort的递归调用带来过大的额外负荷,就改用Insertion Sort。如果递归层次过深,还会改用Heap Sort。...原创 2019-08-13 08:29:24 · 487 阅读 · 0 评论 -
STL----multimap
简介Multimap是关联式容器,它按照特定的顺序,存储由key和value映射成的键值对<key, value>,其中多个键值对之间的key是可以重复的 在multimap中,通常按照key排序和唯一的标识元素,而映射的value存储与key关联的内容。key和value的类型可能不同,通过multimap内部的成员类型value_type组合在一起,value_type是组...原创 2019-08-21 19:28:00 · 285 阅读 · 0 评论 -
STL----map
简介map是关联容器,他按照特定的次序(按照key值来比较)存储由键值key和值value组合而成的元素 在map中,键值key通常用于排序和唯一地标识元素,而值value中存储与此键值key关联的内容。键值key和值value的类型可能不同,并且在map的内部,key与value通过成员类型value_tyoe绑定在一起,为其取别名为pair 在内部,map中的元素总是按照键值key进...原创 2019-08-21 19:08:42 · 140 阅读 · 0 评论 -
new和mallco的区别
1.申请的内存所在位置new操作符是从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。自由存储区是C++基于new操作符的一个抽象概念,凡是通过new操作符进行内存申请的,该内存就是自由存储区,自由存储区可以是堆,也可以是静态存储去,这要看operator new在哪里分配的,而堆是操作系统上的术语,是操作系统所维护的一块特殊内存2.返回类型安全性new操作...原创 2019-08-25 16:19:44 · 372 阅读 · 0 评论 -
二叉搜索树
概念二叉搜索树又称二叉排序树,它或者是一颗空树,或是具有以下性质的树若它的左子树不为空,则它的所有左子树上的节点都小于根节点的值 若它的右子树不为空,则它的所有右子树上的节点都小于根节点的值 它的左右子树也分别为二叉搜索树二叉树的操作二叉树的插入将插入节点与根节点进行比较,比根节点大的向右走,比根节点小的向左走,一直向下走直到找到位置二叉树的删除首先查...原创 2019-08-22 09:57:46 · 192 阅读 · 0 评论 -
快速排序
基本思想1.先从数列中取出一个数作为基数2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边3.再对左右区间重复第二步,直到各区间只有一个数这就是挖坑填数的基本思路下面我写一下实现步骤总结1. i = L, j = R,将基准数挖出后形成第一个坑a[i]2. j--由后向前找比它小的数,找到后挖出此数填到前一个坑a[i]中3. i++由前向...原创 2019-08-13 10:11:17 · 128 阅读 · 0 评论 -
归并排序
归并排序是一种比较高效的排序它的基本思想可以概括为先查分,再合并所谓拆分就是可以利用递归的思想,将数列分为一个一个的小数列,拆分过程有种像树的感觉,当分出来的数据只有一个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的两个小组就可以了。这样先通过递归的分解数列,再合并数列就完成了归并排序下面给出具体实现//归并排序//稳定性 稳定//时间复杂度 O(n*logN)...原创 2019-08-13 10:30:28 · 138 阅读 · 0 评论 -
Java和C++的异同
两者均为面向对象语言,都使用了面向对象思想(封装,继承,多态)不同点如下va为解释型语言,C++为编译型语言。java的运行过程:源代码经过java编译器编译成字节码,然后由JVM解释执行;C++运行过程:源代码经过编译和链接后生成可执行的二进制代码。所以,java执行速度比C++慢 java可以跨平台(对每种数据类型都分配固定的长度),C++不能(在不同的平台上会分配不同的字节数)...原创 2019-10-08 16:49:54 · 165 阅读 · 0 评论 -
内联函数和宏定义的区别
宏定义宏定义是#define 所修饰的,宏只是一种定义,他定义了一个语句块,当程序编译时,编译器首先要执行一个“替换”源程序的动作,把宏引用的地方替换成宏定义的语句块,就像文本文件替换一样。1)宏做的只是简单的字符串替换,而函数的参数的传递,参数是有主句类型的 2)宏的参数替换是不经过计算而直接处理的 3)宏在编译前进行,即先用宏替换宏名,然后再编译的 ...原创 2019-10-03 12:31:39 · 154 阅读 · 0 评论 -
快速排序及优化
1、快速排序的基本思想:快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。2、快速排序的三个步骤:(1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot)(2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此...原创 2019-09-23 21:53:55 · 181 阅读 · 0 评论 -
STL使用迭代器删除元素
1.对于序列式容器vector,deque来说,使用earse(iterator)后,后面的每个元素的迭代器都会失效,但是earse会返回下一个有效的迭代器2.对于关联式容器map,set来说使用了earse(iterator)之后,当前元素的迭代器失效,但由于其底层结构时红黑树,因此删除当前元素不会影响下一个元素的迭代器3.对于list来说,它使用了不连续分配的内存,并且它的earse...原创 2019-09-01 19:10:42 · 448 阅读 · 0 评论 -
重载、覆盖、隐藏
重载:两个函数名相同,但是参数列表不同(个数,类型),返回值没要求,在同一作用域中重写:子类继承了父类,父类中的函数是虚函数,在子类中重新定义了这个虚函数,,参数列表、返回值、函数名都需要一致且基类中被重写的函数需要有virtual修饰隐藏:当子类继承基类时,子类重新定义了基类中不是虚函数的成员函数,不管参数列表是否相同,基类函数都会被隐藏,这种情况就是同名隐藏...原创 2019-09-01 19:06:41 · 186 阅读 · 0 评论 -
异常
C语言中处理异常在C语言中,一般处理异常的方式是assert()断言一下,如果出现错误会直接终止程序还有一种方法使用错误返回码的形式,在后面的函数处理它C++异常概念C++中的异常是一种处理错误的方式,当程序碰到了一种自己无法解决的错误,便会抛出异常,让函数的直接或间接调用者来处理这个错误throw:当问题出现时,程序会抛出一个异常catch:在你想要处理异常的位置,用ca...原创 2019-08-18 11:40:15 · 213 阅读 · 0 评论 -
多态中常见的面试题
1. 什么是多态? 多态就是面对同一函数,用不同的对象去调用,会产生不同的结果2. 什么是重载、重写(覆盖)、重定义(隐藏)?重载:当两个函数同名,参数不同,且再同一个作用域内,就叫做重载重写:当两个函数同名,参数相同,返回值相同(这里有个特例,协变例外)且在不同作用域,都是虚函数,叫做重写重定义:继承时,同名函数,没有构成重写的条件的就叫做重定义3. 多态的实...原创 2019-08-17 18:00:06 · 316 阅读 · 0 评论 -
红黑树
概念红黑树,是二叉搜索树的一种变种红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉搜索树的平衡,从而获得较高的查找性能AVL树的严格平衡策略以牺牲插入和删除操作的代价,换来了O(logN)的查找事件复杂度红黑树虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:他可以在O(logn)时间内做查找,插入和删除,这里的n是树中元素的数目红...原创 2019-08-22 14:43:20 · 194 阅读 · 2 评论 -
STL----vector
1. vector是表示可变大小数组的序列容器。 2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。 3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小 为了增加存储空...原创 2019-08-11 20:44:29 · 129 阅读 · 0 评论 -
STL----unordered_map
概念unordered_map是存储<key, value>键值对的关联式容器,其允许通过key快速的索引到与其对应的 value 在unordered_map中,键值通常用于唯一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值地类型可能不同 在内部,unordered_map没有对<key, value>按照任何特定的顺序排序,为了能在常数范围内找到...原创 2019-08-24 09:26:05 · 202 阅读 · 0 评论 -
C/C++内存分布
1. 栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。3. 堆用于程序运行时动态内存分配,堆是可以上增长的。4. 数据段--存储全局数据和静态数据。5. 代码段--可执行的代码/只读常量。假设我们是32位操作系统,上面就是我们的用户...原创 2019-07-25 16:41:38 · 128 阅读 · 0 评论 -
C++中static的用法详解
C 语言的 static 关键字有三种(具体来说是两种)用途:静态局部变量:用于函数体内部修饰变量,这种变量的生存期长于该函数。int foo(){ static int i = 1; // note:1 //int i = 1; // note:2 i += 1; return i;}要明白这个用法,我们首先要了解c/c++的内存分布,以及static所在的区间。对...转载 2019-07-25 15:32:19 · 154 阅读 · 0 评论 -
为什么const对象只能调用const成员函数,而不能调用非const成员函数?
在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理。假设有一个类,名字为test代码如下:class test{ int i;public: void print(); test(int i);};我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this...原创 2019-07-25 15:09:18 · 1827 阅读 · 5 评论 -
C++ operator=的两种写法
class CMyString{public: CMyString(char* pData = nullptr); CMyString(const CMyString &str); ~CMyString(void); CMyString& operator=(const CMyString &str) { if (this != &str)...原创 2019-07-29 19:55:10 · 3984 阅读 · 0 评论 -
C++日期类
#include<iostream>#include<stdlib.h>using namespace std;class Date{public: bool IsLeapYear(int year) { return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0); }...原创 2019-07-20 12:19:09 · 208 阅读 · 0 评论 -
多态
多态 多态,通俗的讲,就是多种状态,具体点来说就是去完成某种行为,当不同的对象去完成时会产生不同的状态。多态的构成条件多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。那么在继承中要构成多态还有两个条件:1. 必须通过基类的指针或者引用调用虚函数2. 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写virtual 关键字可用来修饰继承条件...原创 2019-07-19 20:03:26 · 362 阅读 · 0 评论 -
继承
一、继承: 是面向对象复用的重要手段。通过继承定义一个类,继承是类型之间的关系建模,共享共有的对象,实现各自本质不同的东西。三种继承关系——public 共有继承 、 protected 保护继承 、 private 私有继承 三种继承关系下基类成员在派生类的访问关系变化继承方式 基类的public成员 基类的protected...原创 2019-07-19 19:38:14 · 189 阅读 · 0 评论 -
this指针
1.this指针存在哪里?其实编译器在生成程序时加入了获取对象首地址的相关代码。并把获取的首地址存放在了寄存器ECX中(VC++编译器是放在ECX中,其它编译器有可能不同)。也就是成员函数的其它参数正常都是存放在栈中。而this指针参数则是存放在寄存器中。类的静态成员函数因为没有this指针这个参数,所以类的静态成员函数也就无法调用类的非静态成员变量。2.this指针可以为空吗?可...原创 2019-05-29 23:23:58 · 325 阅读 · 0 评论 -
C++初识
1.C++关键字 在C98标准中,c语言共有32个关键字,而c++在c语言的基础上额外了一些,共63个,下面我将将其列出 在这里我只是将其简单提一下,在之后的学习中我会将其一一详解。2.命名空间 在C语言中,如果我们出现这样代码#include<stdio.h>int a = 10;int main(){ int a = 0;...原创 2018-11-05 23:24:42 · 313 阅读 · 0 评论 -
STL----deque
1.deque,是双端队列不规则的首字母缩写,双端队列是动态大小的序列式容器,其可以向两端进行伸缩2.特定的库可以以不同的方式deque,但通常都是一种动态数组。不论在何种情况下,它都允许通过随机访问迭代器直接访问单个元素,可以根据需要动态的伸缩。3.因此,deque提供了一些与vector相似的功能,但deque在头部和尾部进行数据插入和删除操作更加高效。与vector不同的是,dequ...原创 2019-08-13 15:33:46 · 129 阅读 · 0 评论 -
CloudBackUp
项目介绍该项目可以完成对一个指定目录下的文件进行监控,并将数据上传到云服务器上进行备份和下载功能。1. 客户端对指定目录进行监控,对每个文件生成etag信息,鉴别是否需要备份 2. 客户端将需要备份的文件基于http协议的PUT请求上传到服务器端 3. 服务端对于PUT上传的文件进行备份到指定目录下 4.服务端对于热度较低的文件进行压缩存储,并在文件被请求时进行解压缩处理5...原创 2019-08-08 18:24:40 · 460 阅读 · 0 评论 -
STL----stack
1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行元素的插入与提取操作。2. stack是作为容器适配器实现的,容器适配器既是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器...原创 2019-08-13 16:11:29 · 111 阅读 · 0 评论 -
C++模拟实现string类
在C语言中,字符串是以'\0'结束的,同样的,C语言我也为我们提供了str系列的库函数,但是这些库函数是和字符串分开来的,不符合我们OOP的思想,而且底层空间需要用户自己来管理,稍不留神就会越界访问。C++标准库中的string类1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。比特科技 3. str...原创 2019-08-11 08:56:50 · 336 阅读 · 0 评论 -
STL----queue和priority_queue
queue的介绍1. 队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素2. 队列作为容器适配器实现,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从队尾入队列,从队头出队列3. 底层容器可以是标准容器类模板之一,也可以是其他专门设计的容器类。该底层容器应至少支持以下操作:emp...原创 2019-08-14 20:30:20 · 255 阅读 · 0 评论 -
说一说static关键字的作用
1. 全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量.静态存储区,在整个程序运行期间一直存在。初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化);作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾。2. 局部静态变量在局部变量之前加上关键字static,局部变...原创 2019-08-14 19:57:25 · 186 阅读 · 0 评论 -
IO流
我们在和文件进行交互中,有着缓冲区的存在,在C语言中,有着输入缓冲区和输出缓冲区两种1.可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差 异,可以很容易写出可移植的程序。 2.可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以 定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。...原创 2019-08-10 11:08:12 · 127 阅读 · 0 评论