指针

托付与事件

喜你入骨 提交于 2020-02-28 11:21:26
一、托付的来历 在C++中有各种各样的指针。当中,有一种指针是指向函数或者说是指向方法的。我们能够通过调用这个指针来调用其指向的方法。可是,这种指针是不安全的。假设我们简单的把C++的指针觉得是一个记录内存地址的空间。那么。方法指针里记录的就是目标方法的调用地址。 可是,C++并没有对指针指向的对象加以不论什么的限制。你不知道这种方法会返回什么,不知道这种方法要接收多少个參数,也不知道接收的參数又是什么类型,而且在C++中。指针还能够參与运算。因此,对于调用者而言,除了看到一个地址。其余一概不知道。一切要等到调用以后才真相大白。这种指针经常被一些不轨之人所利用,让方法指针指向一个破坏系统的方法。就好比给你一把钥匙,让你打开一个盒子。盒子里面是什么?或许是蛋糕。或许那就是潘多拉之盒。 因为方法指针不完好。C#针对这一现象进行了改进——托付。托付的作用与方法指针一样,用它来指向一个方法。而且提供给客户程序调用。 但这种方法指针是有限制的,它规定好了所指向方法的返回值、參数个数以及各个參数的类型。因此。这把“钥匙”能打开蛋糕盒却打不开潘多拉之盒,感觉安全多了。 二、对“托付与事件”的理解 托付是对函数的封装能够当作给方法的特征指定一个名称。 方法是将类型參数化。所谓类型參数化就是说该方法接受一个參数,而该參数是某种类型的參数,比方int、string等等。而托付是将方法參数化

基于c++的A-star算法

冷暖自知 提交于 2020-02-28 10:57:47
资料:https://www.cnblogs.com/guxuanqing/p/9610780.html 一、基础原理 1、从起点开始,向周围八个方向扩展。测试新扩展的点的路径代价,路径代价由已走的路径和距离终点的期望加和而成。这个路径代价是选择路径的标准。 2、有两个表open、close。 close:生成并且考察过的点,存在两种点。一种是当前选择的路径,是最终想要的结果。另一种是考察但没有用到的点,是考察过但是比最终路径代价大的路线,可能父指针可以指回起点,也可能无法指回起点(曾经进入死胡同的路线)。 open:生成但是没有考察的点 ·若形象的想的话,open中的点,close中的最终路线,close中的没用的路线用不同的图形画出。open在最外侧一层,close在中间,有一条线根据父指针逐层引出。 3、具体步骤 (1)最开始的时候只有起点在open中. (2)从open中找到最小的点n。 (3)n向八个方向扩展,就获得了八个新点x1~x8,接下来判断八个点的存入的地方。 (4)如果x存在于close中,则比较close中和当前点的代价大小。若新的点小,则用新的点代替旧的。若旧的点小,则放弃新的点。 如果x存在于open中,则比较close中和当前点的代价大小。若新的点小,则用新的点代替旧的。若旧的点小,则放弃新的点。 如果都不存在,就放入open。 根据这个方法

C++_十六章_智能指针_关于string对象、string指针和空指针的总结_关于智能指针相互赋值会导致出现空字符的问题_标准模板库

