自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(18)
  • 收藏
  • 关注

原创 C++中的RTTI机制总结

RTTIRTTI是运行阶段类型识别(Runtime Type Identification)的简称。假设有一个类层次结构,其中的类都是从同一个基类派生而来的,则可以让基类指针指向其中任何一个类的对象。这样便可以调用的这样的函数:在处理一些信息后,选择一个类,并创建这种类型的对象,然后返回它的地址,而该地址可以被赋给基类指针。运行时类型检查,在C++层面主要体现在dynamic_cast和typeid,VS中虚函数表的-1位置存放了指向type_info的指针。对于存在虚函数的类型,typeid和dyna

2020-06-25 15:39:04 238

原创 C++中的i++和++i的实现总结

i++const int int::operator(int){ int oldValue = *this; *this+=1; return oldValue;}++iconst int int::operator(int){ *this+=1; return *this;}

2020-06-25 15:10:25 380

原创 C++中的虚函数总结

静态函数和虚函数的区别静态函数在编译的时候就已经确定运行时机,虚函数在运行的时候动态绑定。虚函数因为用了虚函数表机制,调用的时候会增加一次内存开销虚函数和多态多态的实现主要分为静态多态和动态多态,静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual关键字的函数,在子类中重写时候不需要加virtual

2020-06-25 14:45:21 166 1

原创 C++中的函数指针总结

定义函数指针是指向函数的指针变量。函数指针本身首先是一个指针变量,该指针变量指向一个具体的函数。这正如用指针变量可指向整型变量、字符型、数组一样,这里是指向函数。C在编译时,每一个函数都有一个入口地址,该入口地址就是函数指针所指向的地址。有了指向函数的指针变量后,可用该指针变量调用函数,就如同用指针变量可引用其他类型变量一样,在这些概念上是大体一致的。用途调用函数和做函数的参数,比如回调函数。示例char * fun(char * p) {…} // 函数funchar * (

2020-06-25 14:37:01 110

原创 C++中的析构函数总结

析构函数为虚函数将可能会被继承的父类的析构函数设置为虚函数,可以保证当我们new一个子类,然后使用基类指针指向该子类对象,释放基类指针时可以释放掉子类的空间,防止内存泄漏。默认的析构函数不是虚函数C++默认的析构函数不是虚函数是因为虚函数需要额外的虚函数表和虚表指针,占用额外的内存。而对于不会被继承的类来说,其析构函数如果是虚函数,就会浪费内存。因此C++默认的析构函数不是虚函数,而是只有当需要当作父类时,设置为虚函数。...

2020-06-25 14:26:42 391

原创 C++中的智能指针总结

