自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 目录操作

创建目录:int mkdir(const char* pathname,mode_t mode);pathname,路径;mode,目录访问权限;返回值:成功,返回0,失败,返回-1.删除目录:int rmdir(const char* pathname);pathname:路径;返回值:成功,返回0,失败,返回-1;打开目录:DIR* opendir(const char*

2017-05-22 16:34:40 292

原创 文件属性

int stat(const char* path,struct stat *s);path文件路径+文件名,s保存文件信息结构体的地址。返回值,成功0,失败-1.struct stat{dev_t st_dev;//文件设备编号ino_t st_ino;//节点mode_t st_mode;//文件的类型和存取的权限nlink_t st_nlink;//连到该文件的硬链接

2017-05-22 14:56:56 354

原创 文件的原子操作

文件的原子操作是指一个操作一旦启动,则无法能被破坏它的其它操作打断。1.写文件原子操作无论是两个打开,还是dup,同时操作一个文件都可能引起混乱,解决这个问题的方法是,可以通过O_APPEND解决这个问题.O_APPEND选项可以使得一个写操作正在进行时,另外一个对该文件的写操作会阻塞等待。这意味着O_APPEND选项的文件描述符,写操作无法被打断。2.创建文件的原子操作如果两个进

2017-05-22 14:36:15 1011

原创 Linux的文件操作

在Linux系统中,打开的文件是用一个整数来表示的,表示打开文件的整数,称为文件描述符。1.open/createint open(const char *pathname, int flags);int open(const char *pathname, int flags, mode_t mode);int creat(const char *pathname, mode_t

2017-05-19 14:23:45 298

原创 函数对象适配器

#include#include#include#include#include#include#includeusing namespace std;//函数对象适配器bind1st,bind2ndstruct MyPrint :public binary_function//binary_function{void operator()(int v1

2017-05-18 23:30:30 246

原创 谓词

谓词是指普通函数或重载的operator()返回值是bool类型的函数对象(仿函数)。如果operator接受一个参数,那么叫做一元谓词,如果接受两个参数,那么叫做二元谓词。谓词可作为一个判断式。struct GreaterThan8{bool operator()(int v){return v > 5;}};//一元谓词void test0(){ve

2017-05-18 20:57:01 362

原创 函数对象

重载函数调用操作符的类,其对象称为函数对象,它是行为类似函数的对象,也称作仿函数。函数对象的特性:1.函数对象是一个类,不是一个函数。2.函数对象重载了()操作符,使得它可以像函数一样调用。struct MyStruct{void operator()(int a){cout }};void test0(){MyStruct mystruct;

2017-05-18 20:01:29 251

原创 map/multimap容器

map容器的特性:1.所有元素都会根据元素的键值自动排序。map的所有元素都是pair,同时拥有实值和键值,map不允许两个元素有相同的键值。2.不能通过map的迭代器改变键值。因为键值关系搞map元素的排列规则,任意改变map键值,将会严重破坏map组织,修改元素的实值是可以的。3.在对容器元素进行新增或删除操作时,操作之前的所有迭代器,在操作完成后,依然有效,被删除的那个元素的迭代

2017-05-18 19:16:18 306

原创 set/multiset容器

set容器的特性:1.所有元素都会根据元素的键值自动排序,set元素的键值又是实值,set不允许两个元素有相同的键值(实值);2.不可以通过迭代器改变set元素的值。因为set元素值就是其键值,关系到set元素的排序规则。如果通过迭代器改变set元素值,会破坏set组织。set的iterator是const的;3.multiset的用法和set一样,唯一不同在于,multiset允许键

2017-05-18 12:23:32 243

原创 二叉树遍历

定义:n个节点的有限集合,由一个根节点以及两棵互补相交的,分别为左子树和右子树的二叉树组成。基本特征:每个节点最多有两个子树,左子树和右子树次序不能颠倒(有序树),深度为k的二叉树,至多有pow(2,k)个节点;对于任何一颗二叉树,若度为2的节点有n2个,则叶子数必定为n2+1,具有n个节点的完全二叉树的深度必为log(2,n)+1,对完全二叉树,若从上至下、从左至右编号,则编号为i的节点,其

2017-05-18 01:51:20 227

原创 list容器

1.list容器的概念list容器是一个双向链表。相比于vector容器,list每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何元素的插入或移除,list永远是常熟时间。2.list容器的迭代器list迭代器可进行递增、递减、取值、成员存取操作。插入和删除不会使原有的list迭代器失效。3.l

2017-05-14 01:05:47 232

原创 queue容器

1.queue容器的基本概念queue是一种先进先出的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。queue没有迭代器。2.queue常用API2.1queue构造函数queue que;默认构造queue que(const queue &q);拷贝构造2.2queue存取、插入和删除操作push(ele);往队尾添加元素p

2017-05-14 00:46:57 222

原创 stack容器

1.stack容器概念stack容器是一种前进后出的数据结构,它只有一个出口。stack容器允许新增元素,移出元素,取得栈顶元素,但是,除了最顶端外,没有任何其它方法可以存取stack的其它元素,stack不允许遍历。2.stack容器不提供迭代器stack所有元素的进出都必须符合 先进后出 的条件,只有stack顶端的元素,才有机会被取用。stack不提供遍历功能,也不提供迭

2017-05-13 15:45:26 228

原创 deque容器

1.deque是一种双向开口的连续线性空间,可以在头尾两端分别做元素的插入和删除操作。2.deque容器实现原理deque容器是由一段一段的定量的连续空间构成。一旦有必要在deque前段或者尾端增加新的空间,便配置一段连续定量的空间。串接在deque的头端或者尾端。deque的最大工作就是维护这些分段连续的内存空间的整体性的假象,并提供随机存取的接口,避开了重新配置空间,赋值,释放

2017-05-12 16:36:11 214

原创 vector容器

1.vector容器示意图2.vector的迭代器vector支持随机存取,所以vector提供的是随机访问迭代器。3.vector的数据结构vector采用连续线性空间实现,它用两个迭代器_Myfirst和_Mylast分别指向配置得来的连续空间中目前已被使用的范围,并以迭代器_Myend指向整块连续内存空间的尾端。一个vector的容量永远大于或等于其大小,一旦容量等于

2017-05-12 15:03:10 334

原创 string容器

1.string与c风格字符串的对比:--char*是一个指针,string是一个类。string封装了char*,管理这个字符串,是一个char*性的容器。--string封装了很多成员方法,诸如:find,copy,delete,replace,insert。--string管理char*所分配的内存。每一次string的赋值,取值都由string类负责维护,不用担心越界。2.

2017-05-11 18:21:11 316

原创 STL的容器、算法与迭代器

1.容器容器分为序列式容器,关联式容器。序列式容器就是容器元素在容器中的位置是由元素进入容器的时间和地点类决定。vector,deque,list,stack,queue都是序列式容器。关联式容器是指容器有既定的规则,元素在容器中的位置由容器的规则决定。set、multiset、map、multimap都是关联式容器。2.算法算法分为质变算法、非质变算法。质变算法:运算过程

2017-05-10 11:31:21 254

原创 STL的优点

STL的优点:1.实现数据结构和算法的分离,使得STL非常通用。2.STL具有高可重用性,高性能,高移植性,夸平台的优点。--高可重用性:STL中几乎所有的代码都采用了模板类和模板函数的方式实现,代码重用性高。--高性能:如map,采用红黑数的变体实现,效率高。--高移植性:STL模块很容易移植。

2017-05-10 11:23:25 2053

原创 STL的六大组件

STL提供了六大组件,彼此之间可以组合套用,这六大组件分别是:容器、算法、迭代器、仿函数、适配器、空间适配器。容器:各种数据结构(vector,list,deque,set,map等),用来存放数据,从实现角度来看,STL容器是一种class template。算法:常用的各种算法,如sort,find,copy,for_each等。从实现的角度看,STL算法是一种function tem

2017-05-10 11:11:48 320

原创 C++文件读写

打开文件是指在文件读写之前做必要的准备工作,包括:1.位文件流对象和指定的磁盘文件建立关联,以便使文件流流向指定的磁盘文件。2.指定文件的工作方式。在C++中,代开文件可以用两种方法实现1.调用文件流的成员函数2.在定义文件流对象时指定参数文件输入输出方式设置方式作用ios::in以输入方式打开文件

2017-05-09 22:28:20 347

原创 标准IO流cin与cout

C++程序把输入和输出看做字节流,流,就是流动的输出。c++的标准IO流,有cin,cout,clog,cerr.1.cinvoid test(){char ch1,ch2;cin.get(ch1);//读取一个字符ch2 = cin.get();//读取一个字符cin.get(ch1).get(ch2);//链式编程char buf[1024];cin.ign

2017-05-09 16:10:29 708

原创 常量转换

常量转换,const_cast,用来修改类型的const属性。常量指针被转换成飞常量指针,并且仍然指向运来的对象;常量引用被转换成非常量引用,并且仍然指向原来的对象。class Person{public:int age;};void test(){int *p = new int;Person* pPerson = new Person;//为指针添加co

2017-05-07 01:16:40 677

原创 静态转换和动态转换

1.静态转换静态转换用于,普通数据类型间的转换,具有继承关系的父子类指针或引用的转换。class Dad{};class Son :public Dad{};class MyClass{};//基础类型转换void test1(){int a = 5;double b = static_cast(a);//基础数据类型转换}//继承关系指针转换voi

2017-05-06 21:57:07 7467

原创 类模板的应用--用类模板实现动态数组

templateclass DynamicArray{public:T* ptrt;int tcapacity;int tsize;public:DynamicArray(){this->tcapacity = 5;this->tsize = 0;this->ptrt = new T[tcapacity];}~DynamicArray()

2017-05-06 19:40:47 1069

原创 类模板遇到友元函数模板

class MyClass{template friend void fun(MyClass &myclass);template friend ostream& operator& myclass);public:T ta;MyClass(T a){ta = a;}};template void fun(MyClass &myclass){co

2017-05-06 15:53:46 206

原创 类模板碰到友元函数

当类模板碰到友元函数时,普通友元函数必须提前声明。template class MyClass;//声明类模板存在//声明友元函数存在template void fun(MyClass myclass);template ostream& operator &myclass);templateclass MyClass{public:T ta;//普通友元函

2017-05-06 14:12:39 299

原创 类模板的类外实现与hpp文件

当类模板中有友元函数,且友元函数在类外实现,那么,程序编译时会出现:无法解析的外部符号的错误。templateclass Dad{public:T Dproperty;Dad(T property);//友元函数friend ostream& operator& dad);void commonfun();//普通函数};templateDad:

2017-05-05 00:51:05 1311

原创 类模板

当有两个或多个类,其功能相同,但数据类型不同时,可以用类模板,减少编辑代码的工作量,增加程序的可读性和易维护性。类模板用于实现类数据类型的参数化,类模板在表示如数组,表,图等数据结构时,显得特表重要,这些数据结构的表示和算法不受所包含的数据类型的影响。类模板的用法:1.类模板可以做函数参数templateclass Car{public:T1 brand;T2

2017-05-04 20:07:35 299

原创 函数模板实现的机制

编译器会对函数模板进行两次编译,在声明的地方对模板代码本身进行编译,在调用的地方对参数替换后 的代码进行编译。编译器根据函数的调用情况,产生具体的函数,这个具体的函数根据类型产生。模板的声明和实现不能分文件编写。

2017-05-03 20:16:03 347

原创 函数模板和普通函数在一起的调用规则

函数模板和普通函数在一起的调用规则:1.C++编译器优先考虑普通函数;2.如果函数模板可以产生一个更好的匹配,就选择模板,反之,则选择普通函数;3.可以通过空模板实参列表的语法限定编译器只能通过模板匹配。templatevoid templatefun(T a, T b)//模板函数{cout }void templatefun(int a, int b)//普

2017-05-03 20:03:53 449

原创 函数模板与普通函数的区别

函数模板不允许自动类型转换,普通函数能够自动进行类型转换。templatevoid templatefun(T a, T b)//模板函数{cout }void commonfun(int a, int b)//普通函数{cout }void test(){int a = 4;char ch = 'a';templatefun(a, a);

2017-05-03 19:53:19 322

原创 模板函数实现数组排序

templatevoid sortfun(T arr[],int len){int i, j;T tmp;for (i = 0;i {for (j = i;j {if (arr[i] {tmp = arr[i];arr[i] = arr[j + 1];arr[j+ 1] = tmp;}}}}templatevoid pri

2017-05-03 17:13:31 4620 2

原创 函数模板

C++中提供函数模板,所谓函数模板,就是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类来代表。这个通用函数就称为函数模板。凡是函数体相同的函数都可以用这个模板代替,不必定义多个函数,只需要在模板中定义一次即可。在调用函数时,系统会根据实参的类型来取代模板中的虚拟类型从而实现不同函数的功能。函数模板使得程序可以从逻辑上抽象,把被处理的数据类型作为参数传递。函数模板把要处理的

2017-05-03 16:03:21 166

原创 纯虚析构函数和非纯虚析构函数

纯虚机构函数和非纯虚析构函数之间唯一的不同之处在于纯虚析构函数使得基类是抽象类,不能创建基类的对象。纯虚析构函数的特点:必须为纯虚析构函数提供一个函数体。

2017-05-03 14:14:04 285

原创 虚析构函数

虚析构函数时为了解决基类的指针指向派生类对象,并用基类的指针删除派生类的对象。class Dad{public:Dad(){cout }virtual ~Dad()//父类析构函数声明为virtual{cout }};class Son :public Dad{public:int* arr;Son(){arr = new

2017-05-03 13:53:43 221

原创 C++实现接口类

绝大多数面向对象语言都不支持多继承,但是,绝大多数面向对象语言都支持接口的概念。C++中没有接口的概念,但可以通过纯虚函数实现接口。即使是在多重继承的时候,接口类也不会带来二义性和复杂性的问题,接口类只是一个功能声明,并不是功能实现。C++实现接口类:1.接口类中只有函数原型定义,没有任何数据定义。2.除析构函数外,其它函数全部为纯虚函数。

2017-05-03 13:46:08 725

原创 纯虚函数与抽象基类

在基类中加入至少一个纯虚函数,就使得基类成为了抽象类。虚函数与抽象类的特点:1.纯虚函数使用关键字virtual声明,并在函数声明后面加上=0。编译器不允许将抽象类实例化。2.当继承一个抽象类的时候,必须实现所有的纯虚函数,否则由抽象类派生的类也是一个抽象类。3.virtual void fun()=0;告诉编译器在虚函数表中为函数保留一个位置,但在这个特定位置不放地址。cla

2017-05-03 13:20:06 308

原创 动态绑定实现的原理

当用virtual关键字来声明一个成员函数,编译器机会根据动态绑定机制在幕后完成一些工作。当编译器发现类中有虚函数的时候,编译器会创建一张虚函数表,把虚函数的函数入口地址放到虚函数表中,并且在类中增加一个指针:vpointer,这个指针是指向对象的虚函数表。在多态调用的时候,根据vpointer指针,找到虚函数表来实现动态绑定。class Test{void fun(){}};

2017-05-02 22:23:09 4359

原创 早绑定的问题与动态绑定

对象可以作为自己的类或者作为它的基类(父类)的对象来使用。还能通过基类的地址来操作它。取一个对象的地址(指针或引用),并将其作为基类的地址来处理,称为向上类型转换。也就是说,父类引用或指针可以指向子类对象,通过父类指针或引用操作子类对象。class human{public:void eat(){cout }};class dog:public human{

2017-05-02 21:31:07 301

原创 静态多态和动态多态

C++支持编译时多态(静态多态)和运行时多态(动态多态)。运算符重载和函数重载就是编译时多态,而派生类和虚函数实现运行时多态。静态多态和动态多态的区别 就是函数地址时早绑定(静态联编)还是晚绑定(动态联编)。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多编(编译时多态)。如果函数的调用地址不能在编译期间确定,而需要在运行时才确定,这就属于晚绑定(动态多态,运行时多态

2017-05-02 17:53:59 1212

空空如也

空空如也

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

TA关注的人

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