自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 A*寻路算法

理解A寻路算法具体过程 https://www.cnblogs.com/technology/archive/2011/05/26/2058842.htmlA算法(附c源码)https://www.cnblogs.com/mingbujian/p/4915546.htmlA*算法详解 https://blog.csdn.net/qq_36946274/article/details/81982...

2019-07-22 11:19:30 324

转载 C++中resize和reserve的区别

首先分清楚两个概念:1.capacity:该值在容器初始化时赋值,指的是容器能够容纳的最大的元素的个数。还不能通过下标等访问,因为此时容器中还没有创建任何对象。2.size:指的是此时容器中实际的元素个数。可以通过下标访问0-(size-1)范围内的对象。就比如说一个瓶子的容量是600ml,意思是它最多可以装600ml,而不是说现在瓶子里就有600ml,这里的600ml就相当于capacit...

2019-07-11 10:59:46 15353 2

转载 数据库的范式:第一范式、第二范式、第三范式、BC范式、第四范式

转载:http://www.cnblogs.com/CareySon/archive/2010/02/16/1668803.html 参考:https://blog.csdn.net/u014458048/article/details/56678698 https://blog.csdn.net/dove_knowledge/article/details/71434960简介数据库...

2018-08-20 14:26:29 2259

原创 高性能服务器程序框架

服务器模型1、C/S模型 TCP/IP协议在设计和实现上并没有客户端和服务器的概念,在通信过程中所有机器都是对等的。但由于资源都被数据提供者所垄断,所以几乎所有的网络应用程序都很自然地采用了C/S模型:所有客户端通过访问服务器来获取所需的服务。服务器启动后,首先创建一个或多个监听socket,并调用bind函数将其绑定到服务器感兴趣的端口上,然后调用listen函数等待客户端连接。服...

2018-08-19 23:41:35 4463

原创 内存拷贝函数memmove(支持内存重叠拷贝)的实现

主要考虑的情况如下:1、拷贝的数据是任意类型数据,所以指针用void * 接收。2、src源数据一般是只读的,在函数内部对其修改是非法的。3、返回值类型是void *,主要用来实现链式表达式,就像赋值表达式一样。4、判断指针是否为NULL时用assert而不是用if条件语句,因为每次调用函数都会进行一次判断,性能损失较大。 因此我们可以利用宏的开关作用。如果在调试时我们加入“#d...

2018-08-14 09:12:58 2213

原创 剑指offer面试题49:把字符串转为整数

此题并不复杂,主要是想考做题人思维的严密性和代码的健壮性,要想写出完整的正确的代码,必须要考虑各种异常的情况,以及设计出足够多的测试用例以供正确性检验,因此可以说也并不简单,至少刚开始对我来说就是这样的。我们主要考虑的是输入字符串参数存在的各种可能性: 1、输入的字符串是正数(’+’)、负数(’-‘)和0(’0’); 2、超过最大的正数(2^31-1),小于最小的负数(-2^31); 3...

2018-08-12 21:19:07 406

原创 锁、CAS操作和无锁队列的实现

锁的机制锁和人很像,有的人乐观,总会想到好的一方面,所以只要越努力,就会越幸运;有的人悲观,总会想到不好的一方面,患得患失,所以经常会做不好事。我一直把前一个当作为我前进的动力和方向,快乐充实的过好每一天。 常用的锁机制也有两种: 1、乐观锁:假设不会发生并发冲突,每次不加锁而去完成某项操作,只在提交操作时,检查是否违反数据完整性。如果因为冲突失败就继续重试,直到成功为止。而乐观锁用到的机

2018-08-12 09:51:36 8084 2

原创 IPV4地址的合法性校验及IPV4地址和无符号整型之间相互转换

将无符号整数转成IP地址#include <iostream>using namespace std;void ipv4_to_str(char* addr_str, unsigned int ipv4_addr){ //输出格式为A.B.C.D. sprintf_s(addr_str, 20, "%d.%d.%d.%d", (ipv4_...

2018-08-12 08:31:03 1803

转载 一致性哈希(Consistent Hashing)

转自:https://blog.csdn.net/baidu_30000217/article/details/53671716 参考:https://www.cnblogs.com/color-my-life/p/5799903.html http://www.zsythink.net/archives/1182背景介绍一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(D...

2018-08-11 22:53:52 344

转载 海量数据处理算法—Bloom Filter

1. Bloom-Filter算法简介Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中。 Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不会漏掉判断。也就...

2018-08-11 20:38:43 247

原创 C语言宏#define中#,##,#@和\的用法

