关于stl标准库里的list的删除

使用C++ STL里的list 我刚开始用的是remove();
这个方法现在发现真的是捉襟见肘。
因为每次移除是按值匹配移除,
所以相同的值的所有元素都被移除:

例子,转置一个链表的一段值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//程序详见:
template<class T>
void ReverseInPart( T & L ,int n )
{//实现功能的主要部分,反转f到t的f-t个元素
    cout << "Enter two number as changed form and to :" ;
    int f, t ;
    cin >> f >> t ;

    if(f >= t || t > n || f < 1)
    {
        cout  << "Do not need reverse!\n" ;
                return;
    }

    Literator lt= L.begin();
    int l = 1 ;
    while ( l < f)
    {
        lt++;
        l++ ;
    }
    Literator ch = lt ;//使用迭代器来完成
    ++ch;
    //迭代器始终指向一个元素的位置,所以lt迭代器每次都前移
    //而ch每次指向下一个元素,即第i+1个元素
    for(int i = f ; i < t ; ++i,--lt)
    {
        int x =  *ch ;

        ++ch;
        //由于remove会删除所有值为*ch 的元素,所以ch 应该先增加
        //使用erase更方便,详见gx/abort_stl_list
        L.remove(x);
        L.insert(lt,x);
    }
//remove void remove( const TYPE &val );删除所有值为val的元素
}

可以看出如果输入链表元素都是不同的值的话都无所谓
比如说 1→2→3→4→5,现在逆转2~5
得到:1→5→4→3→2
但是如果输入中有相同的数就会发生错误,
如原链表:1→2→2→1
(其实是个镜像链表,这个在《程序员面试算法》的第17题有体现)
逆转3~4后,L.remove(x);这里x值为1时,
将导致删除两个元素,最后得到的链表就变成了:
2→1→2
后面发现erase()这个方法,可以直接删除迭代器
指向的链表元素,这个方法是很方便的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
template<class T>
void ReverseInPart( T & L ,int n )
{//实现功能的主要部分,反转f到t的f-t个元素
    cout << "Enter two number as changed form and to :" ;
    int f, t ;
    cin >> f >> t ;

    if(f >= t || t > n || f < 1)
    {
        cout  << "Do not need reverse!\n" ;
                return;
    }

    Literator lt= L.begin();
    int l = 1 ;
    while ( l < f)
    {
        lt++;
        l++ ;
    }
    Literator ch = lt ;//使用迭代器来完成
    ++ch;
    //迭代器始终指向一个元素的位置,所以lt迭代器每次都前移
    //而ch每次指向下一个元素,即第i+1个元素
    for(int i = f ; i < t ; ++i,--lt)
    {
        int x =  *ch ;
                Literatir d_ch;
        ++ch;
        //由于remove会删除所有值为*ch 的元素,所以ch 应该先增加
        //使用erase更方便,详见gx/abort_stl_list
        L.erase(d_ch);
        L.insert(lt,x);
    }
//remove void remove( const TYPE &val );删除所有值为val的元素
}

初识C++引用&

在将左程云的《程序员面试代码指南》JAVA版转化为C++版中遇到的问题之一就是JAVA的一切皆引用:
C++引用:

1
void swap(int &a,int &b)

两种写法,比如用来交换数组a的i和j两个位置的值:
写法1:

1
2
3
4
5
6
7
8
9
10
11
//1:声明为指针型:
template<class T>
void Swap(T *a,T *b)
{
    T  tmp ;
    tmp = *a ;
    *a = *b;
    *b = tmp ;
}
//调用时:
Swap(&a[i],&a[j]);

写法2:

1
2
3
4
5
6
7
8
9
//2:声明为引用类型;
void Swap(T &a,T &b)
{
    T c = a;
    a = b ;
    b = c;
}
//调用时:
swap(list[i],list[k]);

未完待续!

关于C++的动态数组

一、动态数组的优点:
动态分配内存,用一个指针传值方便。

二、为什么我要用动态数组?
在程序中遇到数组的传递时,函数中的创建的数组由于在函数作用域
外无效,所以不能有效的传递。

三、动态数组实例:

一维动态数组:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include<iostream>
using namespace std;
int main()
{
    //使用new,在程序运行时动态分配空间
    int * arr = new int[10];
    //赋值方法和普通数组通用
    for(int i = 0 ; i < 10 ; i++ )
    {
        arr[i] = i;
    }
    //释放空间
    delete []arr;

    return 0;
}

