自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(61)
  • 收藏
  • 关注

原创 ffmpeg常见命令

FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移植性和编解码质量,libavcodec里很多code都是从头开发的。百度百科告诉我们ffmppeg是用来编转码的。接下来介绍几个常用命令吧。其命令的主要格式为

2017-01-10 17:30:17 627

转载 Linux下死锁的必要条件及预防方法

在linux下产生死锁有四个必要条件(1) 互斥条件:一个资源每次只能被一个进程(线程)使用。(2) 请求与保持条件:一个进程(线程)因请求资源而阻塞时,对已获得的资源保持不放。(3) 不剥夺条件 : 此进程(线程)已获得的资源,在末使用完之前,不能强行剥夺。(4) 循环等待条件 : 多个进程(线程)之间形成一种头尾相接的循环等待资源关系。避免死锁的方法:

2016-07-18 20:22:05 1010

原创 【剑指offer】如何通过先序遍历与中序遍历重建二叉树

要用代码实现重建二叉树的话,我们必须了解先序遍历与中序遍历确定二叉树的过程,如给定先序遍历序列为 1, 2, 4, 7, 3, 5, 6, 8,中序遍历序列为4, 7, 2, 1, 5, 3, 8, 6。其主要思想就是先序序列确定根节点,中序遍历确定左右子树,解析如下:(图太丑- -。意思到了就行哈)由图我们可以看出来,这实质就是一个递归问题,退出递归的限定条件我们可以用左右子

2016-07-07 23:24:40 573

原创 【剑指offer】字符串的空格替换

如何将字符串we are happy中的空格替换成we%20are%20happy这样的字符串,其主要思想是遍历一次字符串,确定空格字符的个数,然后通过空格字符的个数确定目的字符串的长度,1个空格被替换成3个字符,故,空格的个数*2+源字符串的长度+1就是新字符串的长度,之后就是拷贝与替换操作了。用两个指针分别指向新字符串和原字符串的起始位置,若没有空格则执行类似strcpy的操作,若有空格则让新

2016-07-05 18:01:01 322

原创 vim配置教程及效果图

呼~,配置了一天的vim效果图如下:这里我除了添加vinrc的配置信息,还添加了了Ctag,taglist,和WinManger插件vimrc:

2016-05-29 11:08:02 442

原创 【博文搬家通知】

博主已搬家至CSDN希望大家多多支持!

2016-05-28 18:37:18 257

原创 【随笔】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 382

原创 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 915

原创 【干货】位图的实现与布隆过滤器

位图是用一个btye位来表示一个数据是否存在,再通过哈希函数确定一个数据所在的位置,这样处理会使当仅需要判断一个数据在不在的时候大大的提高效率,缩小内存的使用,如一个数据为int型,而一个int型的数据构成的位图能表示32个数据的存在状态。代码实现如下:Bitmap.h:#includeclass BitMap{public: BitMap(size_t size) :_size(0)

2016-05-28 18:37:09 316

原创 【干货】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 780

原创 LINUX下的几个常见的环境变量

环境变量是指操作系统用来指定操作系统运行环境的一些操作,linux下的常见的几个环境变量如下:    PATH              指定命令的搜索路径    HOME              当前用户的主目录    HISTSIZE          历史命令的记录条数    LOGNAME           当前用户的登录名    HOSTNAME          主机名称    S

2016-05-28 18:37:03 438

原创 【代码】稀疏矩阵的压缩存储与转置算法

#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 440

原创 【代码】key-value模式下的哈希二次探测与简单的哈希类的实现

二次探测是避免哈希冲突的一种常见手段,思想是:    插入:    找到哈希位置(serch)->如果不冲突就插入,冲突就进行第一次探测    第1次探测:    哈希位置变为原有哈希位置加上1*1的偏移->进行插入    ....    ....    第i次探测:    哈希位置变为原有哈希位置加上i*i的偏移->进行插入    知道插入完成为止。如图所示:650) this.width=65

2016-05-28 18:36:58 246

原创 堆排序算法思路详解

堆排序是一种常见的排序算法,其时间复杂度为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 469

原创 【代码】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 342

原创 二叉树的线索化算法思想详解

