- 博客(33)
- 收藏
- 关注
翻译 Unity Manual 【翻译】—— 理解自动内存管理
原文地址: Understanding Automatic Memory Management本文翻译自Unity Manual 的 Understanding Automatic Memory Management 一节,主要介绍Unity中的内存管理、垃圾回收,及优化的做法。本文以翻译原文+注解的方式书写。理解自动内存管理当创建对象、字符串或数组时,存储它所需的内存将从...
2018-07-09 13:24:17 553
原创 Unity Shader 后处理动态效果 —— 油漆流动效果
效果如下 最近在游戏公司实习,终于真正的接触到游戏开发也算是肥宅圆梦了(#大雾),而这个看起来很奇怪的效果就是项目中的一个需求。大致说一下现在参与开发的游戏项目吧,项目是一个FPS手游,不同的是发射出去的“子弹”是类似油漆样的颜料,会在地图上涂上颜色,这个屏幕特效就是用来实现玩家被敌方颜料击中时的屏幕效果。之前项目对于这个需求的实现方式是采用一个面片播放帧动画,然后遮挡在屏幕前,当时的效...
2018-07-06 10:59:05 10035 1
原创 PAT A1044 二分查找
1044. Shopping in Mars (25) 题意给出一个序列和一个定值M,要求找出和为M的子串,如果没有这样的子串,那么要求找出和大于M且和最小的子串标准输入 16 15 3 2 1 5 4 6 8 7 16 10 15 11 9 12 14 13 标准输出 1-5 4-6 7-8 11-11思路 其实这是一个求子列和的问题,不过有一些限制,不必列
2018-01-24 14:51:57 635
原创 PAT A1022 搜索与格式化输入
PAT A 1022 Digital Library A 1022这题主要涉及两点数据的组织及搜索格式化读入数据数据组织及搜索这题数据量大(struct Book{ int book_id,published_year; string title, author, publisher; vectorstring> key_wor
2018-01-14 16:05:42 506
原创 OJ 单链表
PAT中有关链表的题一般都是用顺序结构来表示,即将链表的节点储存在一个很大的数组中,数组下标就是节点的地址,节点结构中有一个next成员,储存着逻辑上下个节点的下标,用-1来表示空值。//基本的节点结构struct Node{ //数据 int data; //下个节点的坐标 int next;};考察范围无非增查删改反转这些,有一个方法可以在不破坏
2018-01-13 18:02:39 650
原创 OJ 数据结构:树——建树
根据题目要求不同,建一颗树有以下几种方式按给定序列依次插入节点建树 适用BST按非叶节点的孩子节点信息建树 适用一般树按中序遍历序列+其他一种遍历序列建树 适用于二叉树给定序列插入建数 适用BST 如 PAT A 1043实现//这种情况适合使用 双链表 结构//因此结顶结构定义为struct Node{ int data; shared_ptr<Node> le
2018-01-10 22:01:58 2462
原创 OJ 如何实现一个按输入顺序排列的映射?
考虑这样一种需求: 输入若干个字符串,记录所有输入的字符串和它们出现的次数,然后按输入的次序输出结果。输入: aaa bbb aaa ccc zxc ccc输出 aaa 2 bbb 1 ccc 2 zxc 1无论map还是unordered_map都是不符合要求的,map会将键值按字典序排列,而unordered_map则是按照键值的hash值,
2018-01-07 15:25:19 421
原创 C++ 关联容器
不同于顺序容器,关联容器根据元素的键(key_type)来组织元素。 关联容器有 set 和 map 两类,根据unordered、multi修饰共衍生出8种关联容器。 一般根据是否有序来划分:有序关联容器mapmultimapsetmultiset无序关联容器unordered_mapunordered_multimapunordered_setuno
2018-01-05 21:51:06 509
原创 PAT A1040 最长子回文串
回文串正反看都一样的字符串称作回文串 有AA,ABA两种形式:AA 形如 xxxxAAxxxxABA 形如 XXXXABAxxxxA1040 Longest Symmetric StringGiven a string, you are supposed to output the length of the longest symmetric sub-string
2018-01-04 21:52:19 1273
原创 PAT A1060字符串处理
处理字符串的实用函数字符串处理是PAT基础题中较难的一种,一般不涉及数据结构的知识,基础但并不容易AC,有很多边界情况要考虑。 使用字符数组的方法处理字符串非常麻烦和琐碎,使用string的函数以及STL一些与字符串有关的函数可以使问题更清晰简单 string相关函数string str = "hello world~";//#1 str.substr返回子串的拷贝string s1 = str
2018-01-03 17:25:20 509
原创 OJ string的额外操作
string作为一种顺序容器,除了支持insert、assign、erase、push_back、pop_back、取地址符外,还支持构造string的其他方法string s(cp,n) 从char*指向的字符数组拷贝n个字符string s(cp) 从以’\0’结尾的字符串拷贝整个字符串string s(s2,pos2,len2) 从另一个string 的pos2位置拷贝len2个字
2017-12-30 18:43:42 412
原创 OJ 简单数学问题
最大公约数gcd和最小公倍数lcmgcd(greatest common divisor) 根据欧几里得算法,a、b的最大公约数与b、a%b的最大公约数相同; 任何数与0的最大公约数为它本身 因此有int gcd(int a,int b){ return !b?a:gcd(b,a%b);}lcm(lowest common multiple) 最小公倍数可
2017-12-29 11:21:48 579
原创 OJ之格式控制
printf及格式控制符由于性能及输出格式灵活性的考虑,OJ中更常用printf来输出基本类型输出说明符 其他进制输出整型数 八进制 %o 十六进制 %x 二进制 算法实现格式控制 sscanf和正则表达式和c++的stringstream类似,但对于筛选字符更加灵活,可以与string
2017-12-25 14:36:45 405
原创 数据窃取——移动操作
右值引用C++11标准中引入了一种新的引用类型——右值引用(rvalue reference),右值引用必须绑定到一个右值上,用&&来获取右值引用。右值左值表示一个对象的身份,如: 返回左值引用的函数、下标、解引用、前置递增/递减运算符而右值表示一个对象的值 返回非引用类型的函数、算数运算符、位运算、逻辑运算符、后置递增/递减运算符我们看出右值有以下特点右值没有其他用户 右值是无名的
2017-12-14 15:19:42 2231
原创 unique_ptr的使用和陷阱
unique_ptr的使用分配内存与shared_ptr不同,unique_ptr没有定义类似make_shared的操作,因此只可以使用new来分配内存,并且由于unique_ptr不可拷贝和赋值,初始化unique_ptr必须使用直接初始化的方式。unique_ptr<int> up1(new int()); //okay,直接初始化unique_ptr<int> up2 = new i
2017-12-07 15:07:12 14099
原创 shared_ptr的使用和陷阱
shared_ptr的使用分配内存make_shared//make_shared<int>分配一块int类型大小的内存,并值初始化为100//返回值是shared_ptr类型,因此可以直接赋值给spshared_ptr<int> sp = make_shared<int>(100);new接受指针参数的只能指针构造函数是explicit的,因此,我们不能将一个内置指针隐式转化为一个只能指
2017-12-06 20:37:03 13274 6
原创 动态内存与智能指针
程序中内存分配有以下五种:栈区 存放局部变量、函数参数等,由编译器自动分配,变量离开作用域后自动收回内存,可分配的内存空间较小。void func(int _a);int main(){ int a = 5; //局部变量a存放在栈区 func(a); //参数值存放在栈区}堆区 由程序员手动分配与回收,分配内存后生存期直
2017-12-06 18:54:45 2902
原创 C++ 严格弱序
什么是严格弱序?C++关联容器的有序容器对元素关键字的类型有要求,元素关键字的类型必须定义了严格弱序(stick weak ordering) 拿内置类型来说,C++都定义了 “<”操作符,这就是一个严格弱序,而“<=”就不是一个严格弱序严格弱序有什么用?对于内置类型我们自然可以有<、>、=来判断两个值的大小关系,而对于自定义的类类型,为它定义三种比较操作符是没有必要的,只用一个严格弱序(这里就用
2017-11-23 20:40:37 7659 6
原创 再探迭代器
除了为每个容器定义的迭代器以外,标准库在头文件 iterator 中还定义了额外4种迭代器 插入迭代器 、 流迭代器 、 反向迭代器 、 移动迭代器插入迭代器基本介绍插入器是一种迭代器适配器,接受一个容器,生成一个插入迭代器vector<int> vi;auto it = back_inserter(vi);//back_inserter是插入器//it是其生成的对应容器vi的插入器对插
2017-11-10 15:40:42 437
原创 谓词与lambda、bind
谓词(predicate)标准库中定义了一类可以“定制操作”的算法函数,这类函数接收一个参数,这个参数与以往我们所认识的参数不同,它是一个可调用的对象,其返回结果是一个能用作条件的值。 这个参数就是谓词。 我们通过谓词来定制特定的操作。 谓词分为一元谓词和二元谓词,表示可调用表达式接收一个还是两个参数。 谓词的使用例子:bool isShorter(const string &s1,const
2017-11-09 17:07:58 510
原创 顺序容器操作
容器大小操作empty() 返回bool值,容器为空时true,非空时falsemax_size() 返回一个大于或等于该类型容器所能容纳的最大元素个数(即size()一定不超过max_size())。size() 返回容器中元素的个数,但forward_list不支持size() 原因如下: forward_list的设计目标是达到与最好的手写单向链表的数据结构性能相当,而实现si
2017-11-05 20:31:52 300
原创 容器拷贝
在容器的初始化和赋值时常常会对另一个容器(或部分容器)进行拷贝 下面就来讨论下容器拷贝时的一些规则 容器的定义及初始化有以下几种方式(并不全是拷贝)默认构造函数Container c; //如果Container是array,则按元素默认值初始化;否则c为空指定大小的构造函数Container seq(n); //n个元素,默认值初始化Container
2017-10-31 16:58:51 572
原创 顺序容器概述
什么是顺序容器? 元素在容器中的排列次序只与元素加入容器的次序有关,可以按照顺序访问元素。顺序容器大致分为两类 按照元素在内存中储存的方式,可以将顺序容器分为连续储存和离散储存两种连续储存的顺序容器 容器在内存中占据一整块连续的内存空间,元素在容器中的排列方式就是在物理内存中的排列方式。这样的顺序容器有两个特点:可以随机访问元素在容器中间插入或删除元素,由于要保持元素在内存中的连续
2017-10-31 15:38:26 543
原创 C++类的静态成员
类的静态成员由整个类所共享,而不属于任何一个对象。声明静态成员在成员的声明之前加上static来将它声明为静态成员。 类的静态成员可以是常量、引用、指针、类类型,也可以是public或privateclass A{public: static double rate(){return interestRate;} static void rate(double);
2017-10-24 19:15:05 666
原创 隐式的类类型转换
转化构造函数 如果构造函数只接受一个实参,则它实际上定义了转化为此类类型的隐式转换,我们把这种构造函数称作转换构造函数(converting constructor)。举一个栗子class A{public: A(string _str):str(_str){} //这个只接受一个参数的构造函数就是转换构造函数 void Show() {
2017-10-23 22:08:26 523
原创 C++中的强制类型转换
C++中有五种强制类型转换static_castconst_castreinterpret_castdynamic_cast旧式(C风格)强制类型装换 下面一一介绍static_cast 只要不包含底层const,都可以使用/* static_cast<type>(exp) 将exp的结果转化为type类型*/double d = 10;void *vp = &d;d
2017-10-23 20:51:42 323
原创 类的const成员函数
类的const成员函数class Sales_data{public: string Get_isbn() const {return bookNo;} //const成员函数pritvate: string bookNo;}; 定义为const的成员函数 不可以修改类的数据成员(只读) 在成员函数内使用类的数据成员时,实际上隐式的引入了 this //以
2017-10-18 19:57:54 808
原创 Chapter6 函数
参数传递 形参初始化的机理与变量初始化一样,分为传值(拷贝)和传引用传值参数只是将实参的值拷贝后传入,完成这个过程后,再与实参对象本身无关。 因此,在赋值与传参时,会忽略掉实参的顶层const NOTE 因为忽略顶层const的特性,顶层const不能作为函数重载的参数区分void func(int a);void func(const int a); //er
2017-10-11 12:05:34 265
原创 Chapter5 语句
switch内部的变量定义switch的执行流程有可能会跨过某些case标签,若果被跳过的case中含有变量的声明,则此声明也会被跳过,但它下面的case仍在变量的作用域中。因此 在需要为某个case定义并初始化一个变量时,应该加上{大括号}将变量的作用域限定在case内case true:{ string str = "aaa"; //str仅在块内有效}
2017-10-05 11:05:02 237
原创 Chapter4 表达式
求值顺序只有4种运算符明确规定了运算对象的求值顺序. 即: 1.逻辑与 (&&) 先求左侧,且只有在左侧值为真时才求右侧 2.逻辑或 (||) 先求左侧,且只有在左侧值为假时才求右侧 3. 条件 (? :) cond?expr1:expr2,先求cond的值,如果为真执行expr1,为假执行expr2 4.逗号
2017-10-02 13:10:39 233
原创 Chapter3 字符串、向量和数组
字符串字面值与string对象相加 1. 字符串字面值与string是不同的类型 2. 字面值与string类型对象相加时,必须确保每个加法运算符(+)的两侧至少有一个string对象string str1 = "hello";string str2 = str1 + "world"; //合法string str3 = "hello" + "world
2017-09-29 16:56:06 250
原创 Chapter2 变量和基本类型
4种变量初始化的方法int val = 0;int val = {0}; //C++11int val{0}; //C++11int val(0); 这种用花括号初始化的方法称作为”列表初始化 “, 这种初始化有一个重要特点:当进行有丢失信息风险的初始化行为时, 编译器将会报错.long double ld = 3.1415926;int a{ld},b={l
2017-09-20 22:10:40 387
原创 Chapter1 开始
关于CinCin返回了什么?int val;cout<<typeid(cin>>val).name();//输出为class std::basic_istream<char,struct std::char_traits<char> >//是一个istream对象 Cin返回了一个istream对象.作为条件判断语句int val;while(cin>>val);cout<<"输入了
2017-09-20 20:54:56 269
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人