使用new 和delete时应当注意:
1.不要使用delete来释放不是new分配的内存
2.不要使用delete来释放同一个内存块两次
3.如果使用new[]维数组分配内存,则应使用delete[]来释放
4.如果使用new[]来为一个实体分配内存,则应使用delete(没有方括号)来释放内存
5.对空指针使用delete是安全的

二维动态数组:

两种二维数组开辟空间的方法:
方法1:

1
2
3
4
5
6
7
8
9
    int r,c;//r is rows ,c is cols
    r = 5 ;
    c = 8 ;
    //method 1 to initialize a dynamic-planar arr
        int **arr = new int*[r];
    for (int i = 0 ; i <r ; ++i)
    {
        arr[i] = new int[c];
    }

上面方法的创建的二维数组是不连续的,所以需要进行寻址,
如果要进行赋初值,必须一一赋值,而不能一次用:
arr[0]={0}将arr全部赋值为0。

寻址和赋初值为0:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    //method 1 to initialize a dynamic-planar arr
   //寻址
     for(int i = 1 ; i < r ; ++i)
     {
          arr[i] = arr[i - 1] + c ;
     }
    //赋初值为0
    for(int i = 0 ; i < r ; i++)
    {
        for(int j = 0 ; j < c ; j++ )
        {
            arr[i][j] = 0;
        }
    }

方法2:

1
2
3
4
5
6
7
8
9
10
11
    //method 2 to initialize a dynamic-planar arr
    int ** arr = new int*[r];
    int size = r*c;
    arr[0]= new int[size];
    for(int i = 1 ; i < r ; i++)
    {
        arr[i] = &arr[0][i*c];
    }
    //using std::fill to fill 0
    std::fill( &arr[0][0], &arr[0][0]+r*c, 0);
    //上面的方法1寻址后即可用此方法填满

二维动态数组空间释放:

1
2
3
4
5
    for(int i = 0 ; i < r ; i++)
    {
        delete [] arr[i];
    }
    delete [] arr;

如果二维动态数组作为返回值或者参数的方法见完整函数:
https://github.com/ghostxiu/justfortest/blob/master/arr.cc

赠友姜浩

 赠友姜浩

脉乡美酒一滴醉,直言真语扰人烦。

江南才俊多腼腆,将士北转霸不言。

炼狱噬魂身百死,醉梦归来战一回。

漫地桂香皆不问,蹄踏北地血无痕。

莫做莺燕逆修心,疯癫一怒惊破天?!

打开计算机的大门,进入OPENGL的世界

第一次接触图像是在研究生前,刚去公司,老板让做了个GIS地图。呃,是cesium(依赖于一个JS库),后面做了一个简单的VR应用。但是至此为止,我仍然对计算机图形学一无所知,现在我就把我遇到过的东西写下来,希望能够帮助到后来者。

去图案书馆借了本计算机图形学(OPGL三维渲染)的书,看起来很新,2016年出版的。看了第一章介绍了OPENGL和物理渲染的区别,以及优势。结果到了第二章就傻眼了!!!作者用的OPENTK开发工具包官网已经打不开了,直接上了半截程序,也不说运行环境。做了以下尝试:
1.继续寻找opentk这个工具包;

2.SharpGL(VS2012或者2010的拓展):结果不支持咱的VS2015

3.Csgl(上了官网一看是2003年的最新版,果断放弃)

最后决定还是用C++吧,网上VS2015+Opengl的配置:

原文地址:http://blog.csdn.net/Jacketinsysu/article/details/49563139

最后我决定放弃手里那本书,换上红宝书和蓝宝书 :

