DREAM OF TECHNICAL ACHIEVEMENT

0%

STL(标准模板库)理论基础

基本概念

STL(Standard Template Library,标准模板库)是惠普实验室开发的一系列软件的统称。现然主要出现在C++中,但在被引入C++之前该技术就已经存在了很长的一段时间。

STL的从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),容器和算法通过迭代器可以进行无缝地连接。几乎所有的代码都采 用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。在C++标准中,STL被组织为下面的13个头文 件:<algorithm>、<deque>、<functional>、<iterator>、<vector>、<list>、<map>、<memory>、<numeric>、<queue>、<set>、<stack><utility>

阅读全文 »

说到类型转换我们不得不提起C语言的类型转换,简单粗暴.
Type t = (Type) 123

c++ 类型转换

类型 描述
static_cast 一般的转换
dynamic_cast 通常在基类和派生类之间转换时使用
const_cast 主要针对const的转换
reinterpret_cast 用于进行没有任何关联之间的转换,比如一个字符指针转换为整形数

static_cast

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
38
39
40
41
42
43
44
45
46
47
#include <iostream>
using namespace std;
// static_cast
class Building{};
class Animal{};
class Cat : public Animal{};
void test1(){
int a = 97;

// 普通类型
char c = static_cast<char>(a);
cout << c << endl;

// 转换具有继承关系的对象指针 父转子
Animal *ani = NULL;
Cat *cat1 = static_cast<Cat *>(ani);

// 转换具有继承关系的对象指针 子转父
Cat * soncat = NULL;
Animal *ani1 = static_cast<Animal *>(soncat);

// 转换具有继承关系的对象引用 父转子
Animal aniobj;
Animal &animal = aniobj;
Cat &cat = static_cast<Cat &>(animal);

// 转换具有继承关系的对象引用 子转父
Cat catobj;
Cat &catref = catobj;
Animal &ani2 = static_cast<Animal &>(catref);

// 基础数据类型指针 错误
// error: static_cast from 'int *' to 'char *' is not allowed
// int *p = NULL;
// char *sp = static_cast<char*>(p);

// 对象指针 错误
// error: static_cast from 'Building *' to 'Animal *', which are not related by inheritance, is not allowed
// Building *bui = NULL;
// Animal *ani = static_cast<Animal *>(bui);

}

int main() {
test1();
return 0;
}
阅读全文 »

为了交换不同类型的变量的值,我们通过函数重载定义了四个名字相同、参数列表不同的函数.如下示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
//交换 int 变量的值
void Swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
//交换 float 变量的值
void Swap(float *a, float *b){
float temp = *a;
*a = *b;
*b = temp;
}
//交换 char 变量的值
void Swap(char *a, char *b){
char temp = *a;
*a = *b;
*b = temp;
}
//交换 bool 变量的值
void Swap(bool *a, bool *b){
char temp = *a;
*a = *b;
*b = temp;
}

阅读全文 »

本实现案例是参考三国诸葛亮锦囊妙计为例写demo:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include <iostream>

using namespace std;

// 定义拆开锦囊方法的类型 可以作为左值 指向函数 TIPS *tp;
typedef void(TIPS)(void);

// 定义tip结构
struct tip
{
// 发送人
char from[64];
// 接受人
char to[64];

// 锦囊的内容 指向void tip*这些函数
TIPS *tp;
};

//打开锦囊
void open_tips(struct tip *tip_p){
cout << "打开了锦囊" << endl;
cout << "此锦囊是由" << tip_p->from << "写给" << tip_p->to << endl;
cout << "内容是" << endl;
// 通过指针调用 tip*函数
tip_p->tp();
}

// 创建锦囊
struct tip* create_tip(const char *from, char *to, TIPS *tp){
struct tip *temp = (struct tip*)malloc(sizeof(struct tip));
if(temp == NULL){
return NULL;
}
strcpy(temp->from, from);
strcpy(temp->to, to);
temp->tp = tp;

return temp;
}

