自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

zhangchuan的博客

随便写写,权当知识点总结

  • 博客(41)
  • 资源 (1)
  • 收藏
  • 关注

原创 thread

thread是c++标准程序库中的一个头文件,表示线程类,位于std空间中。thread对象初始化给出线程执行函数,线程对象构造完成后即可运行。在默认情况下,c++11中的子线程必须加入到主线程运行,即在主线程(main函数)中调用join函数,这样是为了避免主线程运行完毕后子线程还没有运行完成。每个程序都至少有一个thread,即main()作为起始thread,而每个新加入的thread都

2017-04-25 22:02:15 469

原创 二元成员函数适配器

自己实现的二元成员函数适配器,专门用于调用类成员函数我们实现的适配器必须要有指向成员函数的指针,一般而言,定义指向成员函数的指针格式为:T3 (T1::*fun)(T2),qizhong T3表示返回值类型,T1表示类类型,T2表示函数参数类型。// ConsoleApplication49.cpp : 定义控制台应用程序的入口点。//用于成员函数指针的适配器--将成员函数当作放函数使用/*

2016-11-14 19:47:19 393

原创 函数对象 谓词函数 函数适配器

函数对象:函数对象就是重载类中了operator()运算符的类类型对象,当使用该类实例调用operator函数时如同调用普通函数一样。从概念上来说,函数对象是用作函数的对象,但从实现来说,函数对象是实现了()函数的对象。虽然函数和函数指针也是函数对象,但只有实现了operator()函数的类对象才能保存类成员状态。函数对象的优势有以下几个:1)函数对象可以有自己的状态。当在类中定义状态变量

2016-10-26 19:56:55 573

原创 static_cast vs dynamic_cast

static_cast vs dynamic_caststatic_cast的原型为:static_cast expression说明:该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。在c++primer中曾经提到过对于任何可以由隐式转换进行的操作都可以有static_cast来完成。这句话说出了static_cast的其中一种用法。即用于在

2016-10-09 15:57:38 763

原创 More Effect C++--placement delete

placement delete只有在伴随着“placement new调用而触发的构造函数”出现故障时才会被调用。当placement new调用发生故障时,编译器会在系统中国调用与placement new参数个数与参数类型一致的placement delete去恢复内存区避免内存泄漏。当使用placement new operator构建类对象时,对相应的指针实行delete ope

2016-10-04 21:33:24 537

原创 more effect c++---placement new

placement new是operator new的另外一种形式。对于一个已经存在的对象调用constructor是没有意义的,因为我们知道constructor是用来初始化对象的,而对象只能被初始化一次。但是有时候你是需要在原始分配的内存上构建某个对象,这时候你就可以通过placement new来完成。class Foo{    char cc;    float f;

2016-10-04 17:49:58 561

原创 reinterpret_cast

reinterpret_cast的原型为:reinterpret_cast (expression).type_id必须是一个指针,引用,算术类型,函数指针,成员指针等。它可以把一个整型转换为指针,也可以把一个指针转换为整型。总结来说,reinterpret_cast可以允许任何指针类型(引用)之间的转换,整型与指针类型间的转换以及指针与足够大的整型之间的转换。reinterpret_cast

2016-09-29 17:34:45 12581 1

原创 构造函数语义学----copy constructor

有三种情况会调用类的copy constructor。1)明确地以一个对象的值给同类的另一对象赋值。2)当类对象被当作参数传递给函数时。3)当函数返回一个类对象时。c++中编译器copy constructor的原则是memberwise initializatior,即把每一个内建的data member和派生的data member的值逐步拷贝到目标对象中,不过他不会拷贝其中的

2016-09-18 15:56:23 473

原创 构造函数语义学---default constructor

C++ Annatated Reference Manual告诉我们:“default construct会在需要的时候被编译器产生出来”。关键字眼在于什么时候需要以及被谁需要。一般说来,default construct的需求方有程序员和编译器。如果程序员需要,那么他就有责任在程序中声明construct function。如果是编译器需要,那么编译器就会在程序中合成construct。当然,合

2016-09-17 13:38:19 431

原创 打印从1到最大n位数

剑指Office上的一道题打印从1到最大位数解题思路:由于n的值未知,我们必须考虑n位数的溢出问题。在这里我们并没有使用int型的数组保存最大值,而是使用char型数组保存数值。具体代码如下:// ConsoleApplication20.cpp : 定义控制台应用程序的入口点。//打印从1到最大的n位数#include "stdafx.h"#include#i

2016-09-15 16:27:00 467

原创 tcp/ip四次挥手释放连接详解

