- 博客(61)
- 收藏
- 关注
原创 ffmpeg常见命令
FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。百度百科告诉我们ffmppeg是用来编转码的。接下来介绍几个常用命令吧。其命令的主要格式为
2017-01-10 17:30:17
677
转载 Linux下死锁的必要条件及预防方法
在linux下产生死锁有四个必要条件(1) 互斥条件:一个资源每次只能被一个进程(线程)使用。(2) 请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。(3) 不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。(4) 循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系。避免死锁的方法:
2016-07-18 20:22:05
1027
原创 【剑指offer】如何通过先序遍历与中序遍历重建二叉树
要用代码实现重建二叉树的话,我们必须了解先序遍历与中序遍历确定二叉树的过程,如给定先序遍历序列为 1, 2, 4, 7, 3, 5, 6, 8,中序遍历序列为4, 7, 2, 1, 5, 3, 8, 6。其主要思想就是先序序列确定根节点,中序遍历确定左右子树,解析如下:(图太丑- -。意思到了就行哈)由图我们可以看出来,这实质就是一个递归问题,退出递归的限定条件我们可以用左右子
2016-07-07 23:24:40
582
原创 【剑指offer】字符串的空格替换
如何将字符串we are happy中的空格替换成we%20are%20happy这样的字符串,其主要思想是遍历一次字符串,确定空格字符的个数,然后通过空格字符的个数确定目的字符串的长度,1个空格被替换成3个字符,故,空格的个数*2+源字符串的长度+1就是新字符串的长度,之后就是拷贝与替换操作了。用两个指针分别指向新字符串和原字符串的起始位置,若没有空格则执行类似strcpy的操作,若有空格则让新
2016-07-05 18:01:01
339
原创 vim配置教程及效果图
呼~,配置了一天的vim效果图如下:这里我除了添加vinrc的配置信息,还添加了了Ctag,taglist,和WinManger插件vimrc:
2016-05-29 11:08:02
455
原创 【随笔】Linux文件的三个时间属性
Linux下的文件的三个时间属性如下:mtime(modtime) ——— 文件的修改时间 当我们对文件的内容进行改变时,文件的mtime就会发生改变例如我们队一个data文件进行vim编辑之后,其时间也会发生变化:650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/80/5C/wKioL1c-uknTGqlgAAAo-Li_
2016-05-28 18:37:15
406
原创 Linux下find函数用法汇总
打开find函数介绍,我们可以看到find函数的用途及其参数列表:650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/80/52/wKiom1c9ypyxJH5eAABX9dcPz4g456.png" title="QQ截图20160519221700.png" alt="wKiom1c9ypyxJH5eAABX9dcPz4g456.
2016-05-28 18:37:12
967
原创 【干货】位图的实现与布隆过滤器
位图是用一个btye位来表示一个数据是否存在,再通过哈希函数确定一个数据所在的位置,这样处理会使当仅需要判断一个数据在不在的时候大大的提高效率,缩小内存的使用,如一个数据为int型,而一个int型的数据构成的位图能表示32个数据的存在状态。代码实现如下:Bitmap.h:#includeclass BitMap{public: BitMap(size_t size) :_size(0)
2016-05-28 18:37:09
322
原创 【干货】C++哈希桶(开链法解决哈希冲突)类的实现
开链法(哈希桶)是解决哈希冲突的常用手法,结构如下:650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/80/11/wKiom1c1z0jiqWopAAAtDyd3Kyk688.png" title="QQ截图20160513205751.png" alt="wKiom1c1z0jiqWopAAAtDyd3Kyk688.png" />
2016-05-28 18:37:06
789
原创 LINUX下的几个常见的环境变量
环境变量是指操作系统用来指定操作系统运行环境的一些操作,linux下的常见的几个环境变量如下: PATH 指定命令的搜索路径 HOME 当前用户的主目录 HISTSIZE 历史命令的记录条数 LOGNAME 当前用户的登录名 HOSTNAME 主机名称 S
2016-05-28 18:37:03
452
原创 【代码】稀疏矩阵的压缩存储与转置算法
#include#includetemplate struct Triple{ T _value; size_t _row; size_t _col; Triple(const T& t =T(),size_t row = 0 ,size_t col = 0) :_value(t) , _row(row) , _col(col) {} };template
2016-05-28 18:37:00
446
原创 【代码】key-value模式下的哈希二次探测与简单的哈希类的实现
二次探测是避免哈希冲突的一种常见手段,思想是: 插入: 找到哈希位置(serch)->如果不冲突就插入,冲突就进行第一次探测 第1次探测: 哈希位置变为原有哈希位置加上1*1的偏移->进行插入 .... .... 第i次探测: 哈希位置变为原有哈希位置加上i*i的偏移->进行插入 知道插入完成为止。如图所示:650) this.width=65
2016-05-28 18:36:58
252
原创 堆排序算法思路详解
堆排序是一种常见的排序算法,其时间复杂度为O(logN),重要思想为建堆取极值,根据需求进行排序,如下图:650) this.width=650;" src="http://s4.51cto.com/wyfs02/M02/7F/F4/wKiom1cytEnhY-J0AAAfaiVgGAE014.png" title="QQ截图20160511122650.png" alt="wKiom1cytEn
2016-05-28 18:36:55
484
原创 【代码】c++堆的简单实现
堆对象的创建与实现的核心思想就是上调(adjustup)与下调(adjustdown)的算法思想,上调用于创建堆时,从第一个非叶子节点开始向根节点根据需求调整为大堆或者小堆 下调如图示:650) this.width=650;" src="http://s5.51cto.com/wyfs02/M00/7F/D5/wKiom1cvCpfjuPkkAAAkCLyIQjQ600.png" titl
2016-05-28 18:36:52
355
原创 二叉树的线索化算法思想详解
二叉树的线索化,这几天以来我很难掌握,今天终于想通了,哈哈,首先我们来看看二叉树线索化之后会变成什么样子,这里我们以图中的二叉树为例,图如下:650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/7F/9E/wKioL1clqWXAc9hmAAAeyeZzebo767.png" title="QQ截图20160501145538.png
2016-05-28 18:36:49
1035
原创 【代码】C++实现二叉树基本操作及测试用例
二叉树是一种常见的数据结构,这里我们需要要注意的是,二叉树的非递归的遍历。 先序遍历,中序遍历,后序遍历 这三种遍历,如果用非递归的方式实现,我们则需要借助栈这个结构,首先我们需要遍历所有左子树的左节点。进行压栈,完成压栈之后,根据不同的需求,判断是否该继续访问或者弹出亦或者是压入该节点的右子树。 层序遍历 不同于其他的遍历方式,层序遍历是以根节点为开始,依次向下,每层从左
2016-05-28 18:36:47
1582
原创 【代码】C++实现广义表及其测试用例
广义表是我第一次用递归接触链式的数据结构,其结构如下: HEAD->VAL->VAL->LINK(->HEAD.....)->VAL->...... 在这里,我们的头结点与link节点是不存储数据的,由此我们便可以定义出节点的数据结构:typedef int DataType;enum NodeType//枚举类型定义节点类型{ HEAD, VALUE, SUB,};st
2016-05-28 18:36:44
470
原创 【干货】容器适配器实现两个栈模拟队列
用两个栈模拟队列的思想就是“倒水思想”,这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下:#include#include#includestruct __TrueType//类型萃取{ bool Get() { return true; }};struct __FalseType{ bool Get() { retu
2016-05-28 18:36:41
250
原创 【智能指针的延伸】两种定制删除器的实现方法
所谓定制删除器,就是向目标模板提供一个可以自由选择析构的接口,这样做的好处就是可以使智能指针模板不再只能单独管理内存,我们还可以用它管理文件指针之类的东西。其实现方法有两种,这里我们以share指针为例。 1.传递一个类的模板参数并给出缺省值,模板中将该类设定为成员变量,通过该类(删除类)的实例化,调用类中所存的删除方法进行删除。 代码如下:#includetemplate str
2016-05-28 18:36:38
341
原创 【一张大大的图片】类和对象知识点总结
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/7D/CA/wKiom1bv7fPxfqARAAHaswz2tms830.png" title="C++面向对象.png" alt="wKiom1bv7fPxfqARAAHaswz2tms830.png" /> 自己写的如果有什么不足或者是错误,希望指出,谢谢!本文出自 “pa
2016-05-28 18:36:35
280
原创 【干货】share智能指针的模拟实现
智能指针是C++实现自动内存管理的一种手段,本质是通过对象出作用域会自动析构,让对象保存与所需管理的目标指针指向同一片动态开辟空间的地址,出作用域会自动析构。这里模拟了,boost中的share智能指针,代码如下:#pragma oncetemplateclass SharePtr{public: SharePtr(T*ptr) :_ptr(ptr), _Rcount(new s
2016-05-28 18:36:32
478
1
原创 【代码】模板动态线性表&类型萃取
当线性表这个数据结构用模板来完成时,若出现用户自定义类型(这里指的是会存在深浅拷贝的类型时如string),则这个模板的赋值运算符重载与拷贝构造就可能会出现BUG,这种BUG是源于对同一块地址进行了两次析构所导致的。为了解决这个问题,我们可以用类型萃取,当我们获取到的是不涉及深浅拷贝的线性表时,则我们调用普通的memcpy来完成复制,若涉及深浅拷贝,则我们用用户自定义类型已经重载过的赋值运算符进行
2016-05-28 18:36:29
294
原创 【技巧】通过适配器模式完成栈的数据结构
学习了模板,我们发现,c++中的众多数据结构,如栈与队列跟模板,只是方法上与线性表不同,其真正意义上的结构,也就是线性表,代码如下:template class SeqList{private : int _size ; int _capacity ; T* _data ;};// template class Container>template
2016-05-28 18:36:26
346
原创 【代码】模板实现动态线性表(无类型萃取)
动态表的模板是STL库中最常用的数据结构,其代码如下:template class SeqList{public: SeqList() :_array(new T [3]), _size(0), _capacity(3) { memset(_array,0,sizeof(T)*3); } SeqList(const T &x) :_array(new T[3]),
2016-05-28 18:36:24
245
原创 【干货】C++通过模板特化实现类型萃取实例--实现区分基本类型与自定义类型的memcpy
类型萃取是一种常用的编程技巧,其目的是实现不同类型数据面对同一函数实现不同的操作,如STL中cout的实现,它与类封装的区别是,我们并不用知道我们所调用的对象是什么类型,类型萃取是编译器后知道类型,先实现,而类的封装则是先定义类型,后实现方法。在这里我们可以用模板的特化实现其编程思想。 我们以memcpy为例,当我们拷贝的是基本类型时,只用拷贝所传递指针上的数据,如果是string类型呢,我
2016-05-28 18:36:21
973
原创 【代码】模板实现双向链表的去重、拼接、合并、排序
/* 模板实现双向链表的去重、拼接、合并、排序*/#pragma once#includetemplate struct Node{ T _data; Node *_next; Node *prev;};template class SeqList{public: SeqList() :_head(NULL), _tail(NULL) { } Seq
2016-05-28 18:36:18
602
原创 【探索】VS下实现虚继承的方法-2
上篇讲到VS下实现虚继承中成员变量的二义性与数据冗余的解决方案是怎样的,今天我们来看看虚继承的成员函数会如何。 首先,虚继承会不会重写成员函数?我们看一看如下代码:#includeusing namespace std;class A{public: void fun() { cout << "this is fun of A"<<endl; }};class B1 :
2016-05-28 18:36:15
330
1
原创 【探索】VS下虚继承实现的方法-1
C++的虚继承主要解决了数据冗余与二义性的问题,起实现方法是什么呢,我们先看一段代码。#includeusing namespace std;class A{public: int _num;};class B1 : public A{};class B2 : public A{};class C : public B1, public B2{};int ma
2016-05-28 18:36:13
423
原创 【总结】C++静态成员函数及测试用例
1.静态成员函数可以用普通函数指针储存,普通成员函数必须用类函数指针储存class A{public: static void fun() { cout << "hello world" << endl; }public: void fun2() { }};int main(){ void(*p)() = &A::fun;//用普通函数指针,正确 void (*p
2016-05-28 18:36:10
518
原创 C语言中的函数指针
1. 函数指针的定义顾名思义,函数指针就是函数的指针。它是一个指针,指向一个函数。2.函数指针的使用我们定义了一个函数指针,但如何来使用它呢?先看如下例:#include #include char * fun(char * p1, char * p2){ int i = 0; i = strcmp( p1, p2 ); if (0 ==
2016-05-28 18:36:07
200
原创 【总结】C++静态成员变量的特性总结及测试用例
静态成员变量存放于数据段,在编译时产生,故有以下特性: 静态成员变量实际为类域中的全局变量,其初始化也应与全局变量一样,不能再头文件里初始化,应与全局变量初始化的方式一样,初始化时,静态成员变量不收访问限定符限定Test.cpp:class A{ static int _num;};int A::_num = 0;//初始化成功 静态成员变量被类内所有成员变量共享,也被派生类
2016-05-28 18:36:04
269
原创 【总结】C++静态成员变量的特性总结及测试用例
静态成员变量存放于数据段,在编译时产生,故有以下特性: 静态成员变量实际为类域中的全局变量,其初始化也应与全局变量一样,不能再头文件里初始化,应与全局变量初始化的方式一样,初始化时,静态成员变量不收访问限定符限定Test.cpp:class A{ static int _num;};int A::_num = 0;//初始化成功 静态成员变量被类内所有成员变量共享,也被派生类
2016-05-28 18:36:01
361
原创 【总结】C++基类与派生类的赋值兼容规则
在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则:1.子类对象可以赋值给父类对象(切割/切片) 在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公有继承会产生“is-a”的关系,这种关系会导致子类中有结构的嵌套这父类的信息,。所以子类可以给父类赋值,期间会发生类似降级的事情,使得赋值成功。若为私有继承,则会产生“has-a”的关系,这种关系是从
2016-05-28 18:35:58
1965
原创 【总结】逆置双向链表的三种方法
双向链表的遍历要比单向链表方便很多,所以逆置方法要比单链表丰富很多,因为可以从后向前遍历,所以可以像逆置数组一样进行操作,也可以根据单链表的特性进行逆置,也可以用双链表独有的特性进行逆置。具体方法如下: 链表的类定义如下:typedef int DataType;class DSNode{public: friend class DNSList; DSNode(DataType x
2016-05-28 18:35:55
4635
原创 【C语言位运算的应用】如何按bit位翻转一个无符号整型
其实现思路如下: 将目标数值进行末尾比特位摘取,将所摘取的bit位放到一个相同类型的末尾,目标数值bit位右移,相同类型bit位左移。 C语言的位运算符:650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/7C/DF/wKiom1bZndLRecyCAABFU9abgvw125.png" title="]ERO@L4PFP
2016-05-28 18:35:53
3923
原创 双向链表的C++实现
由于单链表结构简单,但是操作起来比较复杂,所以就有了双向链表来替代单链表,其结构中比单链表多了一个指向前驱的指针,在逆序遍历上极大的提高了效率,其节点设计如下:typedef int DataType;class DSNode{public: friend class DNSList; DSNode(DataType x=0) :_data(x), _next(NULL),
2016-05-28 18:35:50
178
原创 C++单链表的设计与实现
单链表是一种常见的数据结构,c++不同于C的语言特性是封装、继承和多态。若要实现单链表,首先我们要明确什么是单链表,链表是由一个或多个节点构成的,实现链表的数据结构,我们首先是要明确的是什么是节点。 节点是由数据+该节点类型的指针组成的,如下:class SeqNode{public: friend class SeqList;//定义友元类,使链表类能够访问节点类的私有成员 Se
2016-05-28 18:35:47
625
原创 如何限制类仅能创建一个对象
方法一:利用引用计数:#include using namespace std; class Object { public: ~Object() { count=1; } Object() { if (count==0)
2016-05-28 18:35:44
333
原创 String类的实现与深浅拷贝问题
C++实现string类是理解类和对象这个概念的基础,也能了解C++语法的特性--用户对内存的自主管理,通过类创建出一个对象的过程,首先要调用构造函数,经过一系列的操作,当退出对象所在的作用域时,便会调用析构函数,C++支持隐式的调用构造、析构等函数,但经常隐式调用并不能正确的管理内存,所以我们需要重写这两个函数,以及拷贝构造,和赋值运算符的重载。 string类的结构设计 s
2016-05-28 18:35:41
445
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人