二叉树的线索化,这几天以来我很难掌握,今天终于想通了,哈哈,首先我们来看看二叉树线索化之后会变成什么样子,这里我们以图中的二叉树为例,图如下: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 1020

原创 【代码】C++实现二叉树基本操作及测试用例

二叉树是一种常见的数据结构,这里我们需要要注意的是,二叉树的非递归的遍历。    先序遍历,中序遍历,后序遍历    这三种遍历,如果用非递归的方式实现,我们则需要借助栈这个结构,首先我们需要遍历所有左子树的左节点。进行压栈,完成压栈之后,根据不同的需求,判断是否该继续访问或者弹出亦或者是压入该节点的右子树。    层序遍历    不同于其他的遍历方式,层序遍历是以根节点为开始,依次向下,每层从左

2016-05-28 18:36:47 1563

原创 【代码】C++实现广义表及其测试用例

广义表是我第一次用递归接触链式的数据结构,其结构如下:    HEAD->VAL->VAL->LINK(->HEAD.....)->VAL->......    在这里,我们的头结点与link节点是不存储数据的,由此我们便可以定义出节点的数据结构:typedef int DataType;enum NodeType//枚举类型定义节点类型{ HEAD, VALUE, SUB,};st

2016-05-28 18:36:44 456

原创 【干货】容器适配器实现两个栈模拟队列

用两个栈模拟队列的思想就是“倒水思想”,这里我们用自定义类型模拟出线性表,再用线性表做容器实现栈的数据结构,最后用栈来实现队列,代码如下:#include#include#includestruct __TrueType//类型萃取{ bool Get() { return true; }};struct __FalseType{ bool Get() { retu

2016-05-28 18:36:41 241

原创 【智能指针的延伸】两种定制删除器的实现方法

所谓定制删除器,就是向目标模板提供一个可以自由选择析构的接口,这样做的好处就是可以使智能指针模板不再只能单独管理内存,我们还可以用它管理文件指针之类的东西。其实现方法有两种,这里我们以share指针为例。    1.传递一个类的模板参数并给出缺省值,模板中将该类设定为成员变量,通过该类(删除类)的实例化,调用类中所存的删除方法进行删除。    代码如下:#includetemplate str

2016-05-28 18:36:38 332

原创 【一张大大的图片】类和对象知识点总结

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 272

原创 【干货】share智能指针的模拟实现

智能指针是C++实现自动内存管理的一种手段,本质是通过对象出作用域会自动析构,让对象保存与所需管理的目标指针指向同一片动态开辟空间的地址,出作用域会自动析构。这里模拟了,boost中的share智能指针,代码如下:#pragma oncetemplateclass SharePtr{public: SharePtr(T*ptr) :_ptr(ptr), _Rcount(new s

2016-05-28 18:36:32 467 1

原创 【代码】模板动态线性表&类型萃取

当线性表这个数据结构用模板来完成时,若出现用户自定义类型(这里指的是会存在深浅拷贝的类型时如string),则这个模板的赋值运算符重载与拷贝构造就可能会出现BUG,这种BUG是源于对同一块地址进行了两次析构所导致的。为了解决这个问题,我们可以用类型萃取,当我们获取到的是不涉及深浅拷贝的线性表时,则我们调用普通的memcpy来完成复制,若涉及深浅拷贝,则我们用用户自定义类型已经重载过的赋值运算符进行

2016-05-28 18:36:29 289

原创 【技巧】通过适配器模式完成栈的数据结构

学习了模板,我们发现,c++中的众多数据结构,如栈与队列跟模板,只是方法上与线性表不同,其真正意义上的结构,也就是线性表,代码如下:template class SeqList{private :     int _size ;     int _capacity ;     T* _data ;};// template  class Container>template  

2016-05-28 18:36:26 336

原创 【代码】模板实现动态线性表(无类型萃取)

动态表的模板是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 236

原创 【干货】C++通过模板特化实现类型萃取实例--实现区分基本类型与自定义类型的memcpy

类型萃取是一种常用的编程技巧,其目的是实现不同类型数据面对同一函数实现不同的操作,如STL中cout的实现,它与类封装的区别是,我们并不用知道我们所调用的对象是什么类型,类型萃取是编译器后知道类型,先实现,而类的封装则是先定义类型,后实现方法。在这里我们可以用模板的特化实现其编程思想。    我们以memcpy为例,当我们拷贝的是基本类型时,只用拷贝所传递指针上的数据,如果是string类型呢,我