当某个应用进程在CLOSED状态下执行主动打开时,TCP将发送一个SYN分片,且新的状态为SYN_SENT.如果这个TCP接着收到一个ACK和SYN,则它将发送一个ACK,且新的状态为ESTABLISHED。如果某个应用进程在收到文件结束符之前调用CLOSE(主动关闭),那就转到FIN_WAIT_1状态。如果应用进程在ESTABLISHED状态期间收到一个FIN(被动关闭),那就转到CLOSED_

2016-09-13 13:59:00 680

原创 数组名与数组指针

数组名一般说来可以当成是一个指针常量,它的值与数组首元素的地址值相同。在很多时候,我们需要将数组名的值覆給数组指针以便对数组元素进行修改。而两者之间的错综复杂的等价关系让人捉摸不透。以下是我个人关于数组名与数组指针的一些理解,仅供参考。#include "stdafx.h" #include using namespace std; int _tmain(int argc, _

2016-09-11 13:24:36 389

原创 华为笔试题

一、题目某软件需要实现建议的CD-KEY算法,输入3个正整数,以空格隔开,根据这3个整数生成CD-KEY字符串,输出格式XXXX-XXXX-XXXX-XXYY,包括16个字符,以短划线分开,其中,CD-KEY最后两个YY是用于CD-KEY的自校验,确保CD-KEY本身是合法的。CDKEY使用的字符表23456789ABCDEFGHJKLMNPQRSTUVWXYZ(由

2016-09-11 13:10:29 806

原创 死锁

死锁:多个进程竞争同一个资源而陷入一种僵局(互相等待),若无外力作用,进程将无法继续向前推进。死锁产生的原因有两个:1)竞争资源2)进程推进顺序非法死锁产生的四个必要条件:1)互斥条件:进程对于资源的控制有排他性。即某段时间内某资源只能被一个进程所使用,如果有其它进程请求该资源,那么请求进程只能等待。2)不可剥夺:进程获得的资源在未被使用完之前,不可被其它进程强行夺走,即资

2016-09-11 11:31:51 340

原创 c/c++字符串分割方法总结2

1. strtok()strtok 函数原型为char* strtok(char* s,char *delim),函数功能为返回delim字符串中包含字符的截断子串,第一次调用时该函数将顺序查找满足条件的分隔标志,当找到有分割标志时,则将分割标志替换成‘\0’。由于每次调用函数时,函数只返回一个分割字串,因此需要多次调用该函数。而在以后的调用中,需要传给s一个空串,至于为什么,我还没弄清楚,等

2016-09-09 15:50:52 2092

原创 进程运行状态

进程是计算机中已运行程序的实体。程序本身只是指令集合,进程才是程序的真正运行。用户下达运行程序的命令后,就会产生进程。同一程序允许有多个进程,以便一个程序能被多个用户同时访问,却不产生冲突。进程需要一些资源才能进行工作,比如cPu使用时间,存取器,文件以及I/O设备。一般而言,进程的运行状态如图所示:1)运行状态(执行窗台):进程正在处理器上运行。在单处理机模式下,每个时刻只能有一个进

2016-09-07 16:28:41 3397

原创 复杂链表的复制

复杂链表的结构struct RandomListNode {int label;struct RandomListNode *next, *random;RandomListNode(int x) :label(x), next(NULL), random(NULL) {}};//其中random指向链表中的任意一个节点或者为空要在o(n)时间内完成链表的复

2016-09-07 13:05:10 324

原创 Bit-Map

位图(Bit-Map)使用位数组来存取元素,判断某些元素是否存在。由于使用位为单元来存取元素,因此大大节省了存取空间。适用于海量数据的查找,删除及判重。先介绍比特编位方法,比特位从右往左位数升高,第一位编号为0,最高位编号为N-1。对于一个int a[4]的数组而言,由于一个int型占用4字节,一字节占8bit,因此一共有128bit,其中a[0]:0----31a[1]:32----

2016-09-04 14:14:03 298

原创 二叉搜索树转换为双向链表

二叉搜索树转换成对应的双向链表,不能生成新的节点,只允许改变节点的的指针。解题思路:由于按照中序遍历方法遍历二叉搜索树得到的结果是有序的,因此可以按照中序遍历方法遍历搜索树。定义函数BinaryTreeNode* Transfer(BinaryTreeNode* root),该函数将以节点root为根节点的二叉树转换为对应的有序双向链表,并返回该双向链表的头节点指针。具体代码如下:// Conso

2016-08-31 21:38:45 300

原创 找出数组中出现超过1/4的三个数