智能指针auto_ptrunique_ptrshared_ptrweak_ptr智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时忘记释放,造成内存泄漏。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。所以智能指针的作用原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。auto_ptr采用所有权模式。auto_ptr< string> p1 (new string (

2020-06-17 17:05:46 86

原创 操作系统中的缺页中断总结

缺页中断malloc()和mmap()等内存分配函数,在分配时只是建立了进程虚拟地址空间,并没有分配虚拟内存对应的物理内存。当进程访问这些没有建立映射关系的虚拟内存时,处理器自动触发一个缺页异常。缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中。每当所要访问的页面不在内存是,会产生一次缺页中断,此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存。缺页本身是一种中断,与一般的中断一样,需要经过4个处理步骤:1、保护CPU现场2、分析中断原

2020-06-17 16:46:04 2380

原创 操作系统中的虚拟内存空间总结

虚拟内存空间虚拟内存空间虚拟内存空间的优势虚拟内存空间的代价虚拟内存空间为了防止不同进程同一时刻在物理内存中运行而对物理内存的争夺和践踏,采用了虚拟内存。虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存。所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。 事实上,在每个进程创建加载时,内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text

2020-06-17 16:27:18 246

原创 C++中指针与数组的区别

指针与数组的区别指针数组保存数据的地址保存数据间接访问数据,首先获得指针的内容,然后将其作为地址,从该地址中提取数据直接访问数据通常用于动态的数据结构通常用于固定数目且数据类型相同的元素通过new(malloc)分配内存,delete(free)释放内存隐式的分配和删除通常指向匿名数据,操作匿名函数自身即为数据名...

2020-06-11 16:41:43 88

原创 Leetcode刷题随感之字符(数字)排序问题

字符(数字)排序问题字符或数字的排序问题通常是以ASC码排序的,可以分为两类:生成最大序列和生成最小序列。这些问题都可以继续拓展,比如加上字符总个数限制、重复字符个数限制等。"abcdef"比"abefgh"小"12345"比"23145"小问题分析:最小的生成序列实际上递增的序列,这样才能保证整体序列是最小的。我们使用单挑栈来模拟这个过程,遇到比栈顶小的元素时,把栈顶元素弹出。string generate(string &str){ stack<char> st;

2020-06-11 16:32:35 122

原创 Leetcode刷题随感之路径连通问题

路径连通问题路径连通问题这类问题,可以有很多的变形,比如在连通的基础的加上权重值,但本质还是两节点是否连通。图中通常用DFS或BFS判断是否两节点连通,为了提高效率,加上一个数组来记录已经连通的两节点。搜索的过程中,两节点的连通表达式可以如下表示:graph[i][j]=graph[i][k]&graph[k][j];可以不用DFS或BFS来搜索,用遍历的方式来等价于搜索,时间复杂度O(n^3)vector<vector<int>> dp(n,vector<i

2020-06-11 16:14:44 314

原创 C++中指针与引用的区别

指针与引用的区别1.指针有自己的一块空间,而引用只是一个别名;2.使用sizeof看一个指针的大小是4,而引用则是被引用对象的大小;3.指针可以被初始化为NULL,而引用必须被初始化且必须是一个已有对象 的引用;4.作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象;5.指针在使用中可以指向其它对象,但是引用只能是一个对象的引用,不能被改变;6.指针可以有多级指针(**p),而引用至于一级;7.指针和引用使用++运算符的意义不一样;8.如果返回动

2020-06-11 15:54:11 82

原创 C++中四种cast转换

C++中四种cast转换const_caststatic_castdynamic_castreinterpret_castconst_cast用于将const变量转为非conststatic_cast用于各种隐式转换,比如非const转const,void*转指针等, static_cast能用于多态向上转化,如果向下转能成功但是不安全,结果未知;dynamic_cast用于动态类型转换。只能用于含有虚函数的类,用于类层次间的向上和向下转化。只能转指针或引用。向下转化时,如果是非法的对于指针返回

2020-06-10 00:01:56 119

原创 Opencv学习总结之基础容器Mat

基础容器MatMat是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸、存储方法、存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同,矩阵可以是不同的维数)的指针。Mat使用引用计数机制,让每一个Mat对象有自己的信息头,但共享同一个矩阵。这通过让矩阵指针指向同一个地址实现。而拷贝构造函数则只复制信息头和矩阵指针,而不是复制矩阵。显示创建Mat对象的七种方法方法一最常用的方法是直接使用Mat()构造函数。Mat M(2,2,CV_8UC3,Scalar(0,0,255));M

2020-06-06 21:50:33 98

原创 Leetcode刷题随感之“()”问题

“()”问题从3月份开始刷leetcode到现在,一共刷了401题。其实在刷了100题左右时,我就萌生了要不要把一些我遇到的问题总结一下的想法。但是,那时候的总结更像些奇淫巧计,而不是真正的“技巧”,或者说不是一种做题的思想。我觉得我的“思想”是还远远不够的,一种穿透现象看清本质的思想。我一开始的解题思路,往往是跟着题目的意思走,他让我干嘛我就干嘛,徘徊在表象周围,虽说最终能得到答案,但是这样的算法很“丑”。算法的“丑”和“漂亮”是我对比别人的思路和我的思路突显出来的,这让我很消沉同时又很兴奋,这样子“漂

2020-06-06 11:33:53 150

原创 操作系统中程序的内存结构总结

程序的内存结构BSS段数据段代码段栈区堆区一个程序本质上都是由BSS段、数据段、代码段三个组成的。可以看到一个可执行程序在存储(没有调入内存)时分为代码段、数据区和未初始化数据区三部分。BSS段BSS段(未初始化数据区):通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配,程序结束后静态变量资源由系统自动释放。数据段数据段:存放程序中已初始化的全局变量的一块内存区域。数据段也属于静态内存分配。代码段代码段:存放程序执行代码的一块内存区域。这部分区域的大小在程序

2020-05-31 22:21:48 672

原创 static关键字的作用总结

static关键字的作用全局静态变量局部静态变量静态函数类的静态成员类的静态函数全局静态变量在全局变量前加上关键字static,全局变量就定义成一个全局静态变量。内存中的位置:静态存储区,在整个程序运行期间一直存在初始化:未经初始化的全局静态变量会被自动初始化为0(自动对象的值是任意的,除非他被显式初始化)作用域作用域:全局静态变量在声明他的文件之外是不可见的,准确地说是从定义之处开始,到文件结尾局部静态变量在局部变量之前加上关键字static,局部变量就成为一个局部静态变量。内存中的位置:

2020-05-30 00:06:34 101

原创 基本排序算法总结

排序算法总结冒泡排序选择排序插入排序归并排序快速排序希尔排序基数排序计数排序桶排序Tim排序冒泡排序冒泡算法是基于比较的排序算法,排序思想:当前元素比下一个元素大(或小)的时候,就与之进行交换。void BubbleSort(vector<int> &nums){ for(int i=0;i<nums.size()-1;i++) { for(int j=0;j<nums.size()-i-1;j++) { if(nums[j]>nums[j+1

2020-05-25 12:31:18 127

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除