this指针转化为智能指针的正确方式

在C++类内部的非静态成员函数内部,是不能将this指针强制转化成shared_ptr,这样的行为是非常危险的,因为this指针是普通指针,而将普通指针强制转化成智能指针是非常非常非常危险的,有可能导致内存被意外释放。

在class内部,获得this指针的shared_ptr,需要class继承std::enable_shared_from_this,示例代码如下: Read more

正则表达式零宽断言详解

基本概念

零宽断言正如它的名字一样,是一种零宽度的匹配,它匹配到的内容不会保存到匹配结果中去,最终匹配结果只是一个位置而已。
作用是给指定位置添加一个限定条件,用来规定此位置之前或者之后的字符必须满足限定条件才能使正则中的字表达式匹配成功。
注意:这里所说的子表达式并非只有用小括号括起来的表达式,而是正则表达式中的任意匹配单元。
javascript只支持零宽先行断言,而零宽先行断言又可以分为正向零宽先行断言,和负向零宽先行断言。 Read more

centos 7 远程连接 ssh connection refused

问题描述:

使用SSH无法连接到远程主机,提示

ssh: connect to host xxx.xxx.xxx.xxx port 22: Connection refused

解决方案:

  1. 使用远程主机供应商所提供的网页版termianl或其他在目前状态下可以连接上远程主机的方法连接远程主机;
  2. 首先查看ssh服务是否安装或启动,service sshd status
  3. 如果提示ssh没有安装,则安装之,sudo yum install openssh-server openssh-client
  4. 如果提示ssh服务没有启动,则启动之,service sshd start
  5. 如果ssh服务已启动,依旧无法使用连接,先测试一下本地是否可以连接,ssh localhost
  6. 如果还是connection refused,则查看ssh配置:vim /etc/ssh/sshd_config,要配置的项及值如下图所示。需要注意的是,配置项Port一定要在配置项ListenAddress之前,并确保配置文件的其他地方没有上述两个配置项的配置
  7. 完成之后重启ssh服务加载最新配置,service sshd restart,此时ssh localhost命令生效
  8. 给防火墙开端口,/sbin/iptables -I INPUT -p tcp --dport 8080 -j ACCEPT
  9. 开完端口重启防火墙,service iptables restart

到此为止,远程连接 ssh connection refused的问题就得到了解决,可以尝试在本地使用ssh连接一下远程服务器。

 

C++经典面试题(最全,面中率最高)

1.new、delete、malloc、free关系

delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C++语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。注意new/delete不是库函数。 Read more

C++知识点

操作符重载

赋值运算符重载

  • 返回值的类型为引用,并在函数结束前返回实例自身的引用(*this)。但是返回引用的目的不是为了允许连续赋值,因为返回实例本身也可以连续赋值。返回引用是为了提高效率。如果返回实例,赋值运算符重载函数会自动调用拷贝构造函数创建一个临时对象,并在连续赋值完毕后自动调用析构函数,增加了程序开销。另外,如果没有自己定义性能良好的拷贝构造函数,会调用默认拷贝构造函数。而默认拷贝构造函数的是浅拷贝,当实例中有指针时,无法正确拷贝一个实例。需要注意的是,当返回值的类型为引用时,赋值操作符号返回一个reference(引用)指向操作符号的左侧实参(而事实上重载运算符的左侧实参就是调用对象本身)。
  • 传入的参数应该是常量引用。引用的目的是为了不调用拷贝构造函数,常量的目的是在赋值操作符重载函数中不会修改传入的参数。
  • 是否释放已有的内存。如果我们忘记在分配新内存之前释放自身已有的空间,则程序将出现内存泄漏。
  • 判断传入的参数是不是当前的实例(*this)。如果事先不判断就赋值,那么在释放自身内存后,就无法找到需要赋值的内容了。

 

 

SHELL学习笔记之分割字符串

str="/home/username/work/mydir"
OLD_IFS="$IFS"
IFS="/"
item_array=($str)
IFS=$OLD_IFS

分割后的item_array是一个数组,数组下表从0开始。

${item_array[1]}           # 获取数组的第1个元素
${item_array[*]}           # 数组的所有元素.
${item_array[@]}         # 同${names[*]}.
${#item_array[1]}         # 获取数字第1个元素的内容的长度.
${#item_array[*]}         # 获取数组中的元素个数.
${#item_array[@]}       # 同${#names[*]}.

Solution2 for GSH

#include <iostream>
#include <vector>
#include <string>
#include <climits>

int main() {

    int n;
    int temp;
    std::cin >> n;
    std::vector<int> numbers(n, 0);
    std::vector<int> dp(n, 0);
    for(int i = 0; i < n; ++i)
    {
        std::cin >> temp;
        numbers[i] = temp;
        dp[i] = i;
    }
    for(int i = 2; i < n; ++i)
    {
        for(int j = 0; j < i; ++j)
        {
            if(numbers[j] >= i - j)
            {
                dp[i] = std::min(dp[j]+1, dp[i]);
            }
        }
    }
    std::cout << dp[n-1] << std::endl;

    return 0;
}

 

Solution for GSH

#include <iostream>
#include <vector>
#include <string>

int main() {
    std::string inStr;
    int num[255] = {0};
    std::vector<int> vecPair(255, 0);
    std::cin >> inStr; // read input stream
    for(auto iter = inStr.begin(); iter != inStr.end(); ++iter)
    {
        ++vecPair[*iter];
    }
    // output
    int outputNum = 0;
    while(outputNum < inStr.size())
    {
        for(int i = 48; i <= 57; ++i)
        {
            if(vecPair[i] != 0)
            {
                --vecPair[i];
                ++outputNum;
                std::cout << static_cast<char>(i);
            }
        }
        for(int i = 65; i <= 90; ++i)
        {
            if(vecPair[i] != 0)
            {
                --vecPair[i];
                ++outputNum;
                std::cout << static_cast<char>(i);
            }
        }
        for(int i = 97; i <= 122; ++i)
        {
            if(vecPair[i] != 0)
            {
                --vecPair[i];
                ++outputNum;
                std::cout << static_cast<char>(i);
            }
        }
    }
    std::cout << std::endl;

    return 0;
}

 

tensorboard的使用方法

编写完代码之后,打开terminal,首先激活anaconda环境

source activate tensorflow

然后进入存放events.out.tfevents.xxxxxxx文件的上一层目录,即下面命令中的logs/,然后运行命令

tensorboard --logdir='logs/'

命令中的logs/是存放events.out.tfevents.xxxxxxx文件的文件夹。至于文件夹为什么是logs,而不是别的名字,是因为我在代码中写的就是logs文件夹。

然后打开终端中显示出的链接,在浏览器中查看。

Read more

shell小函数

提示错误信息

message()
{
  TITLE="Cannot start PyCharm"
  if [ -n "`which zenity`" ]; then
    zenity --error --title="$TITLE" --text="$1"
  elif [ -n "`which kdialog`" ]; then
    kdialog --error "$1" --title "$TITLE"
  elif [ -n "`which xmessage`" ]; then
    xmessage -center "ERROR: $TITLE: $1"
  elif [ -n "`which notify-send`" ]; then
    notify-send "ERROR: $TITLE: $1"
  else
    echo "ERROR: $TITLE\n$1"
  fi
}