- 博客(41)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
翻译 C语言中位运算符异或“∧”的作用
异或运算符∧也称XOR运算符。它的规则是若参加运算的两个二进位同号,则结果为0(假);异号则为1(真)。即0∧0=0,0∧1=1,1∧1=0。如: 即071∧052,结果为023(八进制数)。“异或”的意思是判断两个相应的位值是否为“异”,为“异”(值不同)就取真(1),否则为(0)。 下面举例说明∧运算符的应用: (1)使特定位翻转 假设有01111010,想使其低4
2017-03-19 14:16:34
24820
转载 《STL 源码解析》之序列式容器
序列式容器所谓序列容器即容器其中的元素都可序,但未必有序。常见的序列容器包括vector,list,deque,queue以及stack.vectorarray是静态空间,一旦配置就不可改变。vector是动态空间,随着元素的加入,内部机制会自动扩充以容纳新元素。1.1迭代器vector维护的是一个线性区间,所以无论元素类型为何,普通指针都可以作为vector的迭代器而满足所有的必要条件...
2019-12-25 11:07:24
199
原创 Canvas 学习笔记---基础图形的绘制
一、Canvas的坐标系说到坐标系,大家都不陌生,在数学中,我们学习过平面坐标系。在HTML中,也存在着坐标系。Canvas的坐标系和HTML的坐标系是类似的。有一定的相同的地方,也有不同的地方。相同点:Canvas和HTML的坐标系统原点是都处于左上角,X轴上向右递增正数,向左递减;Y轴上向下递增为正数,向上递减。不同点:即Canvas允许我们将原点进行平移,也即通过代码我们可以将Canv...
2019-12-20 19:20:23
463
原创 《Effitive C++学习》之定制new和delete
第8章 定制new和delete条款49:了解new-handler的行为当operator new无法满足某一内存分配需求时,它就会抛出异常。它就会调用一个用户指定的错误处理函数new-handler(它其实是一个typedef),其实调用的是set_new_handler函数。set_new_handler:获得一个new_handler并返回一个new_handler 的函数。当o...
2019-12-20 16:40:26
298
原创 《设计模式学习总结 一》
第一章 简单工厂模式1.好的设计模式:可维护 ----只需要更改要改的代码可复用----代码可以重复使用可扩展----添加功能只需要另外加入代码就可以灵活性----只需将代码移动就可以做到满足排列需求2.面向对象的好处:通过封装、继承、多态把程序的耦合度降低。用设计模式使得程序更加灵活,容易修改,利于复用。3.尽可能的方法避免重复代码,即让业务逻辑与界面逻辑分开,让它们之间的耦合度下...
2019-12-20 16:19:36
183
原创 C++中的const和引用
首先,我们需要知道什么是引用?定义:引用就是给对象起别名,引用类型引用另一种类型。将声明符写成&d的形式来定义引用类型,其中d是声明的变量名。int size = 100;int &sum = size;要注意的是:我们在引用的时候必须要给引用赋值。例如:int &size;//这种是错误的。在一般的初始化变量的时候,初始值会被拷贝到新建的对象上,而定义...
2018-09-25 20:16:11
873
原创 TCP/IP协议的三次握手与四次挥手
一、TCP报文格式 上面图中有几个字段重点介绍一下:序号:Seq序号,占32位,用来标识从TCP源端向目的端发送的字节流,发起方发送数据时对此进行标记。确认序号:Ack序号,占32位,只有ACK标志为1时,确认序号字段才有效,Ack=Seq+1。 标志位:共6个,即URG、ACK、PSH、RST、SYN、FIN等,具体含义如下: (A)URG:紧急指针(urgent pointe...
2018-08-20 13:55:40
254
原创 二叉树的遍历
二叉树的遍历主要包括前序遍历、中序遍历、后序遍历和层序遍历四种,其中前三种是非常常用的,下面介绍前三种遍历的方法。前序遍历 思路:从根结点开始遍历,若二叉树为空,则直接返回NULL,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如下图所示: 代码实现: 前序遍历递归:class Solution{public: vector<int> ...
2018-08-16 20:59:24
212
原创 常见的HTTP状态码总结
最近学习了HTTP的相关内容,下面就HTTP的状态码做一个简单的总结。 2开头 (请求成功)表示成功处理了请求的状态代码200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。201 (已创建) 请求成功并且服务器创建了新的资源。。202 (已接受) 服务器已接受请求,但尚未处理。203 (非授权信息) 服务器已成功处理了请求,但返回的...
2018-08-14 14:42:22
252
原创 编写类String的构造函数、析构函数和赋值函数
问题:编写类String的构造函数、析构函数和赋值函数,已知类String的函数原型为:class String{ public: String(const char *str = NULL); // 普通构造函数 String(const String &other); // 拷贝构造函数 ~ String(void); // 析构函数 String &...
2018-07-27 15:33:26
2479
1
原创 修改MySQL数据库编码为UTF-8
一、MySQL数据库的编码字符集1、MySQL的版本不一样当然也会有不同不字符集编码方式,字符编码方式是用一个或多个字节表示字符集中的一个字符,每种字符集都有自己特有的编码方式,因此同一个字符,在不同字符集的编码方式下,会产生不同的二进制。2.字符集种类ASCII字符集:基于罗马字母表的一套字符集,它采用1个字节的低7位表示字符,高位始终为0。LATIN1字符集:相对于ASCII字...
2018-04-07 21:41:58
7713
1
原创 MySQL数据库基础
一、MySQL数据库基础1.什么是数据库?储存数据一般用文件就可以,那么为什么要用数据库呢? 文件保存数据是有缺点的:文件的安全性问题文件不利于查询和对数据的管理文件不利于存放海量数据文件在程序中控制不方便为了解决上述问题,数据库就出现了,数据库能更有效的管理数据。 注意: 数据库的水平是衡量一个程序员水平的重要指标。 因此,数据库是高效的存...
2018-04-04 23:11:52
344
1
原创 Linux背景
linux背景1.发展史要说Linux,还得从UNIX说起。UNIX发展的历史1968年,一些来自通用电气公司、贝尔实验室和麻省理工学院的研究人员开发了一个名叫Multics的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新的概念。1969-1970,AT&T的贝尔实验室研究人员Ken Tompson和Dennis Ritchie,在采用很多Mul...
2018-03-23 00:51:14
1977
原创 linux--基础IO
一、熟悉open/read/write/close等文件相关系统调用接口。open//头文件 #include<sys/types.h> #include<sys/stat.h> #include<fcntl.h>//函数原型int open(const char *pathname , int flags);int open(cons...
2018-02-14 21:24:12
406
原创 进程控制
一、进程的创建、终止和等待。1.进程创建fork():进程是处于执行期的程序以及相关资源的总称,进程在创建它的时候开始存活,在linux系统中,通过使用fork()函数复制一个现有进程来创建一个新进程,调用fork()函数的进程称为父进程,新产生的进程称为子进程,子进程几乎完整的复制了父进程,但至少pid不一样。调用fork()函数系统从内核返回两次:一次返回到父进程,另一次返回到新的子进程。for
2018-01-04 16:32:13
364
原创 进程调度、僵尸进程和孤儿进程、linux环境变量
一、进程的调度方式,调度算法总结。进程的三种状态1.等状态:等待某个事件的完成。 2.就绪态:等待系统分配处理器以便运行。 3.运行态:占有处理器正在运行。三种状态的转化调度方式剥夺方式:当一个进程正在运行的时候,系统可以基于某种原则,剥夺已分配给他的处理机,将处理机分配给其他进程,剥夺原则有:优先权原则、短进程优先原则、时间片原则。 非剥夺方式:分配程序一但把处理机分配给某进程后就让该进程一
2018-01-01 16:38:05
398
原创 自主实现一个简单的shell
最近学习linux,打开linux虚拟机在一个“黑框框”中敲下一些命令,就能对应的执行一些操作,通过对shell的进一步学习,对它的底层实现产生了浓厚的兴趣,应该通过学习,下面实现一个简单的迷你版的myshell。一、myshell的执行过程。1.获取命令行。2.解析命令行。3.建立一个子进程。4.替换子进程。5.父进程等待子进程退出。二、根据前面的思路和学过的知识,下面是实现的代码。#includ
2017-12-09 21:47:36
542
原创 linux实现彩色进度条,rpm和yum安装的区别和进程的task_struck结构
一、在Linux下实现进度条程序. 通过makefile进行编译. 建议自主完成一个彩色的进度条.1.什么是进度条?进度条:进度条是在计算机处理任务时,以图片形式显示处理任务的进度的一种显示。2.要设计一个什么样的进度条呢?那么我们经常见的进度条包括有长方形的条状强调内容从短短的一点一点开始慢慢变长的一个长方体块我们用#代替,还包括一个完成的百分数,当完成时会到达100%。3.进度条如何缓慢显示?想
2017-12-03 18:35:52
1587
原创 Linux基本指令、文件管理权限及Linux重要目录的整理
一.Linux的基本命令1.文件管理命令(1).创建文件-touch —touch file.txt 创建文件file.txt — touch .file.txt 创建隐藏文件file.txt(文件前加点,表示隐藏) —touch /home/file.txt 在指定目录下创建文件(2).删除文件rm: Linu
2017-11-15 16:29:04
538
原创 vector和list的使用及其模拟实现
一.vector使用及模拟实现。1.vector简介。 vector和数组类似,拥有一段连续的内存空间,并且起始地址不变。 因此能高效的进行随机存取,时间复杂度为o(1); 但因为内存空间是连续的,所以在进行插入和删除操作时,会造成内存块的拷贝,时间复杂度为o(n)。 另外,当数组中内存空间不够时,会重新申请一块内存空间并进行内存拷贝。注:vector相当于一个动态增长的数组。2.vecto
2017-11-11 23:19:45
485
原创 c++智能指针(SmartPtr)简单剖析
一、什么是智能指针?智能指针(smart pointer):是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。由于c++语言没有自动回收机制,写代码时总要new一个空间,用完之后必须要delete掉,有时候程序代码过于复杂,经常会忘记delete内存,从而导致程序异退出,因此
2017-08-22 12:14:46
2469
1
原创 String-引用计数的写时拷贝
【写时拷贝】 何为写时拷贝呢??? 提到写时拷贝就不得不提起浅拷贝和深拷贝,深拷贝补充了浅拷贝的不足,而写时拷贝补充了深拷贝的不足,那么到底是怎么补充的呢?下面,给大家细细道来。 其实写时拷贝就是当你读取到这个已经存在的空间时,并不会立刻开辟出一个一模一样的空间出来给你,而是用计数的方式来延迟拷贝,当你真正需要拷贝的时候,才会开辟空间给你。也就是延迟的深拷贝。 下面来看看浅拷贝和深拷贝是怎么
2017-08-18 11:27:48
341
原创 跳台阶问题+变态跳台阶问题(动态递归+非递归)
一、跳台阶问题。问题描述:小明一次可以跳上1级台阶,也可以跳上2级台阶,求小明跳上n级的台阶有多少种跳法?并分析算法的时间复杂度。 问题分析: 当台阶数n=1时,跳法f(1)=1; 当台阶数n=2时,跳法f(2)=2; 当台阶数n=3时,跳法f(3)=3; 当台阶数n=4时,跳法f(4)=5; 当台阶数n=5时,跳法f(5)=8; ……………. 当台阶数为n时,跳法f(n)=f(n-
2017-08-11 14:56:58
1300
原创 模板的分离编译问题
一、下面我们主要讨论分析一下模板为什么不支持分离编译?所谓的分离编译是指将声明和定义分开来写,即将一个函数的声明和定义放在.h和.cpp文件中。 写过模板的人应该都会发现当我们用上面的方式写一个函数的时候,只要在.cpp中包.h的头文件,就没什么问题,但是如果写模板的时候,就编译链接不过去,就如下面这个例子://func.h#include<iostream>template <clas
2017-08-07 20:28:33
394
原创 讨论构造拷贝构造的N中调用情况的问题
一、总结C++对传参和传返回值时构造的优化处理1.c++形式参数类型和返回值类型如果是引用,那么在传递时,会把实参或者返回值的引用自动赋值给形式参数。 2.c++返回值赋值和返回值的使用往往会进行编译器的优化. 例如下面的调用中,只会调用两次构造函数(一次默认构造函数,一次自动拷贝构造函数)。 注:只有在一个表达式内才会优化 二、完成下面的问题Test1中调用了2_次AA的拷贝构造函数,_1
2017-08-07 18:13:41
372
原创 多态&多态对象模型
一、什么是多态1.定义:多态,顾名思义就是”多种形态”。 2.构成多态的两个条件: 1).虚函数的重写。(子类可以不用写virtual,但父类必须写virtual,一般最好子类和父类都加virtual) 2).父类的指针(或引用)调用虚函数。 3.虚函数的作用主要就是实现多态,简单的说父类的指针或引用调用重写的虚函数的时候,当父类指针或者引用指向父类对象时调用的是父类的虚函数,指向子类对象时
2017-08-01 21:28:34
576
1
原创 c++实现顺序表、单链表和双向链表
c++实现顺序表、单链表和双向链表1.顺序表//SeqList.h#pragma once#include<iostream>#include<assert.h>using namespace std;typedef int DataType;class SeqList{public: SeqList() :_array(NULL) ,_size(0
2017-07-23 23:12:34
451
原创 C/C++动态内存管理
一、总结并剖析malloc/free和new/delete之间关系和差异。malloc/free1.函数原型及说明: void* malloc(long NumBytes):该函数分配了NumBytes个字节,并返回指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。void free(void *FirstByte):该函数是将之前用malloc分配的空间还给操作系统,也就是释放了这
2017-07-23 18:12:50
368
原创 菱形继承问题和虚继承是如何解决二义性与数据冗余的
菱形继承问题和虚继承是如何解决二义性与数据冗余的继承是c++的三大特性之一,其中菱形继承问题是一个值得我们学习和掌握的知识点。 1.什么是菱形继承呢? 菱形继承定义为:两个子类继承同一个父类,而又有子类同时继承这两个父类。 可能这样纯粹的文字大家不能直观的理解它,下面画一幅直观图便可一目了然: 菱形继承的代码描述如下:#include<iostream>using namespac
2017-07-21 21:30:25
1307
原创 c++复数类Complex的编写
c++复数类Complex的编写。复数:由实部和虚部组成。主要实现几个运算符的重载:=/==/+/-/+=/-+/前置++/前置–/后置++/后置–主要实现代码如下:头文件Complex.h 函数声明和类定义#include<iostream>#pragma onceclass Complex{public: Complex(double real=0.0,double image=0
2017-07-17 22:35:36
2285
原创 四个默认成员函数和运算符重载
一.类和对象的基础知识1.类的定义在C++中,用“类”描述“对象”,所谓的对象是指现实世界中的一切事物。 类是创建对象的模板,一个类可以创建多个对象,每个对象都是类的一个具体实例,拥有类的成员变量和成员函数。 类的组成:数据(成员变量)和程序(成员函数)。 例子: class person{public: //成员变量 char* name; i
2017-07-17 11:02:19
475
原创 c语言实现单链表面试题——进阶
c语言实现单链表面试题——进阶1.判断单链表是否带环?若带环,求环的长度?求环的入口点?解题: 快慢指针法: 快指针和慢指针从头结点开始走,快指针每次走两步,慢指针每次走一步,若不带环,快指针和慢指针不会相遇,若带环,快指针先进入环的入口点,当慢指针也进入环的入口点后,快慢指针将相遇。 1).判断单链表是否带环ListNode *IsCycle(ListNode *list)//判断链表是否带
2017-06-22 10:47:00
500
原创 c++入门基础知识
c++入门命名空间在c++中,为了避免标识符的命名发生冲突,标准c++引入了关键字namespace(命名空间),可以更好的控制标识符的作用域。 先看一个程序: #include <iostream>using namespace std;int a=40;namespace AA1{ int a=20;}namespace AA2{ int a=30;}namesp
2017-06-20 21:46:17
424
原创 c语言实现单链表面试题--基础篇
1.比较顺序表和链表的优缺点,说说它们分别在什么场景下使用?优缺点 顺序表和链表: 1.每个元素的访问 顺序表内存访问时,不需要多次内存到缓存的步骤,链表每个节点都需要指针找到内存然后加载到缓存中. 2.头插.头删.中间位置 顺序表在插入和删除之前要先对后面的数据进行挪动 ,链表直接插入和删除节点 . 3.尾插.尾删 顺序表直接对数据进行操作,链表需要对空间进行操作. 4.空间
2017-06-19 20:24:03
524
原创 c语言中回调函数的使用
c语言中回调函数的使用1.c语言中的回调函数指针回调在c语言中时通过函数指针来实现的,通过回调函数的地址传给被调函数从而实现回调。因此,要实现回调,必须首先定义函数指针,请看下面的例子:void Func(char *s);//函数原型void (*pFunc)(char *);//函数指针可以看出,函数的定义和函数指针的定义非常相似。 为了简化函数指针类型的变量定义,提高程序的可读性,我们需
2017-05-10 21:07:53
488
原创 指针
1.指针数组#定义:指向指针的数组。 #理解: 一个存放int类型的数组称为整型数组,那么存放指针的数组就叫指针数组。int *arr[10];#指针数组中的每一个元素均为指针,指针数组中的元素可以表示为“*(*(arr+i))”,又因为“()”的优先级较“”高,且“”是右结合,因此可以写作**(arr+i)。 #由于数组元素均为指针,因此arr是指向i+1个元素的指针。2.数组指针定义:数
2017-05-08 17:18:21
486
原创 可变参数列表源码的剖析
C语言可变参简介 我们在C语言编程中会遇到一些参数个数可变的函数,例如printf()这个函数,它的定义是这样的: int printf( const char* format, ...); 它除了有一个固定参数format以外,后面还有很多参数的个数和类型都是可变的,例如,我们可以有一下不同的调用方法: printf("%d",i); pr
2017-04-21 21:58:25
675
原创 宏和函数的区别
#define 定义宏 #define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或者定义宏。宏和函数区别:1.代码长度:每次使用时,宏代码都被插入到程序中,除了非常小的宏之外,程序的长度将大幅度增长。但是函数代码只出现于一个地方,每次使用这个函数时,都调用那个地方的同一份代码。2.执行速度:宏比较快,函数存在函数调用需要的时间长。3.操作符优先级、:宏
2017-04-10 22:21:27
665
原创 扫雷 简易版
用c语言写一个简易的扫雷游戏//game.h#define _CRT_SECURE_NO_WARNINGS 1#ifndef __GAME_H__#define __GAME_H__#include#include #include#include#define rows 11#define cols 11#define Count 10#define col (
2017-04-08 21:52:53
522
原创 c语言中的数组sizeof和strlen
sizeof strlensizeof(): 返回一个对象或者类型所占的内存字节数。strlen(): 用来计算字符串的长度,遇到"\0"结束。我们分别从一维数组,字符数组,二维数组的例子来分析。注:数组名代表整个数组的时候只有两种情况 sizeof(数组名):数组名单独在sizeof中时表示整个数组。 &数组名:这里的数组名表示整个数组。1
2017-04-05 12:38:31
680
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人