自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

CCPP Blog

结构、算法、c、c++

原创 CCPP Blog 目录

CCPP Blog 结构、算法、C、CPP 博客中的所有系列和专栏的目录都可在这里找到

2015-02-07 20:31:35 4153 3

原创 挑战面试编程:查找数组中第k大的数

查找数组中第k大的数 问题: 查找出一给定数组中第k大的数。例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8…… 思路: 1. 直接从大到小排序,排好序后,第K大的数就是arr[k-1]。 2. 只需找到第k大的数,不必把所有的数排好序。我们借助快速排序中pa...

2016-01-08 16:33:23 4921 5

原创 LeetCode-Linked List

Linked ListLinked List Swap Nodes in Pairs Sort List Rotate List Reverse Nodes in k-Group Reverse Linked List Reverse Linked List II Reorder List Rem...

2015-12-18 19:45:03 4684 0

原创 linux系统编程:线程同步-信号量(semaphore)

线程同步-信号量(semaphore) 生产者与消费者问题再思考 在实际生活中,只要有商品,消费者就可以消费,这没问题。但生产者的生产并不是无限的,例如,仓库是有限的,原材料是有限的,生产指标受消费指标限制等等。为了进一步,解决好生产者与消费者问题,引入信号量进机制。 信号量 信号量(sem...

2015-07-26 18:00:46 3219 1

原创 linux系统编程:线程同步-条件变量(cond)

线程同步-条件变量 生产者与消费者问题 再引入条件变量之前,我们先看下生产者和消费者问题:生产者不断地生产产品,同时消费者不断地在消费产品。 这个问题的同步在于两处:第一,消费者之间需要同步:同一件产品只可由一人消费。第二,当无产品可消费时,消费者需等待生产者生产后,才可继续消费,这又是一个同步...

2015-07-26 11:29:10 1490 0

原创 linux系统编程:线程同步-读写锁(rwlock)

线程同步-读写锁(rwlock)读写锁读写锁是互斥量的细化:显然,只有对全局资然进行写入操作时,才需要同步;在对全局资然进行读取操作时,是不需要锁的。pthread_rwlock_t pthread_rwlock_init pthread_rwlock_destroy pthread_rwlock...

2015-07-25 23:16:53 1758 0

原创 linux系统编程:线程同步-互斥量(mutex)

线程同步-互斥量(mutex) 线程同步 多个线程同时访问共享数据时可能会冲突,于是需要实现线程同步。 一个线程冲突的示例

2015-07-25 17:49:11 1380 0

原创 linux系统编程:线程原语

线程原语 线程概念 线程(thread),有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。更多详细解释看百度百科:线程。 在Linux shell下通过命令 $ ps -Lf...

2015-07-17 19:25:30 1989 0

原创 linux系统编程:进程原语

进程原语 1. 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 2. 进程环境 在libc中定义的全局变量environ指向环境变量表,environ没有包含在任何头文件中,所以在使用时要用extern声明。用以...

2015-07-15 19:35:48 2483 3

原创 linux系统编程:进程间通信-mmap

进程间通信-mmap #include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *addr, size_...

2015-07-15 19:23:38 1616 0

原创 linux系统编程:进程间通信-fifo

进程间通信-fifo 进程间通信的另一种方式是fifo。fifo是另一种管道:有名管道。从名字可以看出,它也是队列。 使用fifo通信前,得先创建fifo

2015-07-15 18:23:55 1260 0

原创 linux系统编程:进程间通信-pipe

进程间通信-pipe 进程间通信 每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,Inter...

2015-07-15 17:13:10 1175 0

原创 前缀、中缀、后缀表达式

前缀、中缀、后缀表达式 1.定义 所谓的前、中、后,是指表达式中运算符相对于运算对象的位置。 中缀 运算符位于运算对象中间,即是中缀表达式。如(1+2)*3-4 最普遍的、最易被人脑理解的是中缀表达式。 前缀 运算符位于运算对象之前,即是前缀表达式。如-*+1234 后缀 运算符位于运算对象之后,...

2015-06-23 16:13:09 2955 0

原创 挑战面试编程:左移字符串

挑战面试编程:左移字符串 问题描述: 左移字符串:如有字符串“abcdefg”,可把它看作是一首尾相连的字符串,左移三个字符后,变为“defgabc”,请编程实现。 方法一: 利用额外的内存空间,实现中转。 步骤1:把“abc”存储到额外空间; 步骤2:把“defg”移动到字符串的首部。至此,“d...

2015-06-17 18:04:29 1305 0

原创 挑战面试编程:大整数的加、减、乘、除

大整数的加、减、乘、除 一切都是有限的,哪怕是看起来无限的时间或空间都很可能是有限的。在计算机中内置类型的加、减、乘、除都是有限的。我们来实现一个“无限”的大整数加、减、乘、除。 以下使用C++代码实现

2015-06-10 10:59:15 4269 2

原创 C++拾遗--类成员指针

C++拾遗--类成员指针 前言 类成员的类型与一般类型不同,那么类成员的指针类型自然与一般类型的指针有所区别。我们有必要来探讨下类成员指针的使用。 正文 类成员指针是指可以指向类的非静态成员的指针。它的类型包括了类类型和所指向的成员类型。一般而言,指针指向的是对象,而类成员指针指向的是...

2015-03-19 21:25:29 1383 0

原创 挑战面试编程:十六进制数转化为八进制数

挑战面试编程:十六进制数转化为八进制数 题目: 问题描述   给定n个十六进制正整数,输出它们对应的八进制数。 输入格式   输入的第一行为一个正整数n (1<=n<=10)。   接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度...

2015-03-17 23:19:15 1884 0

原创 linux系统编程:文件操作--open、create、close

linux C/C++:文件操作--open、create、close 文件描述符 内核(kernel)利用文件描述符(file descriptor)来访问文件。文件描述符是非负整数。打开现存文件或新建文件时,内核会返回一个文件描述符。读写文件也需要使用文件描述符来指定待读写的文件。系统...

2015-03-07 23:50:51 3027 1

原创 设计模式:单例模式

设计模式:单例模式 前言 单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。(百...

2015-03-07 20:15:49 1152 0

原创 C++拾遗--lambda表达式原理

C++拾遗--lambda表达式原理 前言 lambda表达式是在C++11新标准中提出的。在lambda表达式中,我们集中梳理了一下它的使用。现在来讨论下它的实现原理。 正文 1.函数对象 类的对象跟括号结合,表现出函数一般的行为,这个对象可以称作是函数对象。

2015-03-05 11:38:49 5892 3

原创 C++拾遗--函数重载

C++拾遗--函数重载 前言 函数重载(overloaded)似乎并不难,至于函数重载规则,比较简单,没什么好讲的。但仍有一些问题值得注意。下面从几个关键词入手: 正文 1.作用域 关于作用域,需要指出几点事实 用大括号{}括起来的区域处于同一作用域,常见的有函数体、for、if语句...

2015-03-04 00:07:10 1622 0

原创 C++拾遗--C++多线程引入

C++拾遗--C++多线程引入 前言 C++库文件也提供了对多线程的支持,主要包含头文件thread即可使用C++中的多线程。它的一些与多线程有关的方法和C语言不同。我们有必要来探讨下C++编程下如何使用多线程。 正文 1.示例 与C语言多线程引入相同,我们先看一个C++多线程的示例。

2015-03-01 15:43:26 2780 0

原创 C++拾遗--多线程:临界区解决子线程的互斥

C++拾遗--多线程:关键段解决子线程的互斥 前言 为了解决子线程的互斥问题,windows系统提出了关键段(CRITICAL_SECTION)的概念。它一共有四个共两对操作:初始化、销毁,进入、离开。它们定义在头文件synchapi.h中。 1.初始化关键段变量 VOID WINAPI ...

2015-02-28 21:41:11 2117 0

原创 C++拾遗--多线程:主线程与子线程的同步

C++拾遗--多线程:主线程与子线程的同步 前言 在多线程编程时,有时是需要要求主线程与子线程同步的。 正文 下面的一个例子,演示了主线程与子线程之间的同步问题。 程序描述: 在主线程中,有一整型变量count,初始化为0。主线程把count的地址传递给开启的子线程,子线程打印获取的值,随...

2015-02-27 13:06:59 5542 0

原创 C++拾遗--多线程:原子操作解决线程冲突

C++拾遗--原子操作解决线程冲突 前言 在多线程中操作全局变量一般都会引起线程冲突,为了解决线程冲突,引入原子操作。所谓原子操作,是指不会被线程调度机制打断的操作,操作一旦开始,就得执行到结束为止。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部...

2015-02-26 21:44:08 4329 1

原创 C++拾遗--多线程:C语言多线程的引入

C++拾遗--多线程:C语言多线程的引入 前言 多线程是编程中的一个重要内容。多核时代使多线程成为一种可能,显然,一件事情多个人干,效率一定会提升。下面来看下C语言中是如何使用多线程的。 正文 1.CreateThread 先来看一个实例

2015-02-26 17:26:35 3674 0

原创 C++拾遗--虚函数表

C++拾遗--虚函数原理 前言 C++的多态依赖虚函数来实现。若类存在虚函数,则每一个类的实例都维护了一个地址,这个地址指向虚函数表。虚函数表中存放的是类中所有虚函数的地址。下面我们找出虚函数表的地址,从而获得每个虚函数的地址,然后使用地址直接调用虚函数。 正文 1.空类的size

2015-02-25 17:56:40 1673 0

原创 C++拾遗--引用(左值引用、右值引用)

C++拾遗--引用 前言 引用就是别名(alias)。所谓别名,就是对已存在的对象另起一个名字。本身含义并不难理解,但与其它概念一组合,就成了使用难点。再加上新标准提出了新的一种引用-右值引用,引用这一概念就变得更加难以理解和使用。 正文 随着新标准(新标准往往就是新的技术)的提出...

2015-02-23 18:46:16 3504 0

原创 C++拾遗--定位new表达式

C++拾遗--定位new表达式 前言 new表达式,默认下把内存开辟到堆区。使用定位new表达式,可以在指定地址区域(栈区、堆区、静态区)构造对象,这好比是把内存开辟到指定区域。 正文 定位new表达式的常见形式

2015-02-21 20:35:50 2586 0

原创 C++拾遗--new delete 重载

C++拾遗--new delete 重载 前言 new和delete是操作动态内存的一对操作。对它们重载可以对内存管理进行有效的定制。 正文 1.局部重载 特别针对某一类型,对new和delete进行重载,可以对该类型对象的动态创建实行监控。如下代码: 代码一

2015-02-21 19:18:50 2291 2

原创 C++拾遗--malloc free与new delete的同与不同

C++拾遗--malloc free与new delete的同与不同 前言 在C中我们常使用malloc和free来动态分配与释放内存,在C++中对应的是new和delete。这里我们来探讨下他们的同与不同。 1.内置类型 对相同的代码进行调试,查看内存

2015-02-20 20:27:48 1790 0

原创 C++拾遗--智能指针

C++拾遗--智能指针 前言 内存泄露是常见的问题,新标准中的智能指针从根本上解决了这个问题。所谓的智能指针,其智能性体现在:当没有对象使用某块动态分配的内存时,那就自动释放这片内存。 智能指针 下面这段程序可耗尽内存,导致程序崩溃。

2015-02-19 20:07:06 1374 1

原创 C++拾遗--模板元编程

C++拾遗--模板元编程 前言 模板元是用于递归加速的,把运行期的函数调用变到编译期进行代码展开,类似于内联函数。下面看一个实例:斐波那契数列第n项求解。 模板元编程

2015-02-19 15:15:46 1858 0

原创 C++拾遗--name_cast 显式类型转换

C++拾遗--name_cast 显式类型转换 前言 C++中提供了四种显式的类型转换方法:static_cast,const_cast,reinterpret_cast,dynamic_cast.下面分别看下它们的使用场景。 显式类型转换 1.staitc_cast 这是最常用的,...

2015-02-18 22:01:30 1951 4

原创 C++拾遗--函数模板

C++拾遗--函数模板 前言 泛型的核心思想是数据与算法分离。函数模板是泛型编程的基础。 函数模板 函数模板以 template<arg_list> 开头,arg_list是泛型参数的列表。 1.模板的泛型参数个数确定 实例一 下面是一个加法函数模板,在实例化时,我们传入普通的...

2015-02-17 10:46:24 1390 0

原创 C++拾遗--构造函数(二)拷贝构造

C++拾遗--构造函数(二)拷贝构造 前言 在构造函数(一)中讨论的是默认构造函数的一些应用。这里我们来探讨下其它的一些有名构造函数,及其它们的应用场景。

2015-02-12 17:41:34 1081 0

原创 C++拾遗--构造函数(一)默认构造

C++拾遗--构造函数(一)默认构造 前言 对一个类而言,构造函数恐怕是最重要的一个成员函数了。关于构造函数的细节繁多,并且随着新标准的提出,构造函数有了新的特性。本文来集中探讨下构造函数的那些鲜为人知的一面。 构造函数 构造函数的作用众所周知:在类的对象被创建时,控制对象的初始化...

2015-02-12 12:02:02 1426 1

原创 C++拾遗--bind函数绑定

C++拾遗--bind函数绑定 前言 函数绑定bind函数用于把某种形式的参数列表与已知的函数进行绑定,形成新的函数。这种更改已有函数调用模式的做法,就叫函数绑定。需要指出:bind就是函数适配器。

2015-02-08 19:16:04 8619 0

原创 C++拾遗--this指针

前言 在用C++进行面向对象编程时,this指针是一个人尽皆知的东西。但我们真的清楚它吗?下面我们对它的存在意义和使用方法一一进行探讨。 this指针 存在意义:我们为何需要this指针?

2015-02-08 14:22:42 1713 4

原创 C++拾遗--lambda表达式

C++拾遗--lambda表达式 前言 有时,我们需要在函数内部频繁地使用某一功能。此时,我们可以把这种功能写成一个独立的函数。而实际上,这个新的函数很可能是不需要在其它的地方进行调用的。我们想限定它的作用范围,最好是仅限于当前函数。而函数的内部是不可以重新定义其它的函数的。为了解决这个问...

2015-02-07 17:44:32 2154 0

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