[Dave_Shreiner,_The_Khronos_OpenGL_ARB_Working_Gro

[Richard_S._Wright]_OpenGL_SuperBible_Comprehensi

 

 

 

遇见,是最好的礼物

 遇见,是最好的礼物
一次次的遇见
一回回的错过
为什么我们总还有机会再见
那我就迷信一下
相信我们的宿命里有所羁绊

曾祈求上天多给一些时间于你我
但,
不知是儿时的某次贪玩
或是一不小心的懒惰
总让我错过了幸运

你是一只受伤的鱼儿
我现在只有一个小小的池塘
但我知道等你伤好
必将翱翔于海上

果子的味道很诱人
但我知道
没有成熟前摘下的只有酸涩

喜欢一个人
喜欢和她一起的日子
但我不会什么都依着妳
因为妳还是个孩子
真希望妳可以快快长大

遇见,是最好的礼物
分别,是为了更好的遇见

无题

修于列车之上

又到一年归乡日,频思家中念己人。
天音地泽留不住,唯心畏碍扫前尘!



“畏碍”通"为爱”:
此处两层含义,
一是为了前程扫清障碍,回归世界本源,
二是为了喜欢的人,奔走。
杭州风景很美,但是却不是我的故乡
为了前程,为了梦想
为了喜欢的人
我选择来的到这里
但是不知道,
当我成功时
你是否在我身边?

(No title)

逍遥生

_____________修于公元二〇一六年八月八日                  

总为俗事惹清秋,
九天炽阳妄逍遥。
凤舞氤氲拂晓去,
龙行万里根骨傲。

世风冉冉竹南扰?
红尘纷繁由它去。
烈焰熊熊凡董大,
叮铃咚隆领子妙!

Linux 下解压RAR文件的方法,安装RARlinux

由于Windows下的压缩软件是winrar

为了方便,

所以我们经常会把文件压缩后上传到服务器

下面就是Centos下解压RAR文件的方法

1.默认的yum源中是没有这个软件包的,所以我们去rarlinux的官网去找到适合紫的安装包:

http://www.rarsoft.com/download.htm(比我这边是64位的linux)

2.下载:

wget  http://www.rarsoft.com/rar/rarlinux-x64-5.4.b3.tar.gz

3.安装:

tar -zxvf rarlinux-x64-5.4.b3.tar.gz

cd rar
make

cp unrar /usr/bin/unrar

cp rar /usr/bin/rar

 

4.解压或压缩文件:

a 添加文件到操作文档

例:rar a test.rar file1.txt 若test.rar文件不存在,则打包file1.txt文件成test.rar

例:rar a test.rar file2.txt 若test.rar文件已经存在,则添加file2.txt文件到test.rar中

(这样test.rar中就有两个文件了)

注,如果操作文档中已有某文件的一份拷贝,则a命令更新该文件,对目录也可以进行操作

例:rar a test.rar dir1

c 对操作文档添加说明注释

rar c test.rar

(会出现Reading comment from stdin字样,然后输入一行或多行注释,以ctrl+d结束)

cf 添加文件注释,类似上面的c,不过这个是对压缩文档中每个文件进行注释

cw 将文档注释写入文件

例:rar cw test.rar comment.txt

d 从文档中删除文件

例:rar d test.rar file1.txt

e 将文件解压到当前目录

例:rar e test.rar

注:用e解压的话,不仅原来的file1.txt和file2.txt被解压到当前目录,就连dir1里面的所有文件

也被解压到当前目录下,不能保持压缩前的目录结构,如果想保持压缩前的目录结构,用x解压

k 锁定文档

例:rar k test.rar 锁定文档后,该文档就无法进行任何更新操作了

r 修复文档

例:rar r test.rar

当rar文件有问题时,可以尝试用该命令进行修复(鬼知道有多少用)

s 转换文档成自解压文档

例:rar s test.rar

会生成一个test.sfx的可执行文档,运行它的效果就相当于rar x test.rar,

适合于向没有rar的用户传输文件

t 检测文档

例:rar t test.rar

检测test.rar的完整性,一般压缩完大型文件准备传输前最好用这个命令来确保文件的正确性

x 带路径解压文档中内容到当前目录

例:rar x test.rar

这样解压的话,dir1就会保持原来的目录结构

centos6 X86 一键VPN安装脚本

1. 下载vpn(CentOS6专用)一键安装包
该教程仅适用于32位Centos6系列。
#wget http://www.wolfmark.org/bt/vpn_centos6.sh#chmod a+x vpn_centos6.sh

 
2. 运行一键安装包
下载后,即可运行VPN一键安装包:
#bash vpn_centos6.sh
会有三个选择:
1. 安装VPN服务2. 修复VPN3. 添加VPN用户
首先输入1,回车,VPS开始安装VPN服务. VPN服务安装完毕后会默认生成一个用户名为vpn,密码为随机数的用户来。
3. 添加VPN用户
同样运行刚才的安装包:
#bash vpn_centos6.sh
选择3,然后输入用户名和密码,OK
4. 修复VPN服务
如果VPN拨号发生错误,可以试着修复VPN,然后重启VPS
#bash vpn_centos6.sh
选择2,然后reboot
5. 常见错误
VPN连接过程可能有很多错误,下面是一些VPN连接错误的原因: 691错误
用户名或密码错误。
619错误
上层路由器不支持GRE协议。您所在网络的路由器不支持,请更换路由器,或者使用L2TP连接。
742错误
服务器不支持加密连接。取消加密即可。
错误678、错误800
服务器未开启vpn服务或远程计算机无响应。