- 博客(71)
- 收藏
- 关注
原创 正则表达式
python 正则匹配 import re1. 常见接口函数import re//从字符串的起始位置匹配一个模式 如果从开始位置就不匹配模式 直接返回Nonere.match(pattern, info, flag) //扫描整个字符串 返回第一个成功的匹配re.search(pattern, info, flag)//替换字符串中的匹配项re.sub(pattern, resource, string, count=0, flags=0)/* pattern: 模
2022-04-12 09:39:20
829
原创 Unity 基础资源知识汇总学习
基础资源:纹理Texture 材质Material+着色器Shader 网格Mesh1.纹理:图片、电影文件;定义表现游戏对象表面是什么颜色、有什么花纹、图案等2.材质+着色器:一种工具 利用材质和着色器将纹理渲染到游戏对象上(也就是渲染在Mesh上)3.网格:构建游戏对象的形状;通俗讲就是游戏对象是个什么形状 人形 动物形状 盒子 球形等;总结:纹理向用户视觉展现了游戏对象的外表 类比人穿的衣服;材质+shader是一种工具 帮助游戏对象穿上纹理这个...
2022-04-11 16:08:01
2971
原创 C#委托
委托:类似于C/C++中函数的指针 是存有对某个方法的引用的一种 引用类型变量 引用可在运行时被改变委托特别用于实现事件回调方法 所有的委托都派生于System.Delegate类声明委托 public delegate int Test(string s) 可被用于引用任何一个带有单一string参数的方法 并返回一个int型变量一旦声明了委托类型 委托类型必须使用new关键字来创造...
2019-04-16 16:47:34
288
原创 C#特性
特性:用于在运行时传递程序中各种元素(类 方法 结构 枚举 组件)的行为信息的声明性标签 特性用于添加元数据一、预定义特性 AttributeUsage Conditional Obsolete[AttributeUsage(validon,AllowMultiple = allowmultiple,Inherited = interited)]* validon:规定特性可被放置的语...
2019-04-16 16:38:53
660
原创 C#简单数据结构
一、数据类型值类型:int char float bool byte double long short uint ulong ushort decimal(128位精确的十进制值)引用类型:不包含存储在变量中的实际数据 但它们包含对变量的引用 指向的是一个内存位内置的引用类型:object dynamic string*object对象类型是C#通用类型系统中所有数据类型的...
2019-04-13 16:43:15
469
原创 C#继承
继承本质 重用代码继承的思想实现了 属于 is-a的关系* 继承的特点* 1.派生类是对基类的扩展 派生类可以添加新的成员 但是不能移除已经继承的成员的定义* 2.继承是可以传递的 如果C从B中派生 B又从A中派生 那么C不仅继承了B中声明的成员 同样也继承了A中声明的成员* 3.构造函数和析构函数不能被继承 除此之外其他成员能被继承 基类中成员的访问方式只能决定派生类能否访问...
2019-04-13 16:32:57
201
原创 C#静多态与动多态
多态的本质:一个接口 不同实现 即多个功能类别:静多态 动多态一、静多态函数的响应是在编译时发生的 主要包括函数重载和运算符重载两种函数重载(overload)同一作用域 方法名相同 参数列表必须不同 返回值类型可以不相同 其中参数列表不同包括参数类型不同或者参数个数不同运算符会出新博客具体讲二、动多态函数的响应是在运行时发生的动多态是由抽象类和虚方法实现 代码如...
2019-04-13 16:30:29
284
原创 lua调用c模块 c模块编写注意点
编写主旨是:编写的c函数都是static的 对外是私有的的 只提供一个外部公共的接口创建C模块第一步:编写要注册的c函数 eg:static int add(int x,int y){return x+y;} static int sub(int x,int y){return x-y;}第二步:将要注册的C函数通过类型为lua_Reg的数组保存 保存两个字段 字符串 = 函数指针co...
2019-04-07 11:06:10
259
原创 宏的高级用法
1.# 出现在宏定义中的#是把跟在后面的参数转成一个字符串2.## 是一种分隔符 先分隔 在强制连接注意点:当宏函数中再次调用相同宏函数的时候 括号里的宏函数不会展开#define TOSTR(moudle) #moudle#define TOSTRCAT(x, y) (x##y)int main(){ char *pstr = TOSTR(add); ...
2019-04-05 15:48:02
784
原创 Lua继承的实现
实现继承的原理:利用table中的元表来实现 __index__index元方法:用于查看表中元素或方法是否存在 如果不存在则返回nil 如果存在 则返回__idnex表中的结果--单一继承的实现 利用元表来实现继承Account = {name = "lili", balance = 10}function Account:widthdraw(value) self.balanc...
2019-03-29 11:14:42
1207
原创 lua算数类元方法操作两个table举例
--找到表中最后一个元素的下标function tableMax(t) local count = 0 for k,value in ipairs(t) do if (count < k) then count = k end end return count endlocal mt = {} mt. __add = function(mytable,n...
2019-03-28 16:02:02
910
原创 Lua元表的理解(二) __index __newindex 的实践
一、具有默认值的table --通过__index实现首先 我们都知道table中的任何字段的默认值是nil 我们可以通过元表来修改table的默认值function setDefault(t, d) local mt = { __index = function() return d end} setmetatable(t, mt)endfunction main() l...
2019-03-28 15:58:03
308
原创 lua元表的理解(一) __index __newindex
元表本质上来说是一种用来存放元方法的table 通过对应的key来得到value的值 作用就是修改一个值的行为 这种修改会覆盖原本该值可能存在的相应的预定义行为lua中的每个值都可以有一个元表 只是table和userdata可以有各自独立的元表 而其他类型的值共享其类型所属的单一元表lua代码只能设置table的元表 其他类型值的元表只能通过C代码设置多个table可...
2019-03-28 10:59:47
953
原创 Lua调用c模块
一、lua调用c模块总结1.c函数库成为lua的一个模块主要做法:将包含c函数的代码生成库文件 linux下是.so windows下是.dll 同时拷贝到lua运行环境的bin下(由于我用的是LuaTool运行环境 所以放在bin下 程序运行默认从bin下找) 这样lua解析器才可以找到.dll文件2.编写c模块 (1)先编写需要注册的c函...
2019-03-27 21:03:01
9660
原创 lua中点号和冒号的用法以及面向对象编程的基本实现原理
Lua面向对象编程一、面向对象特征封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性继承:继承的思路允许在不改变源程序的基础上对其进行扩充 使得原功能得以保存,新功能得以扩展多态:同一操作作用于不同的对象 可以有不同的解释 产生不同的执行结果 在运行时 可以通过基类的指针来调用实现派生类的方法抽象:简化复杂的显示问题的途径 可以为具体问题找到最恰当的类...
2019-03-25 17:48:51
432
原创 lua中的位运算
lua5.1不支持位操作 自己实现--数字转二进制 代码如下 其中需要注意的地方是 num = num / 2 并不像C中只得整数部分 所以需要处理一下值 用到了lua中math库的math.modf()函数 函数用法如下所示print(math.modf(12.34)) ---》 12 0.34数字转二进制代码--数字转二进制function ToSecond(num)...
2019-03-23 16:21:25
8958
3
原创 lua编写模块
编写模块注意的地方:1.模块名必须与文件名相同2.创建局部表来封装模块 达到私有性 共有性3.将局部表赋给模块名后 摆脱函数对模块名的依赖 这样改变模块名只需改变文件名即可4.利用环境解决 函数和变量依赖局部表名的调用5.利用环境会造成当前环境不能访问外部的全局变量 可以通过设置元表 让当前全局变量_G继承外部的_G方法一创建一个table 并将所有需要导...
2019-03-23 16:20:41
401
原创 lua中require、dofile、loadfile对比
一、requirerequire(moduleName):用来加载模块;其参数只要是文件名即可;利用模式匹配搜索加载文件;require只会被调用执行一次,会判断文件是否被加载避免重复加载;(1)模式匹配require的路径是一个模式列表,每一个模式指明一种由虚文件名(require的参数)转成实文件名的方法;每一个模式是一个包含可选的问号的文件名。匹配的时候Lua会首先将问号用虚文...
2019-03-23 16:20:00
509
原创 JavaScript简单使用实例
首先,我所认识理解的JavaScript是给我们固有的网页添加一些功能,是这些网页面向用户体验更加完美。所以要使用JavaScript,必须是在HTML+CSS的基础上实现的。说白了JavaScript就是给网页中的某些按钮、文本框中加入特效。 编写JavaScript的流程: 1.要有基础的页面布局HTML+CSS 2.要确定修...
2019-01-07 16:29:39
311
1
原创 C语言模拟C++多态
typedef void(*FUN)();//重定义一个函数指针类型struct Base{ FUN f;//由于C语言中结构体不能包含函数 只能用函数指针在外面实现};struct Derive//本派生类只继承了父类 他自己没有自己的部分{ Base b;//在子类中定义一个基类的对象即可实现对父类的继承};void FunB(){ printf("%s\n",...
2018-08-28 18:38:55
197
原创 typedef与define的区别
(一)typedef(1)typedef 为某一种类型引入新的名字 ,并不为变量分配内存空间(2)不可以同时将多个声明放在一个typedef(3)举例说明typedef int KeyType //为int引入新名字int a ;//定义一个整型变量aKeyType b;//定义一个整型变量btypedef int* ptr,(*fun)(),arr[5];/*...
2018-08-28 17:48:38
1739
原创 常见STL容器总结
/*STL容器主要分为顺序容器 vector(向量容器) deque(双端队列容器) list(双向链表)关联容器 set(单重集合) multiset(双重集合) map(单重映射表) multimap(多重映射表)容器适配器 stack(栈) queue(队列) prority_queue(优先级队列)*/(一)vector向量容器1.包含在头文件#include...
2018-08-27 15:29:46
8278
1
原创 关于数组的剑指offer习题
(一)二维数组中数字的查找此二维数组的特点每一行都按照从左到右递增 每一列都按照从上到下递增题目要求:给定这样一个数组和一个整数 查找这个整数是否在数组中解题思路:由于题中所所述的二维数组的特点 从二维数组最后一列的第一个元素arr[row][col-1]找起 如果要找的数字大于arr[row][col] 则直接跳到下一行 由于arr[row][col]前面的数字都小于...
2018-08-26 15:21:34
236
原创 判断完全二叉树和满二叉树
(一)判断完全二叉树特点一:只允许最后一层有空缺结点且空缺在右边,即叶子结点只能在层次最大的两层上出现; 特点二:对任一结点,如果其右子树的深度为j,则其左子树的深度必为j或j+1 即度为1的点只有1个或0个 解题思路:首先一棵空树是完全二叉树利用队列 先将根节点入队 只要当前节点不为NULL 先从队列front()得到一个节点 并将吹对节点的左右孩子入队 如果存在只有一...
2018-08-25 16:28:50
9191
4
原创 二叉树常见面试题
(一)求二叉树和为某一值的路径//二叉树中和为某一值的路径44void findpath(BstNode* ptr,int sum,int& cur,vector<BstNode*> &vec){ cur += ptr->data; vec.push_back(ptr); //如果当前节点为叶子节点并且cur == sum 满足要求 打印v...
2018-08-25 15:49:54
1261
原创 二叉树的镜像
纠正一下上图中的描述 只要当前节点有孩子就交换 也包括只有一个孩子的情况递归代码 void MirrTree(BtNode* ptr) { // 树空 指向树的根节点为空 if(ptr == NULL) return ; //只有根 不需要交换 if(ptr->leftchild == NULL && ptr-&...
2018-08-24 20:51:29
130
原创 二叉树简单操作
(一)求二叉树的深度如果一棵树只有一个结点,那么它的深度为1;如果根结点只有左子树没有右子树,那么树的深度是左子树的深度加1,加1是加上根节点这一层如果既有左子树又有右子树,那么树的深度应该是左、右子树中深度较大的值再加1递归代码int Depth1(BtNode* ptr){ if(ptr == NULL) return 0; int nleft = Depth1(p...
2018-08-23 22:12:31
179
原创 简单二叉树
二叉树的基本结构typedef char KeyType;#define END '#'typedef struct BtNode{ BtNode* leftchild; BtNode* rightchild; KeyType key;}BtNode,*BinaryTree;二叉树的建立//购买节点BtNode* BuyNode(){ BtNode* s = ...
2018-08-23 17:42:03
422
原创 判断大端小端以及模拟htons函数
大端:指的是一个整数的高位字节存放在内存的低地址处小端:指的是一个整数的低位字节存放在内存的低地址处现代PC大多采用的是小端字节序,又称为主机字节序,而网络中传输数据时使用的是大端字节序,又称为网络字节序如何判断大小端呢?代码如下://判断大端或者小端void IsPort(){ union { short int a;//短整型两个字节 char b[size...
2018-08-22 21:16:22
555
原创 I/O复用之poll
函数功能:在一段在指定的时间内,监听用户感兴趣的可读、写、异常事件函数原型:int poll(struct pollfd* fds,nfds_t* nfds,int timeout) fds:指向所有感兴趣的文件描述符上的可写、可读、异常事件,它是一个结构体的数组类型,每个格子都包含以下内容:struct pollfd{ int fd;//文件描述符 short ...
2018-08-22 19:13:32
189
原创 I/O复用之select
函数功能:在一段时间内,监听用户感兴趣的文件描述符上的可读、可写与异常事件函数原型:int select(int nfds,struct fd_set *readfds, struct fd_set *writefds,struct fd_set *execptfds,struct timeval * timeout)nfds:要监听的最大文件描述符加1; readfds:监听用户感兴趣的...
2018-08-22 17:24:06
183
原创 网络编程中的细节问题
(一)socket阻塞与非阻塞问题在创建socket函数中的第二个参数types用来指定服务类型,在Linux2.6.17版本起,除了之前的SOCK_STREAM(流式服务)、SOCK_UGRAM(数据报服务)以外,又增加了SOCK_NONBLOCK和SOCK_CLOEXEC,分别表示将创建的socket设置为非阻塞的和用fork创建的子进程在子进程中关闭该socket;第一个问题:如何将...
2018-08-22 14:28:49
431
原创 网络编程总结(C/S)
(一)TCP编程流程服务器端编程流程/*第一步:创建socket int socket(int domain.int type,int protocol)成功时返回一个socket 失败时返回-1并设置errordomain:告诉系统使用哪个底层协议族 PF_INET(ipv4) PF_INET6(ipv6)type:指定服务类型 SOCK_STREAM(流服务) SOCK_UGRA...
2018-08-22 13:16:36
917
原创 malloc与free、new与delete
(一)malloc与free1.void *malloc(int size);它的返回值为void*,表示分配的堆内存的起始地址,返回值可以被强转为任何类型的指针;并且malloc函数分配得到的内存空间是未初始化,一般要调用memset函数将其初始化为0;void *memset(void *p,int c,int n);该函数可以将指定的内存空间按字节单位置为指定的字符c;...
2018-08-21 14:18:06
257
原创 指针与数组的比较
数组有两种创建方式,一种是在全局静态存储区创建(全局数组),一种是在栈上创建;(1)数组名对应的是一块内存而不是指向,地址和容量不允许改变,只允许改变内存里的内容; 指针可以指向任意类型的内存块,它是可变的,常用指针操作动态内存 接下来以字符串为例来说明两者的区别(2)大小不同 char str1[] = "hello";大小为6个字节,表示存放6个字符的...
2018-08-20 21:03:30
1306
原创 内存管理以及常见内存泄漏处理
(一)内存分配方式(1)从静态存储区域分配;内存在程序编译的时候就已经分配好,这块内存在程序整个运行期间都存在;例如全局变量、static变量(2)在栈上创建;在执行函数时,函数调用会开辟栈帧空间,内部的局部变量的存储单元都存在于栈空间,函数体执行完成后这片空间自动被释放(3)在堆上分配;即就是我们常说的动态内存分配。程序运行期间通过malloc或new申请任意多少内存,程序自己负责在...
2018-08-20 20:33:15
719
原创 快排三种基本解法以及两种快排优化
/* 快速排序 基本思想 选定每次排序的基准数据 在剩下的位置将小于基准值的数据放在基准值得左边,大于基准值的数据放到基准值的右边 一次划分之后 如果此基准值的左右两边仍存在大于两个数据 则继续划分排序 直至每个数字都有序 递归实现Quick_Sort1(int *arr,int len):快排一次划分的时间复杂度为O(logn) 最坏就是在有序条件下 时间复杂度为O(n^2...
2018-08-18 14:56:13
5338
原创 常见排序总结
/*选择排序每一趟选取第i个关键字,与剩下的n-i关键字进行比较,找出最大的值与刚开始选择的i下标对应的值交换第一趟: 0 , 1~n-1第二趟:1, 2~n-1.....应用场景 最好最坏情况时间复杂度都是O(n^2) 空间复杂度为O(1) 最坏情况:对相对有序的一组数据排序 不稳定 由其交换引起的 适用于数量不大并且交换次数少的情况下*/void Selec...
2018-08-18 14:36:09
191
原创 进程及多进程编程
第一部分 进程知识总结 一、进程的定义进程是执行中的程序,就类比于一出舞台剧的整个表演过程;进程动态性的实质是进程实体的执行过程;进程独立性是指每个进程都有自己的PCB;进程的并发性是内存中可以允许存在多个进程实体,并且可以同时运行一...
2018-08-17 15:05:56
11663
1
原创 继承与多态
一、继承继承1.本质:实现代码复用2.继承与派生 基类Base 派生类Derive 基类Base派生了派生类Derive 派生类Derive继承了基类Base Derive is a kind of Base 比如学生是人 但是人不一定是学生 继承方式:public protected private 3.继承的内容 基类的成员变量 成员方法 作用域 4.不被继承...
2018-08-16 19:33:30
212
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人