允我心安 提交于 2020-02-28 10:55:18
目录 1、智能指针 2、关于string对象、string指针和空指针的总结 3、关于智能指针相互赋值会导致出现空字符的问题 4、标准模板库 1、智能指针 01) 在使用new为指针分配内存空间的时候,有可能会出现忘记添加delete或者是没有忘记但不执行delelte的情况 ,此时就会导致内存泄露,例如如下情况: 1 void remodel(std::string & str) 2 { 3 std::string * ps = new std::string(str); 4 double * pd1 = new double[8]; //new返回一个可以存储8个double行数据的地址,pd1是一个指针 5 ... 6 if(weird_thing()) 7 throw exception(); //如果执行此句,那么就有可能不执行下面的delete 8 str = *ps; 9 delete ps; 10 return; 11 } delete有可能不会被执行的情况 02)使用智能指针 (1)这三个智能指针模板(auto_ptr、unique_ptr和shared_ptr)都定义了类似指针的对象,可以将new获得的地址赋给这些对象。当智能指针过期时,其析构函数将使用delete  来释放内存。下图说明了常规指针和auto_ptr之间的差别.(unique

力扣-11盛最多水的容器 Container with most water

萝らか妹 提交于 2020-02-28 10:47:22
题目 举例 思路 乍一眼看有点唬人,但是暴力是肯定不会让做的,莫不是让dp什么的…… 不不不,再仔细一分析其实就很简单: 在数组两端分别设置指针i和j, 其面积S = min(h[i],h[j]) * (j-i), 当产生一个面积需要移动指针的时候一定是往内移动,即底部长一定会变小,而长又是由短的那个值决定的,所以如果要寻找最大值那么一定是移动短的那一端来实现的。因为移动长端得到的新的面积一定会缩小。 所以得到一个面积之后只要比较哪一端的值小,就将哪段指针往内移一个就ok 代码 class Solution { public : int maxArea ( vector < int > & height ) { int res = 0 , i = 0 , j = height . size ( ) - 1 ; while ( i < j ) { res = max ( res , min ( height [ i ] , height [ j ] ) * ( j - i ) ) ; height [ i ] < height [ j ] ? ++ i : -- j ; } return res ; } } ; 问题 还是要认真读题动脑筋 来源: CSDN 作者: 听说西佳佳难得很 链接: https://blog.csdn.net/qq_37299596/article

b+树的原理

橙三吉。 提交于 2020-02-28 10:27:38
Java 内存区域 <ignore_js_op> Heap 线程公有 存放实例对象 是GC主要管理区域,因此可以更细致的划分为:新生代、老年代 再细致一点划分:Eden区、From Survivor区、To Survivor区 内存空间:可以物理上不连续、逻辑上连续即可。 Method Area 线程公有 主要存储:类信息、常量、静态变量、编译后的代码 运行时常量池 主要存储:编译期的字面量以及符号引用 具有动态性,即可以在运行时将常量放入池中。 VM Stack 线程私有 主要包括: 局部变量表:存放编译期的各种基本数据类型、对象引用、returnAddress类型 操作数栈:每一个元素可以为任意的java类型,32位数据类型所占容量为1,64位数据类型所占容量为2 动态连接:class文件的常量池中有大量的符号引用,这些符号引用有一部分是在类加载阶段或者在第一次使用的时候就转换为直接引用,这部分成为静态解析。另一部分是每一次运行的时候转化为直接引用,这部分即为动态连接。 方法出口:例如A方法中调用了B方法,B方法的返回值压入A方法的栈帧中。 Native Method Stack 线程私有 与VM Stack相似,唯一区别在于该栈为Native方法服务。 Hot Spot 将VM Stack 与 Native Method Stack 合而为一。 Program Counter

75. Sort Colors

守給你的承諾、 提交于 2020-02-28 10:04:14
"""解题思路:1.荷兰分区问题,我们把数组分成四类:red, white, 未分类, blue。初始的时候都在未分类组里,只要白色指针小于蓝色指针,我们遍历数组2.当白色指针是是红色的时候nums[white]==0,我们交换红色指针,并且两个指针同时+13.当白色指针是白色的时候,位置在正确位置,指针+14.当白色指针是蓝色的其他情况,则交换蓝色指针,并且,蓝色指针-1“”“class Solution(object): def sortColors(self, nums): """ :type nums: List[int] :rtype: None Do not return anything, modify nums in-place instead. """ red = 0 white = 0 blue = len(nums) - 1 while white <= blue: if nums[white] == 0: nums[red], nums[white] = nums[white], nums[red] red += 1 white += 1 elif nums[white] == 1: white += 1 else: nums[blue], nums[white] = nums[white], nums[blue] blue -= 1 2

学习C/C++需要掌握哪些知识

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-28 08:16:04
初级阶段 1、C语言 数据类型、变量、内存布局、指针基础; 字符串、一维数组、二维数组; 一级指针,二级指针,三级指针,N级指针概念,指针数组和数组指针; 结构体、文件的使用; 动态库的封装和设计; 函数指针回调函数。 2、C++语言 面向对象编程思想; 类的封装,构造和析构、静态成员、对象管理; 类的构造(有参构造函数、无参构造、拷贝构造、默认构造函数)和析构;对象动态管理、友元函数、友元类、操作符重载; 3、C++编译器对象管理模型分析; 类对象的动态管理(new/delete); 友元函数和友元类; 运算符重载(一元运算符、二元运算符、运算符重载难点、项目开发中的运算符重载); 类的继承、多继承及其二义性、虚继承; 多态(概念、意义、原理剖析、多态案例); 虚函数、纯虚函数、抽象类(面向抽象类编程思想案例); 函数模板、类模板,模板的继承; C++类型转换; C++输入输出流(标准I/O 文件I/O 字符流I/O); C++异常处理(异常机制、异常类型、异常变量、异常层次结构、标准异常库); 4、STL模板库、泛型编程、容器啥的; 5、常见的IDE及开发工具使用:Visual Studio、CodeBlock、NotePad等; 进阶阶段还没想好.... +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

线性表 - 双链表

[亡魂溺海] 提交于 2020-02-28 07:45:49
线性表 - 单链表 、 线性表 - 顺序存储结构 双向链表(double linked list):在单链表的每个结点中,再设置一个指向其前驱结点的指针域 view source print ? 01 /// <summary> 02 /// 定义双向链表结点类 03 /// </summary> 04 public sealed class DoubleLinkedListNode<t> 05 { 06 //存放数据 07 private T tData; 08 //后继结点 09 private DoubleLinkedListNode<t> nNext; 10 //前继结点 11 private DoubleLinkedListNode<t> nPrev; 12 13 public T Data 14 { 15 get { return this .tData; } 16 set { this .tData = value; } 17 } 18 public DoubleLinkedListNode<t> Next 19 { 20 get { return this .nNext; } 21 set { nNext = value; } 22 } 23 public DoubleLinkedListNode<t> Prev 24 { 25 get { return this

prototype pattern原型模式

两盒软妹~` 提交于 2020-02-28 07:27:10
定义 原型模式是一种非常简单的是模式,属于创建型设计模式的一种。原型模式(Prototype)即应用于“复制”操作的模式,此模式最初定义在《设计模式》(Addison-Wesley,1994),定义为: “ 使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象 ” 。简单来理解就是根据这个原型创建新的对象,这种创建是指深复制,得到一份新的内存资源,而不是一个新的指针引用。我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑对于快速的创建一个新的对象是一种非常有效的方式。 结构 原型模式结构如下页上图所示: 客户(Client):使用原型对象的客户程序,客服端知道抽象的Prototype类 抽象原型(Prototype):规定了具体原型对象必须实现的接口(如果要提供深拷贝,则必须具有实现clone的规定) 具体原型(ConcretePrototype):从抽象原型派生而来,是客户程序使用的对象,即被复制的对象。此角色需要实现抽象原型角色所要求的接口。 Prototype类中包括一个Clone方法,Client知道Prototype,调用其复制方法clone即可得到多个实例,不需要手工去创建这些实例。