C++ 11 智能指针 lamda 以及一个 围棋程序

lamda表达式使用

1     char* p = "Hello world";
2     int ne = 0,nl = 0;
3     for_each(p,p+11, [&](char i){ if(i=='e') ne++; if(i=='l')nl++; });
4     cout<<"e: "<< ne <<endl<<"l: "<<nl<<endl;

 

for_each 第三个参数 原来应该是函数

此处用lamda表达式完成

智能指针使用

我不知道循环右移如何使用智能指针

就在一个函数里面完成了循环右移

因为智能指针有以下功能

当智能指针本身被删除释放的时候(比如,离开了某个作用域),会使用给定的删除器释放它指向的对象

所以我在函数内使用了智能指针,希望函数结束,申请的空间自动释放

1 void move(int x){
2     auto s =  unique_ptr <string>(new string("Hello world!"));
3     auto ss = s.get();
4     auto i = (*ss).end();
5     for_each (i-x%(*ss).length(),i,[&](char a){cout<<a;});
6     for_each ((*ss).begin(),i-x%(*ss).length(),[&](char a){cout<<a;});
7 }

 

以上两个作业我写在了一个文件中

 1 #include<iostream>
 2 #include <algorithm>
 3 #include<string>
 4 #include<memory>
 5 using namespace std;
 6 
 7 void move(int x){
 8     auto s =  unique_ptr <string>(new string("Hello world!"));
 9     auto ss = s.get();
10     auto i = (*ss).end();
11     for_each (i-x%(*ss).length(),i,[&](char a){cout<<a;});
12     for_each ((*ss).begin(),i-x%(*ss).length(),[&](char a){cout<<a;});
13 }
14 
15 
16 int main(){
17     char* p = "Hello world";
18     int ne = 0,nl = 0;
19     for_each(p,p+11, [&](char i){ if(i=='e') ne++; if(i=='l')nl++; });
20     cout<<"e: "<< ne <<endl<<"l: "<<nl<<endl;
21 
22     int x;
23     cin>>x;
24     move(x);
25     return 0;
26 }
View Code

运行截图

 

围棋

1.写代码 

看了大半夜 终于看懂这代码了

恢复棋步就是需要一下几个步骤

先把下的那个子去除  removeStone();

再把DeadGroup中的死棋拿出来恢复

再更新一下m_gmLastMove

 

public void playPrev(GoMove gm)
        {
            Point a = gm.Point;

            //先移除该棋子
            Grid[a.X,a.Y].removeStone();

            //判断是否有死棋  且不是自己作死的棋
            if (gm.DeadGroup != null && gm.DeadGroupColor != gm.Color)
            {
                foreach (Point p in gm.DeadGroup)
                {
                    Grid[p.X,p.Y].setNoKilled();
                    Grid[p.X, p.Y].setStone(gm.DeadGroupColor);
                }
            }

            m_gmLastMove = gameTree.peekPrev();
            if (m_gmLastMove != null)
                Grid[m_gmLastMove.Point.X, m_gmLastMove.Point.Y].setUpdated();

            optRepaint();
            return; 
        }

2.根据你选择的教材 (三本之一或更多),点评一下这个程序设计方面的不足

 感觉这个程序写的很随意  一些类和方法都是什么构造出来但却不使用

不足有以下几点

1.有些函数作用不够清晰,或者说封装不合适

2.有些变量命名难以让人理解 如int m_n 乍一看还以为是一个不是很重要的变量 实际却是棋步数  而其他地方的棋步数却是seq  应该用m_seq比较合适

3.整个代码结构感觉混乱

4.错不处理不行

但是如果这是一个java大作业的话  我觉得已经可以接受了。

 

代码分析工具

 

这些警告太多了。。。就不一个一个更改了

我查看了一下主要分为几类

1.标示符大小写问题

2.标示符命名要有意义 别老是就m,n,i,j,k

3.丢失范围之前释放对象

4.尽量使用私有化成员

3.代码注释

已经上传github

posted @ 2013-11-25 01:16  月月鸟在前进  阅读(802)  评论(0编辑  收藏  举报