原题:已知数组中有三个数超过了数组长度的1/4,请找出这三个数。// ConsoleApplication6.cpp : 定义控制台应用程序的入口点。//找出数组中出现1/4的三个数#include "stdafx.h"#include#include#includeusing namespace std;//数组中有三个数出现超过数组长度1/4,求这三个数void

2016-08-30 19:26:36 2028

原创 后缀树

后缀树的构建及查询等应用

2016-08-29 21:12:46 517

原创 第一个只出现一次的字符

在字符串中找出只出现一次的字符。我们可以使用哈希表结构解决此问题。以哈希表的键值作为字符,对应的出现次数为值。具体代码如下:// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。//计算只出现一次的字符#include "stdafx.h"#include#includeusing namespace std;char FirstNotR

2016-08-25 21:14:11 269

原创 丑数

我门把只含有因子2,3,5的数称为丑数。求按从小到大排列的第1500个丑数。习惯上,我门把1当作第一个丑数。假设前i个丑数已经按序排列,现在求第i+1个丑数。很显然,第i+1个丑数为前i个丑数分别乘以2或乘以3或乘以5后大于第i个丑数的最小丑数。假设T2为前i个数乘以2后第一个大于第i个丑数的数,T3为前i个数乘以3后第一个大于第i个丑数的数,T5为前i个数乘以5后第一个大于第i个丑数的数,那么第

2016-08-25 20:39:01 243

原创 链表中的公共节点

求取来拿表中的第一个公共节点。由于链表中的节点都有一个指向下一个节点的指针,当某个节点公共时,意味着该公共节点指向的下一个节点也公共,即第一个公共节点后的所有节点公共。因此,两条链表按公共节点重叠后呈现Y型。我们可以先计算两条链表的长度差,该长度差就是长链表优先要走的步数,之后两链表就一个一个对应比较,直到找到第一个公共节点为止。具体代码如下:// ConsoleApplicati

2016-08-25 16:31:46 2764

转载 把数组中的数字拼接起来组成最小的数

例如输入数组{3,32,321},则拼接起来的最小数为321323。假设有两个数m和n,我们定义mnm,则有m>n。m和n都是int范围内的数字,它们拼接起来的数字很可能超出int所能表示的范围。在这里,我们把数字转换为字符串。将数字按上面定义的比较方式从小到大排序,那么得到的组合数字最小。相关数学证明可以网上搜寻。源码如下:// ConsoleApplication60.cp

2016-08-24 19:12:01 6024 1

原创 键树

键树又称数字查找树,它是一棵度大于等于2的树,树中的节点不是包含一个或几个关键字,而只是包含组成关键字的符号。如果关键字是数值,则节点中的元素为一位的数字;如果关键字为字符,则节点中的元素为26个字符。如下是一棵键树。从根节点到叶子结点路径上的元素组成一个关键字,其中叶子结点的特殊字符表示字符串的结束。叶子节点中有指向关键字记录的指针。为了查找的方便,我们约定同一层兄弟

2016-08-24 10:17:12 1862

原创 归并排序的应用

在数组中的两个数如果前一个数大于后面的数,则这两个数组成逆序对。解题思路:将数组中的元素两两划分为单一数组元素,用high1和high2分别表示相邻两个数组中末尾元素的位置,如果数组1中的high1的元素大于数组2中high2的元素,则high1与数组2中的所有元素构成逆序对(数组1和数组2均为递增数组),统计逆序对个数,high1--;否则,high2--;同时对数组1和数组2中的元素作归并

2016-08-22 16:33:07 683

原创 循环有序数组中查找指定值

循环数组中查找是否存在指定值的思想是:由于是循环有序数组,那就说明该数组通过循环移位可以成为有序数组,即该数组可以划分为两个有序的部分,且前一部分的元素都不小于后一部分元素,也就是形如{7,8,9,1,2,3,4}的数组。我门可以借鉴二分查找的方法解决。使用low和high指针分别指向数组首尾部元素,当low所指元素小于high所指元素时,此时数组为有序数组,可以直接使用二分法查找;当low所指元

2016-08-21 20:43:03 2154

原创 原路归并

// ConsoleApplication55.cpp : 定义控制台应用程序的入口点。//原地归并排序#include "stdafx.h"#include#includeusing namespace std;//将长度为n的数组逆转void reverse(int *arr, int n){ for (int i = 0; i < (n / 2); i++){ int

2016-08-21 20:01:43 284

原创 原地归并排序

传统二路归并排序在进行排序的过程中,需要使用长度为n的辅助空间存储原序列,再次,本文介绍一种新的排序方法---原地归并排序,该方法不需要使用额外的存取空间,空间复杂度为o(1)。原地归并排序是在二路归并的基础上进行的改进,在二路归并的归并操作中,原地归并不再使用不再使用长度为n的辅助空间,而是在原地进行归并操作。其具体步骤是;首先在已排好序的左序列中找到第一个数i,使其大于已排好序的右序列中的第一