一、(#)字符串化操作符作用:将宏定义中的传入参数名转换成用一对双引号括起来参数名字符串。其只能用于有传入参数的宏定义中,且必须置于宏定义体中的参数名前。如:#define example( instr ) printf( "the input string is:\t%s\n", #instr )#define example1( instr ) #instr当使用该宏定义...

2018-07-12 21:46:20 13076 1

原创 剑指offer面试题16:反转链表——递归和非递归

题目:定义一个函数,输入一个链表的头结点(第一个数据结点),反转该链表并输出反转后的链表的头结点。链表的定义如下:struct ListNode{ int m_nValue; ListNode* m_pNext;};非递归方法ListNode* ReverseList1(ListNode* pHead){ //pReverseHead代表逆转之后的...

2018-06-14 18:45:53 268

原创 常用的字符编码:ASCII、Unicode、UTF-8

基本概念:字符(Character) 是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。字符集(Character set) 是一个系统支持的所有抽象字符的集合。通常以二维表的形式存在,二维表的内容和大小是由使用者的语言而定。如ASCII,GBxxx,Unicode等。字符编码(Character encoding) 是把字符集中的字符编码为特定的二进制数,以便在计算机中存储。每个

2018-03-20 11:15:23 1449

原创 乐观锁和悲观锁

悲观锁在关系数据库管理系统里,悲观并发控制(又名“悲观锁”,Pessimistic Concurrency Control,缩写“PCC”)是一种并发控制的方法。它可以阻止一个事务以影响其他用户的方式来修改数据。如果一个事务执行的操作都某行数据应用了锁,那只有当这个事务把锁释放,其他事务才能够执行与该锁冲突的操作。悲观并发控制主要用于数据争用激烈的环境,以及发生并发冲突时使用锁保护数据的成本要低于回

2018-03-06 09:34:27 205

原创 脏读、丢失更新、不可重复读、幻读

脏读(Dirty Read):事务T1更新了数据还未提交,这时事务T2来读取相同的数据,则T2读到的数据其实是错误的数据,即脏数据。基于脏数据所作的操作是不可能正确的。脏页是内存的缓冲池中已经修改的page,未及时flush到硬盘,但已经写到redo log中。读取和修改缓冲池的page很正常,可以提高效率,flush即可同步。脏数据是指事务对缓冲池中的行记录record进行了修改,但...

2018-03-06 09:26:44 1804

原创 Linux中的stat/fstat/lstat函数

函数功能通过文件名filename获取文件信息,并保存在buf所指的结构体stat中函数原型(1)函数头文件 #include <sys/stat.h> #include <unistd.h> (2)函数int stat(const char *restrict pathname, struct stat *restrict buf);根据文件名字,获取文件对应属性。一般是文件没

2018-03-05 18:02:01 803 1

转载 C++解决智能指针交叉引用问题

智能指针的交叉引用问题,是如下代码发生的问题,导致的结果是对象无法析构,资源无法释放,问题严重!class B;class A{public: A(){cout&lt;&lt;"A()"&lt;&lt;endl;} ~A(){cout&lt;&lt;"~A()"&lt;&lt;endl;} shared_ptr&lt;B&gt; _ptrb;};

2018-02-28 11:15:56 2419 1

转载 C++智能指针scoped_ptr的原理和使用

scoped_ptr是一个类似于auto_ptr的智能指针,它包装了new操作符在堆上分配的动态对象,能够保证动态创建的对象在任何时候都可以被正确的删除。但是scoped_ptr的所有权更加严格,不能转让,一旦scoped_pstr获取了对象的管理权,你就无法再从它那里取回来。正如scoped_ptr(局部指针)名字的含义:这个智能指针只能在作用域里使用,不希望被转让。代码实现如下:

2018-01-23 10:35:17 15400 2

转载 C++智能指针auto_ptr的原理及使用

std::auto_ptr auto_ptr是C++标准库中()为了解决资源泄漏的问题提供的一个智能指针类模板(注意:这只是一种简单的智能指针) auto_ptr的实现原理其实就是RAII(Resource Application Immediately Initialize),在构造的时候获取资源,在析构的时候释放资源,并进行相关指针操作的重载,使用起来就像普通的指针。使用auto_pt

2018-01-22 21:35:32 9878 3

原创 字符串笔试题3:火柴棒问题

题目: 火柴棒问题 用火柴棒摆成的0-9间的数字,横向由一根火柴构成,纵向都是由两根火柴构成,可按如下规则进行变化: 1.数字移动一根火柴棒可变成其它0到9之间合法的数字 2.数字添加一根火柴棒可变成其它0到9之间合法的数字 3.数字去掉一根火柴棒可变成其它0到9之间合法的数字 现在给出一个带有两个操作数的+,-,*,/的算术式子,需要你判断该式

2018-01-15 11:13:38 1959 1

原创 字符串笔试题2:大数的加减法计算

题目: 大数的加减法class BigInteger{public: BigInteger(char* number);private: char *_number; friend BigInteger operator+(const BigInteger &left, const BigInteger &right); friend BigInteger o

2018-01-15 11:08:10 1157

原创 字符串笔试题1:找出子串在字符串中出现的次数,子串中的字符可以不连续,但顺序固定

题目: 有一天,小明在游戏中获得了一串数字,直觉告诉他这不是一串普通的数字串,或许可以破解一些关于网易的秘密。破解的第一步,他很想知道,在这串数字中,最多可以挑出多少个‘9706’串。挑选的规则为: (1)挑出的数字’9’,’7’,’0’,’6’在原串中可以不连续,但是数字的先后顺序不能改变 (2)使用过的数字不能被再次使用 如’123901370997606

2018-01-15 11:02:34 4909

原创 C++找出字符串中最长的不含重复字符的子串

题目:找字符串中最长的不重复子串 string str = &amp;quot;890123457063788263178548596239785&amp;quot;;方法1:使用string和vector //保存不重复的临时子串 string tmp; //保存所有不重复的子串 vectorstring&amp;gt; svec; //记录每次开始查找字符的相对位置 int

2018-01-14 22:20:19 7593 1

原创 C++删除字符串中的子串

题目:string str = "62354iijnjnij26758667ijn615468565ij"将子字符串"ijn"全部删除方法1: 该方法有个缺陷,它会将字符串中只要是ijn顺序的字符都会删除 int pos = 0; while ((pos = str.find("ijn")) != -1) { str.erase(pos, 3); }

2018-01-14 22:13:57 18950 2

原创 C++实现带赋值运算符重载函数和迭代器的String类

该类实现了C++中string类中定义的基本方法,可以看出其类似于容器。#include using namespace std;class CString{public: //带一个默认值参数的构造函数 CString(const char *p = NULL) { if (p == NULL) {

2018-01-14 21:54:31 593

原创 C++实现带写时拷贝功能的String类

字符串写时拷贝实现原理: 通过对象的引用计数来减少内存的申请开销,经过拷贝构造或赋值函数得到的所有对象,在还没有对其中某个某个对象进行修改操作时,都共享一个对象的内存。否则,如果原有对象的引用计数大于1时,将会为修改的对象分配新的内存,并在原有的对象引用计数中减一。方法1成员变量是字符指针类型,字符串前四个字节用来存放当前对象被引用的次数。class CString{public: C

2018-01-14 20:43:13 244

原创 剑指offfer面试题5:从尾到头打印链表

题目:输入一个链表的头结点,从尾到头反过来打印每个结点的值。单链表的实现:1、linklist.h#ifndef _LINKLIST_H_#define _LINKLIST_H_typedef int Elem_Type;typedef struct LNode{ Elem_Type data; struct LNode* next;}LNode,*Lin

2018-01-09 16:59:28 191

原创 剑指Offer面试题4:替换字符串中的空格

题目:请实现一个函数,把字符串中的每个空格替换成"%20"。例如输入"We are happy.",则输出"We%20are%20happy."。解题方案: 方案一:从前往后替换空格。每找到一个空格将剩余字符都向后移动两位,并用"%20"替换空格,由于有的字符会移动不止一次,所以时间复杂度是o(n2),要求字符数组的长度要足够长。 方案二:从后往前替换空格。先遍历字符串,计算出字符串的长度和所含

2018-01-04 12:33:27 204

原创 剑指offer面试题3:在二维数组中查找数字

题目:给定一个二维整型数组和一个数字,查找该数字是否在二维数组中。该二维数组的特点是:每一行的数字递增排序,每一列的数字也是递增排序。解题方案: 方案1:从数组中间开始查找; 若要查找的数字比中间数字小,则可能出现地方在该数字的右半部分和下半部分,出现重叠;若要查找的数字比中间数字大,则可能出现的地方在该数字的左半部分和上班部分,依旧会重叠。 方案2:从数组左上角或者右下角开始查找; 如果要

2018-01-03 17:59:04 380

原创 剑指offfer面试题1:字符串赋值运算符重载函数

题目:以下是类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public: CMyString(char* pData = NULL); CMyString(const CMyString& str); ~CMyString(void); CMyString& operator=(const CMyString& str

2018-01-02 18:35:11 341

原创 C++中关键字auto和decltype的区别

C++11标准引入了auto和decltype类型说明符,它能让编译器帮我们去分析表达式所属的类型。auto和decltype的主要区别有三个方面:第一,auto类型说明符用编译器计算变量的初始值来推断其类型,而decltype虽然也让编译器分析表达式并得到它的类型,但是不实际计算表达式的值。第二,编译器推断出来的auto类型有时候和初始值的类型并不完全一样,编译器会适当地改变结果类型使其更符合初始

2017-12-31 17:11:38 2148 1

原创 引用和指针的区别

指针和引用都是复合类型,都与内存中实际存在的对象有联系。指针“指向”了内存中的某个对象,而引用“绑定到”内存中的某个对象,它们都实现了对其他对象的间接访问,二者的区别主要有两方面:第一,指针本身就是一个对象,允许赋值和拷贝,而且在指针的生命周期内它可以指向不同的对象;引用不是一个对象,无法令引用重新绑定到另外一个对象。第二,指针无须在定义时赋初值,和其他内置类型一样,在块作用域内定义的指针如果没有初

2017-12-31 16:45:09 201

转载 C++—volatile、explicit、mutable关键字

转自:http://blog.csdn.net/wendy_keeping/article/details/752011531.volatile关键字volatile是类型修饰符(一致性、原则性、可见性) <1>防止多线程对共享变量进行缓存,保证各线程实时从内存中读取变量值; <2>防止编译器对指令顺序进行调整。 防止CPU对指令顺序进行调整,用barrier()。volatile关键字保证内

2017-11-15 20:14:58 395

原创 解决在GitHubDesktop中如何使用atom打开github仓库的问题

首先先讲一下GitHubDesk和atom的关系:GitHubDesktop是GitHub网站的客户端软件,可以在本地管理项目代码,即就是仓库。在连网时,可以直接输入GitHub网站仓库的地址,将仓库clone到本地,然后就可以在没网的情况下管理本地地仓库。连网时,可以将本地新建的或修改过的仓库提交到GitHub网站,可以起到实时更新的作用,也能做版本控制。 而因为有了atom这个强大的文本编辑器

2017-10-27 11:19:31 4194 1

原创 (*(void(*) ())0)();------这是什么?

(*(void(*)())0)();请问这条语句是什么?有什么作用?当上一次面试官把这到题抛给我时,很遗憾,没能将这道题的完整答案讲给面试官。其实这个问题在《C陷阱和缺陷》和《C语言深度剖析》这两本书都有过阐述。因此,我重新去看了一遍,现在就将完整的过程写下来,一个是帮助我理解和记忆,另一个也是把答案共享给遇到相同问题的你们。下面就来进行分析:第一步:void(*)(),可以明白这是一个函数指针类型

2017-10-26 11:03:17 6337

原创 C和C++中标准输入中遇到的问题

C和C++中的标准输入都是库函数,在输入的时候应该注意一些问题。在控制台输入的数据都是字符串,然后通过类型转换存放到变量中。比如scanf和cin都会有一些限制。它们会忽略在第一个非空格或者非换行符之前的空格和换行符,意思是会跳过这些字符,但是如果在非空格字符之后遇到空格或者换行符,就会停止继续读取,可以下次继续读取,而不必输入。但是格式控制符确定了读取的字符是否可以转换想要的值,并存放到指定的变量

2017-10-23 20:05:43 399

原创 extern关键字的使用

概念extern是外面的、外来的意思。extern可以置于变量或者函数前,以标示变量或者函数的定义在别的文件中,下面的代码用到的这些变量或函数是外来的,不是本文件定义的,提示编译器遇到此变量和函数在其他模块中寻找其定义。代码举例a.cppint arr[] = {0,1,2,3,4,5,6,7,8,9};b.cppint main10(){ extern int *arr; pri

2017-10-23 19:39:04 3118

原创 Linux进程间通信(二)之信号量

概念1、临界资源:同一时刻,只允许一个或有限个进程或线程访问的资源。 例如: (1)多个人同时用一个笔签字,此时只能有一个人用笔写字,其他人只有等他写完才可以使用这支笔。 (2)若商场试衣间可以有3个试衣间,可以同时供3个人使用,其他人必须等到其中的试衣间没人才能使用。 (3)但是像走廊,不是临界资源,可以同时由多人同时通行。 2、临界区:访问临界资源的代码段。 3、原子操作:不可被分割

2017-10-23 15:02:34 8648 3

原创 printf函数结合自增自减运算的使用

源程序int main(){ int i = 0; printf("%d,%d,%d\n",i++,--i,i++); return 0;}按照我们平时对自增自减运算符表达式的理解,我们预期的结果应该是:0,0,0但实际结果却是:0,1,0原因是我们在调用标准库函数printf之前,对所传入的参数进行了遍历,将计算之后的结果保存在寄存器中,并当做实参压入栈中,由于CPU中

2017-10-23 14:45:17 4273

原创 C++中的引用和指针的区别

相同点都是地址的概念,指针指向一块内存,它的内容是所指内存的地址;引用是某块内存的别名,可以说引用是更安全的指针。定义和性质区别(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:int a=1;int *p=&a;int a=1;int &b=a;上面定义了一个整形变量和一个指针变量p,该指针

2017-10-21 22:09:24 219

空空如也

空空如也

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

TA关注的人

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