// 销毁锦囊
void destory_tip(struct tip * tp){
free(tp);
}
///////////// 实现层 ///////////////
void tip1(void)
{
cout << "一到东吴就拜见乔国老" << endl;
}
void tip2(void)
{
cout << "如果主公乐不思蜀,就谎称曹贼来袭.赶快回来" << endl;
}
void tip3(void)
{
cout << "如果被孙权追杀,就向貂蝉求救" << endl;
}


int main() {
//
struct tip *tp_1 = create_tip("孔明","赵云",tip1);
struct tip *tp_2 = create_tip("孔明","赵云",tip2);
struct tip *tp_3 = create_tip("孔明","赵云",tip3);

cout << "刚刚来到东吴,赵云打开了第一个锦囊" << endl;
open_tips(tp_1);
cout << "====================================" << endl;
cout << "刘备乐不思蜀,赵云打开了第二个锦娘" << endl;
open_tips(tp_2);
cout << "====================================" << endl;
cout << "孙权大军追杀,赵云打开了第三个锦娘" << endl;
open_tips(tp_3);

destory_tip(tp_1);
destory_tip(tp_2);
destory_tip(tp_3);
return 0;
}
阅读全文 »

c++ 写了一个函数:

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
#include <iostream>

using namespace std;

typedef void(TIPS)(void);

struct tip
{
char from[64];
char to[64];

TIPS *tp;
};

struct tip* create_tip(char *from,char *to, TIPS *tp){
struct tip *temp = (struct tip*)malloc(sizeof(struct tip));
if(temp == NULL){
return NULL;
}
strcpy(temp->from, from);
strcpy(temp->to, to);
temp->tp = tp;

return temp;
}
阅读全文 »

用户账户管理

Linux/Unix是一个用户、多任务的操作系统;在讲Linux账号及账户组管理之前,先简单了解一下多用户、多任务操作系统的基本概念。

Linux的单用户多任务

在Linux下,当你登录后,你也可以同时开启很多的服务任务和进程,而各自服务都会跑的很好却对其他任务没有任何影响,这种登录一个用户登录系统执行多个服务任务和进程的情况,就称为单用户多任务。

Linux的多用户多任务

有时可能是很多用户同时用同一个系统,如公司几十个运维人员,每台机器都可以和被若干个运维人员登录部署或解决相关故障问题,但并不是所有的运维人员都要做同一件事,所以就有了多任务、多用户的情况。

值得注意的是:多用户、多任务并不是大家同时挤到一起,在一台机器的键盘和显示器前来操作机器,多用户可能是通过SSH客户端工具等远程工具等远程登录服务器来进行,比如对服务器的运程控制,只要具有相关用户的权限,任何人都是可以上去操作访问服务器。

阅读全文 »

概念

在linux系统中,链接可以分为两种:

一种被称为硬链接(Hard Link);另一种被称为软连接或者符号连接(Symbolic Link)。

在默认不带参数情况下,执行ln命令创建的链接是硬链接, 执行 ln -s 命令创建的连接是软连接

硬链接

硬链接是指通过索引节点来进行链接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都会给它分配一个编号,这个编号被称为索引节点编号(Inode Index)或Inode。

在Linux系统中,多个文件名指向同一索引节点(Inode)是正常且允许的。一般这种连接就称为硬链接。硬链接的左右之一是允许一个文件拥有多个有效的路径名,这样用户就可以就爱能力硬链接到重要的文件,以防止“误删”源数据,那么为什么给文件建立了硬链接就会防止数据误删除呢?

因为文件系统的原理是只要文件的索引节点(Inode Index)还有一个以上的链接(仅仅删除了该文件指向)只删除其中一个链接并不影响索引节点本身和其他的链接(即数据文件实体并未删除),只有当最后一个连接被删除后,此时如果有新数据要存储到硬盘时,被删除文件的数据块及目录的链接才会被释放,空间被新数据占用覆盖。此时,数据就再也无法找回了

阅读全文 »

命令总结