2016-08-21 19:11:24 1233 1

原创 二路归并排序

二路归并排序的核心思想是对两个已排序的子序列进行两两归并合成一个子序列的过程。它是利用分治法求解的一个典型应用。设归并排序的当前区间是R[low..high],二路归并排序的主要步骤如下:1 将当前区间一分为二。2 分别对左右区间排序。3 对左右区间执行归并操作。其中归并操作的具体过程如下:首先申请辅助空间,将两个子序列相邻地复制到辅助空间中,然后依次在辅助空间中从左右区间取值

2016-08-20 19:06:56 1322

原创 堆排序

堆排序---以二叉树的结构存储堆中元素,对于树中任一根节点而言,它的左子树和右子树要么都比它大或者比它小。堆排序分为两步:初始建堆,交换数据,重新建堆。

2016-08-20 15:00:46 339

原创 排序

将由1,2,3组成的乱序序列数排序,使得排序后的顺序为1,2,3.核心思想:使用begin,end,current三个指针,初始时begin,current指向序列首部,end指向序列尾部。当current指向1时,current++;当current指向0时,current与begin指针的内容交换,current++,begin++;当current指向2时,current与end的内容交

2016-08-19 16:26:10 329

原创 quicksort

快速排序核心思想:选择原序列中的某个数作为基准值,通过某种操作,使得基准值的左边的序列都小于基准值,基准值右边的序列都大于基准值,然后分别将左右两边的序列按照同样的操作进行排序,直至整个序列有序为止。// ConsoleApplication51.cpp : 定义控制台应用程序的入口点。//QuickSort#include "stdafx.h"#include#includeusin

2016-08-18 20:42:43 870

原创 shell排序

Shell排序核心思想:首先将原序列划分为具有多个相同步长的子序列,对每个子序列进行插入排序,排完序列之后缩短步长值,再次进行划分并排序,直至序列基本有序为止。到目前为止,对于步长的取值仍没有特定的规则,一般而言,步长值每次缩短一半,直至为1.// ConsoleApplication50.cpp : 定义控制台应用程序的入口点。//shell sort#include "stdafx.h"

2016-08-18 19:32:51 425

原创 设计模式----工厂方法模式

设计模式----工厂方法模式工厂方法模式是再简单工厂模式的方法下进行的改进,简单工厂模式有一个大的缺陷就是当要增加新的产品类时,就必须在核心工厂类的判断分支中增加对于新类的判断,即修改工厂类,这样违背了设计模式中的 开放,封闭原则。工厂方法对每一个产品类都建立一个工厂类,这样在增加产品时,只需要增加对应的工厂子类即可,而不必修改工厂父类。工厂方法的结构图如下所示://

2016-08-18 10:31:51 300

原创 设计模式之抽象工厂

定义:提供创建一系列相互依赖或相关的对象的接口,而无须指定具体的类。

2016-08-17 12:44:38 267

原创 打印所有和为s的连续正序列

题目描述:输入正整数s,打印出所有和为s的连续序列。解题思路:将正整数序列1-s按照升序排列,分别用small和big指向序列中的最小值和最大值,计算从small至big这一范围内所有值的和。如果计算的和大于s,则将small指针向前移动,即删除此时序列中的最小值;如果经计算的和小于s,则将big指针向后移动,即增大序列的和;直至small指针指到原序列的中间为止。初始化时,small和big

2016-08-16 20:43:20 637

原创 统计序列中出现一次的数字

数字序列中找出其中只出现一次的数字,而序列中的其他数字出现两次。

2016-08-16 16:00:50 899

原创 C++函数覆盖,重载,隐藏的区别

c++中函数的覆盖,重载和隐藏之间的关系是很令人头疼的,又是不太容易区分的,现在此总结一下。范围的不同:函数的重载发生在类内部,而函数的覆盖,也叫函数重写,及函数隐藏发生在类间。也就是说,在同一个类中只会发生函数的重载,而在子类与父类间会发生覆盖和隐藏。声明方式的不同:在同一个类中,如果声明多个函数,只要它们的函数名相同,就会发生重载,而不管它们的参数列表及参数个数是否相同;当子类中存在与

2016-08-16 13:25:44 357

无线传感器网络定位算法

在传统PSo定位算法的基础上引入精英学习策略和混沌搜索策略将极大地提高节点定位精度。

2016-08-16

空空如也

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

TA关注的人

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