- 博客(25)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 笔记:条款25: 考虑写出一个不抛出异常的swap函数
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。标准库std命名空间中 的swap定义如下:namespace std { template<typename T> void swap(T&a, T&b) { T temp(a); a = b; b = temp; }...
2018-07-20 00:13:19
370
2
原创 算法导论-贪心算法 -活动选择问题补充
递归的方法://res为成员变量,注意s,f数组人为地在开头加一个0,调用参数(s,f,0,n)public void recuract(int[]s,int[]f,int k,int n){ int m = k+1; while(m<=n&&s[m]<f[k]){ m = m+1; } if(m<=n){ res = res+" "+m; recuract(s,f,m,n); ..
2020-08-28 22:17:07
140
原创 算法导论-贪心算法-活动选择问题
先给出一个我写的动态规划方法的解法,求出最大活动集合中活动的个数。public class Activitychoice { //s,f是活动的开始时间和结束时间数组 public static int[] s={1,3,0,5,3,5,6,8,8,2,12}; public static int[] f={4,5,6,7,9,9,10,11,12,14,16}; public static int mmax = 0; public static int acti..
2020-08-26 22:55:08
278
原创 算法导论-动态规划-最长公共子序列(LCS)
//计算两个序列的LCS长度和序列,例如x为{A,B,C,B,D,A,B} y为{B,D,C,A,B,A}public static void calcLcs(ArrayList<Character>x,ArrayList<Character>y){ int m = x.size(); int n = y.size(); int[][] b = new int[m+1][n+1]; int [][]c = new int[m+1][n+1];...
2020-06-13 11:06:33
279
原创 算法导论-动态规划-矩阵链乘法
CSDN写公式太蛋疼,所以在Word里写完截图发这。//p 按照从左到右的顺序依次放入矩阵的长宽,例如A m*n B n*y C y*j 则p为 {m,n,y,j}public static void matrixchainorder(ArrayList<Integer> p){ int n = p.size()-1; int [][] m =new int[n+1][n+1]; int [][] s= new int[n][n+1];
2020-06-05 20:51:56
195
原创 算法导论-动态规划-钢条切割补充
问题: 在求出钢条切割的最高价格后,求出最优切割方案解: //给出价格数组p,钢条长度n,得出切割的方案。例如p ={-1,1,5,8,9,10,17,17,20,24,30},n=7,输出1,6 public static void slicepos(int[]p,int n){ int n2 = getprice4(p,n); System.out.println(n2); if(n-n2>0){ ...
2020-05-30 15:32:52
271
原创 算法导论-动态规划-钢条切割
问题:有一个长度为n的钢条,还有一个长度为n的价格表,此表对应钢条长度1至n对应的价格,如何切割钢条能得到最大的收益?解:法1: //原始的递归方法解决 public static int getprice(int[]p,int n){ if(n==0){ return 0; } int q =-1; for(int i = 0;i<n;++i){ q=Math.max(q,p[i]+get
2020-05-30 00:00:57
198
原创 笔记: 条款45: 运用成员函数模板接受所有兼容类型
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。真实指针做得很好的一件事是,支持隐式转换,继承类指针可以隐式转换为基类指针,指向non-const对象的指针可以转换为指向const对象的指针。例如有下面的一个三层继承体系中的一些转换:class Top{};class Middle:public To...
2018-07-20 16:51:49
276
原创 笔记:条款21: 必须返回对象时,别妄想返回其reference
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。以下代码中重写的operator* 以传值方式返回。效率低,内部调用构造函数,返回时调用拷贝构造、析构函数。例如下面代码调用了3次构造函数 1次拷贝构造 4次析构。(VS2015 debug版)class Rational {public: Rational(i...
2018-07-20 16:47:42
270
原创 笔记:条款28: 避免返回handles指向对象内部部分
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。注意以下代码中,外界通过调用B类的get函数可以修改B类中指针指向的成员,而get函数是个const,但其实那部分数据应该是不能改变的。class A {public: A(string&s) { a = s; } void set(string...
2018-07-20 16:44:14
165
原创 笔记:条款43: 学习处理模板化基类内的名称
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。当模板没有遇到继承时,下例可以编译通过。class companyA {public: void sendCleartext() { cout << "1" << endl; } void sendEncrypted() {...
2018-07-20 00:09:42
228
原创 笔记:条款40: 明智而审慎地使用多重继承
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。多重继承可能从一个以上的基类继承相同名称(如函数、typedef等等),例如下:class A {public: void check() { cout << "A" << endl; }};class B {privat...
2018-07-20 00:08:21
245
原创 笔记: 条款39: 明智而审慎地使用private继承
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。如果类之间的继承关系是private,编译器不会自动将一个继承类对象转换为一个基类对象。private继承意味着根据某物实现出,和复合的意义一样。通过使用复合+public继承使得继承的类无法继承它并重新定义它的虚函数,模拟java中的final或c#中的seal...
2018-07-20 00:06:44
256
原创 笔记:条款35: 考虑virtual函数以外的其它选择
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。使用non-virtual interface(NVI)手法,那是Template Method设计模式的一种特殊形式。它以public non-virtual成员函数包裹较低访问型(private或protected)的虚函数。例如:class A {pub...
2018-07-19 21:00:54
197
原创 笔记:条款33: 避免遮掩继承而来的名称
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。当发生继承时,如下所示,子类的mf1会遮挡父类中的mf1()和mf1(int), 编译器默认的行为是不允许父类中的重载函数派生到子类中,如果想在子类中使用父类中的重载函数,那么要在子类中使用using,本例中就是using A::mf1;class A {publ...
2018-07-19 20:58:16
157
原创 笔记: 条款31: 将文件间的编译依存关系降至最低
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。考虑如下程序, B.h的任何改变都会重新编译源文件,目的是解除接口和实现的耦合关系,有2种方法: Handle classes和Interface classes.第一种方法类似模拟java中的一种机制,不需要class的定义式就可以声明一个对象,本质上在java中声...
2018-07-19 20:56:08
363
原创 笔记:条款15: 在资源管理类中提供对原始资源的访问
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。一种方法是提供一个get函数,返回原始资源。另一种方法是提供隐式转换函数operator type() const { return xxx;}请记住API 往往要求访问原始资源(raw resource),所以每一个 RAII class 应该提供...
2018-07-19 20:09:38
179
原创 笔记:条款14: 在资源管理类中小心copying行为
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。当我们自己写一个使用RAII管理不在heap存储区中建立资源时,应该考虑当一个RAII对象被复制,会发生什么事情。大多数时候会选择两种可能:禁止复制 对底层资源祭出“引用计数法”正常的非heap存储区的RAII管理类如下:class Mutex {};void...
2018-07-19 20:08:34
172
原创 笔记:条款13: 以对象管理资源
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。考虑以下代码:void f() { Investment* pInv = creatInvestment(); ... ... delete pInv;}如果在…区域内抛出异常或出现return,则会导致没有释放资源,导致内存泄漏。解决此问题的方...
2018-07-19 20:05:47
175
原创 笔记:条款12: 复制对象时勿忘其每一个成分
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。 如果你声明自己的copying函数(拷贝构造,拷贝赋值),那么编译器在你做出错误的动作时不会告诉你,下面定义的copying函数没有对Defau赋值或初始化,而编译器不会管。class Defau {public: int i = 10;};class...
2018-07-19 20:03:54
169
原创 笔记:条款11: 在operator= 中处理“自我赋值”
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。有一份自我赋值不安全和异常不安全的代码如下:class Bitmap {};class Widget {private: Widget(Bitmap*pb):p(pb){ } Bitmap* p; //指向一个从heap分配而得的对象。 Widget...
2018-07-19 20:01:46
180
原创 笔记:条款9: 绝不在构造和析构过程中调用virtual函数
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。 我们原本认为构造子类对象时,如果在父类的构造函数中调用虚函数就会调用子类的虚函数,然而编译器会调用父类的虚函数,如果父类的虚函数是纯虚函数,编译器就会找不到父类虚函数的实现代码。 编译器对这种在父类中调用虚函数的做法的一个解决方案是:继承类对象...
2018-07-19 19:59:01
170
原创 笔记:条款4:确定对象被使用之前已先被初始化
这是我在阅读Effective c++中认为比较重要的部分,下面给出了我对这一节的理解,并写出对应的比较容易理解的代码。重要的的类中的构造函数是赋值而不是初始化,对于类类型name,则是先初始化再赋值,对于内置类型nums,编译器不保证会初始化。class A { A(string&name, int nums) { name = name; nums = nums...
2018-07-19 19:53:32
150
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人