命令 描述
mkdir 创建目录的命令(-p 递归创建) make directorys
ls -l(long)d(directory)显示目录或者文件 全称list
cd 切换目录层次change directory
echo 打印输出内容
vi/vim 记事本编辑器 命令模式(:wq,:q,:q!,:wq!) 插入模式按esc键
vimdiff 比对文件改修
visudo 编辑sudo配置文件 vi /etc/sudoers
cat 查看文件内容
cp -apr 拷贝文件或者目录(cp -r)
mv 移动文件或者目录
rm 删除文件或者目录 强制删除(-rf)
rmdir 删除空目录
head 显示文件头部(-行数 显示行数)默认10行
tail 显示文件尾部(-行数 显示行数)默认10行
grep 过滤命令,级别为行(-v 是排除)
egrep 相当于grep -E过滤多个字符串
sed 取文件内容 -n取消默认输出 p=pring d=delete
tree 打印文件夹树状结构
man 查询命令帮助文档
touch 创建空文件/更新已存在文件的时间
which 查看命令所在路径
alias 别名命令
unalias 取消别名
find 查找命令 -type(f d) -name 按照名字查找 -mtime按照修改时间
seq 用于以指定增量从首数开始打印数字到尾数
xargs 将参数列表转换成小块分段传递
pwd 显示当前所在路径
history 查看命令历史记录
useradd/adduser 添加账号
passwd 修改密码
whoami 查看当前账号
su 切换用户 (su - 切换环境变量)
sudo 普通用户拥有root权限
getenforce 查看当前SELinux的应用模式
setenforce 设置当前临时SELinux的应用模式
runlevel 查看当前linux运行级别
init 切换运行级别
chkconfig 查看启动项或设置启动项命令
netstat 用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况.
source 通常用于重新执行刚修改的初始化文件,使之立即生效,而不必注销并重新登录。
lsof 列出当前系统打开文件的工具
last 显示最后登录过的用户列表
lastlog 显示最近用户登录的信息
file 查看文件类型
stat 显示 文件/文件系统 的详细信息
less 和more类似,但其优点可以往前翻页,而且进行可以搜索字符
more 根据窗口大小,一页一页的现实文件内容
dumpe2fs 查看格式化之后的文件系统信息
wc (Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。
ln 创建连接文件 -s软连接
tar 打包命令,zcvf打包组合,解包组合zxfv,
阅读全文 »

c语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是c语言的灵魂,一点都不为过。通过本文,向大家深入浅出指针.

概述

指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型、指针所指向的类型、指针的值或者叫指针所指向的内存区、指针本身所占据的内存区。让我们分别说明。

例一:

1
2
3
4
5
int *p;			//指针的类型是int*	所指向的类型是int
char *p; //指针的类型是char* 所指向的的类型是char
int **p; //指针的类型是int** 所指向的的类型是int*
int (*p)[3]; //指针的类型是int(*)[3] 所指向的的类型是int()[3]
int *(*p)[4]; //指针的类型是int*(*)[4] 所指向的的类型是int*()[4]

阅读全文 »

最近一直在忙深圳的项目,由于商业机密这里就不说那个公司了。所有功能都写完了,过来和对方研发对接的时候遇到一个很奇怪的问题这里就分享一下解决方法。

json_decode异常处理方法

当我们使用json decode的时候返回了null,可以使用json_last_error来查看返回码。

JSON 错误码

返回值 常量 含义 可用性
0 JSON_ERROR_NONE 没有错误发生
1 JSON_ERROR_DEPTH 到达了最大堆栈深度
2 JSON_ERROR_STATE_MISMATCH 无效或异常的 JSON
3 JSON_ERROR_CTRL_CHAR 控制字符错误,可能是编码不对
4 JSON_ERROR_SYNTAX 语法错误
5 JSON_ERROR_UTF8 异常的 UTF-8 字符,也许是因为不正确的编码。 PHP 5.3.3
6 JSON_ERROR_RECURSION One or more recursive references in the value to be encoded PHP 5.5.0
7 JSON_ERROR_INF_OR_NAN One or more NAN or INF values in the value to be encoded PHP 5.5.0
8 JSON_ERROR_UNSUPPORTED_TYPE 指定的类型,值无法编码。 PHP 5.5.0
9 JSON_ERROR_INVALID_PROPERTY_NAME 指定的属性名无法编码。 PHP 7.0.0
10 JSON_ERROR_UTF16 畸形的 UTF-16 字符,可能因为字符编码不正确。 PHP 7.0.0
阅读全文 »