2016-05-28 18:36:21 957

原创 【代码】模板实现双向链表的去重、拼接、合并、排序

/* 模板实现双向链表的去重、拼接、合并、排序*/#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 590

原创 【探索】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 322 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 416

原创 【总结】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 482

原创 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 190

原创 【总结】C++静态成员变量的特性总结及测试用例

静态成员变量存放于数据段,在编译时产生,故有以下特性:    静态成员变量实际为类域中的全局变量,其初始化也应与全局变量一样,不能再头文件里初始化,应与全局变量初始化的方式一样,初始化时,静态成员变量不收访问限定符限定Test.cpp:class A{ static int _num;};int A::_num = 0;//初始化成功    静态成员变量被类内所有成员变量共享,也被派生类

2016-05-28 18:36:04 254

原创 【总结】C++静态成员变量的特性总结及测试用例

静态成员变量存放于数据段,在编译时产生,故有以下特性:    静态成员变量实际为类域中的全局变量,其初始化也应与全局变量一样,不能再头文件里初始化,应与全局变量初始化的方式一样,初始化时,静态成员变量不收访问限定符限定Test.cpp:class A{ static int _num;};int A::_num = 0;//初始化成功    静态成员变量被类内所有成员变量共享,也被派生类

2016-05-28 18:36:01 351

原创 【总结】C++基类与派生类的赋值兼容规则

在初步探索了C++继承的语言特性之后,总结下其赋值兼容规则:1.子类对象可以赋值给父类对象(切割/切片)    在公有继承的前提下,子类是可以赋值给父类对象的,为什么是共有继承(public),因为公有继承会产生“is-a”的关系,这种关系会导致子类中有结构的嵌套这父类的信息,。所以子类可以给父类赋值,期间会发生类似降级的事情,使得赋值成功。若为私有继承,则会产生“has-a”的关系,这种关系是从

2016-05-28 18:35:58 1929

原创 【总结】逆置双向链表的三种方法

双向链表的遍历要比单向链表方便很多,所以逆置方法要比单链表丰富很多,因为可以从后向前遍历,所以可以像逆置数组一样进行操作,也可以根据单链表的特性进行逆置,也可以用双链表独有的特性进行逆置。具体方法如下:    链表的类定义如下:typedef int DataType;class DSNode{public: friend class DNSList; DSNode(DataType x

2016-05-28 18:35:55 4579

原创 【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 3848

原创 双向链表的C++实现

由于单链表结构简单,但是操作起来比较复杂,所以就有了双向链表来替代单链表,其结构中比单链表多了一个指向前驱的指针,在逆序遍历上极大的提高了效率,其节点设计如下:typedef int DataType;class DSNode{public: friend class DNSList; DSNode(DataType x=0) :_data(x), _next(NULL),

2016-05-28 18:35:50 175

原创 C++单链表的设计与实现

单链表是一种常见的数据结构,c++不同于C的语言特性是封装、继承和多态。若要实现单链表,首先我们要明确什么是单链表,链表是由一个或多个节点构成的,实现链表的数据结构,我们首先是要明确的是什么是节点。    节点是由数据+该节点类型的指针组成的,如下:class SeqNode{public: friend class SeqList;//定义友元类,使链表类能够访问节点类的私有成员 Se

2016-05-28 18:35:47 615

原创 如何限制类仅能创建一个对象

方法一:利用引用计数:#include   using namespace  std;    class  Object  {    public:           ~Object()      {          count=1;        }       Object()       {           if (count==0)         

2016-05-28 18:35:44 324

原创 String类的实现与深浅拷贝问题

C++实现string类是理解类和对象这个概念的基础,也能了解C++语法的特性--用户对内存的自主管理,通过类创建出一个对象的过程,首先要调用构造函数,经过一系列的操作,当退出对象所在的作用域时,便会调用析构函数,C++支持隐式的调用构造、析构等函数,但经常隐式调用并不能正确的管理内存,所以我们需要重写这两个函数,以及拷贝构造,和赋值运算符的重载。    string类的结构设计        s

2016-05-28 18:35:41 437

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除