![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 81
兰亭落雪
目的不能抵达怎么付出都是偏差。
展开
-
堆栈详解
1、申请方式 stack: 由系统自动分配。 例如,声明在函数中一个局部变量 int b; 系统自动在栈中为b开辟空间 heap: 需要程序员自己申请,并指明大小,在c中malloc函数 如p1 = (char *)malloc(10); 在C++中用new运算符 如p2 = (char *)malloc(10); 但是注意p1、p2本身是在栈中的。2、申请后系统的响应 栈:...原创 2019-07-17 20:20:35 · 201 阅读 · 0 评论 -
文件操作
一、linux文件操作的概念1. 文件的概念:文件在linux系统中,是对系统资源的一个抽象,是对系统资源进行访问的通用接口。linux下的系统资源都可表述为文件。这样做可以对这些资源提供接口,供系统编程接口设计。2. 文件的类型:普通文件:存储在系统磁盘上的普通文件,以字节为单位存储。文件系统本身不关心内容,只提供数据存储和访问的通道。文件内容是由应用程序解释的。目录:目录是...原创 2019-03-27 17:16:01 · 410 阅读 · 0 评论 -
sizeof
一、sizeof用来计算一个变量,或者数据类型的长度,以字节为单位。它是一个操作符,如同++,--一样,单操作数。比如在我的电脑上,sizeof(int)=4,sizeof(long)=4。还有一般要求的sizeof(char)=1。类:非static数据成员变量+虚函数指针+对齐;无论多少个虚函数,都只有一个指向虚函数表的指针(4字节)联合体:最长成员的大小对齐带位域:相邻位...原创 2019-03-26 20:45:22 · 7338 阅读 · 0 评论 -
recv函数返回值总结
函数原型:int recv( SOCKET s, char *buf, int len, int flags)功能:不论是客户还是服务器应用程序都用recv函数从TCP连接的另一端接收数据。参数一:指定接收端套接字描述符;参数二:指明一个缓冲区,该缓冲区用来存放recv函数接收到的数据;参数三:指明buf的长度;参数四 :一般置为0。阻塞与非阻塞recv返回值没有区分,都...原创 2019-03-26 20:22:37 · 1530 阅读 · 0 评论 -
read/fread write/fwrite 的区别
fread就是通过read来实现的,fread是C语言的库,而read是系统调用。差别在read每次读的数据是调用者要求的大小,比如调用者要求读取10个字节数据,read就会从内核缓冲区(操作系统开辟的一段空间用来存储磁盘上的数据)读10个字节数据到数组中,所以每次调用read会涉及到用户态与內核态之间的切换从而损耗一定的性能。而fread不一样,为了加快读的速度,fread每次都会从内核缓冲区...原创 2019-03-26 20:20:39 · 273 阅读 · 0 评论 -
tcgetattr函数
tcgetattr函数用于获取与终端相关的参数。参数fd为终端的文件描述符,返回的结果保存在termios结构体中,该结构体一般包括如下的成员:tcflag_t c_iflag;tcflag_t c_oflag;tcflag_t c_cflag;tcflag_t c_lflag;cc_t c_cc[NCCS];其具体意义如下。c_iflag:输入模式标志,控制终端输入方...原创 2019-03-17 20:15:45 · 1133 阅读 · 0 评论 -
C语言中的stdin,stdout,stderr
我们在写C程序时经常遇到printf(),fprintf(),perror(),这些东西到底有什么作用。说到这不得不提及stdin,stdout,stderr。想想,我们在用C去写文件时的操作,File *fp=fopen(),这个fp就是我们向系统申请的,相当于一通往文件的通道。其实,stdin,stdout,stderr就是这个fp,不过他是随着计算机系统的开启默认打开的,其中0就是...原创 2019-03-17 20:15:09 · 1308 阅读 · 0 评论 -
c++ 时间类型详解(time_t和tm)
我们在编程中可能会经常用到时间,比如取得系统的时间(获取系统的年、月、日、时、分、秒,星期等),或者是隔一段时间去做某事,那么我们就用到一些时间函数。linux下存储时间常见的有两种存储方式,一个是从1970年到现在经过了多少秒,一个是用一个结构来分别存储年月日时分秒的。time_t 这种类型就是用来存储从1970年到现在经过了多少秒,要想更精确一点,可以用结构struct timeval...原创 2019-03-17 20:14:59 · 9145 阅读 · 0 评论 -
动态库与静态库
1.在windows中静态库是以.lib为后缀的文件,共享库是以.dll为后缀的文件。在linux中静态库是以.a为后缀的文件,共享库是以.so为后缀的文件。2.以linux下的静态库和动态库为例我们研究一下,首先我们看一下他们的生成方式:静态库:首先将源文件编译成目标文件:gcc–ca.cb.c生成静态库:ar–rclibstatic.aa.ob...原创 2019-03-17 20:14:18 · 368 阅读 · 0 评论 -
序列化与反序列化详解
一、前言 个人感觉序列化简单来说就是按一定规则组包。反序列化就是按组包时的规则来接包。正常来说。序列化不会很难。不会很复杂。因为过于复杂的序列化协议会导致较长的解析时间,这可能会使得序列化和反序列化阶段成为整个系统的瓶颈。就像压缩文件、解压文件,会占用大量cpu时间。 所以正常的序列化会在时间和空间上考虑。个人感觉对于电商业务时间应该是相对重要些。毕竟用户没有那么多时间...原创 2019-03-17 20:13:01 · 1172 阅读 · 0 评论 -
构造函数与析构函数抛出异常的问题判断
构造函数可以抛出异常么?析构函数可以吗?【分析】从语法上来说,构造函数和析构函数都可以抛出异常。但从逻辑上和风险控制上,构造函数可以,析构函数不推荐抛出异常。(1)构造函数可以抛出异常无论何时,从构造函数中抛出异常都是可以的。动态创建对象要进行两个操作:分配内存和调用构造函数。若在分配内存时出错,会抛出bad_alloc异常;若在调用构造函数初始化时出错,会不会存在内存泄漏呢?答案...原创 2019-03-17 20:11:54 · 510 阅读 · 0 评论 -
C++ STL之vector用法总结
C++ STL之vector用法总结介绍vector是表示可变大小数组的序列容器。 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增...原创 2019-03-17 20:09:48 · 99 阅读 · 0 评论 -
STL法则
总结STL中vector,set,multiset,map,multimap,deque,stack,list,queue,priority_queue,string的优缺点以及基本的函数用法。第1条:慎重选择容器类型。标准STL序列容器:vector、string、deque和list。标准STL关联容器:set、multiset、map和multimap。非标准序列容器slis...原创 2019-03-17 20:08:50 · 335 阅读 · 0 评论 -
智能蛇算法
在我看来,作出智能蛇的一个关键点在于怎么让蛇知道并让蛇头找到食物的位置。 主要运用 【哈密顿回路】原理:由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径。身子短还短的时候比较好说,不会自己撞自己,但是随着吃的食物逐渐增多,自身的长度也会慢慢增加...原创 2019-03-17 20:00:59 · 673 阅读 · 0 评论 -
const关键字
一、const修饰变量1、const修饰的常量必须初始化2、const修饰的常量不可改变其值3、对于常量,编译器会将其放在一个只读的内存区域,其值不能发生改变。4、使用常量的好处就在于灵活,程序中多次用到常量,修改其值时,只需要改变定义时候的常量值就可以。若非要改变:#include <stdio.h> int main(){ const i...原创 2019-03-27 18:03:34 · 181 阅读 · 0 评论 -
static
一、C语言中1、局部变量普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。普通局部变量存储于进程栈空间,使用完毕会立即释放。静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局...原创 2019-03-27 18:14:58 · 125 阅读 · 0 评论 -
C++内存分配
#include<iostream.h>void main(){char a[]="abc";栈 char b[]="abc";栈 char* c="abc";abc在常量区,c在栈上。char* d="abc"; 编译器可能会将它与c所指向的"abc"优化成一个地方。const char e[]="abc";栈 const char f[]="abc";栈 c...原创 2019-07-17 20:13:59 · 186 阅读 · 2 评论 -
基于最强连通分量的应用
#define MAX_PACK 10#include <stdint.h>#include <vector>#include<iostream>#include<algorithm>#include<string>#include<map>#include<set>#include<sys...原创 2019-05-29 09:56:26 · 388 阅读 · 0 评论 -
并查集的另类思想应用
#define MAX_PACK 10#include <stdint.h>#include <vector>#include<iostream>#include<algorithm>#include<cstdio>#include<string>#include<map>#include<...原创 2019-05-29 09:55:00 · 129 阅读 · 0 评论 -
虚表和虚指针
一、关于虚函数C++的多态性可以简单地概括为“一个接口,多种方法”,程序在运行时才决定调用的函数,它是面向对象编程领域的核心概念。 1、多态性 指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。 a、编译时多态性:通过重载函数实现 b、运行时多态性:通过虚函数实现。 2、虚函数...原创 2019-05-28 14:28:31 · 3131 阅读 · 0 评论 -
C++产生随机数
随机数计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了。)我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个...原创 2019-05-23 12:19:46 · 35595 阅读 · 9 评论 -
字节数相关
一、内存字 word字节 byte位 bit字长是指字的长度1字节=8位(1 byte = 8bit)1字=2字节(1 word = 2 byte)一个字节的字长是8一个字的字长为16bps 是 bits per second 的简称。一般数据机及网络通讯的传输速率都是以「bps」为单位。如56Kbps、100.0Mbps 等等。Bps ...原创 2019-05-06 16:57:13 · 264 阅读 · 0 评论 -
判断两个节点是否为堂兄弟
一、题目描述在二叉树中,根节点位于深度0处,每个深度为k的节点的子节点位于深度k+1处。如果二叉树的两个节点深度相同,但父节点不同,则它们是一对堂兄弟节点。我们给出了具有唯一值的二叉树的根节点root,以及树中两个不同节点的值x和y。只有与值x和y对应的节点是堂兄弟节点时,才返回true。否则,返回false。二、解题思路可以先分别算出两个节...原创 2019-04-19 11:30:16 · 719 阅读 · 0 评论 -
STL算法
一,只读算法查找算法find_if(beg,end,func):函数find的带一个函数参数的_if版本,与find功能相同,条件:使函数func返回true。搜索与统计算法count_if(beg,end,func):函数count的_if版本。二,可变序列算法可变序列算法包括元素复制,变换,替换,填充,移除和随机生成等。copy,transform,f...原创 2019-04-28 10:15:30 · 163 阅读 · 0 评论 -
STL综述
1.概述泛型编程思想最早缘于A.Stepanov提出的部分算法可独立于数据结构的论断。20世纪90年代初A.Stepanov和Meng Lee根据泛型编程的理论用C++共同编写了STL。但直至1998年,STL才成为C++的正式标准。在后来的几年中,各大主流编译器也都相继加入了对STL的支持,至此STL才开始得到广泛的应用。STL体现的是泛型编程的核心思想:独立数据结构和算法(这是...原创 2019-04-28 09:38:44 · 338 阅读 · 0 评论 -
内存泄漏
1.什么是内存泄漏(Memory Leak)? 简单地说就是申请了一块内存空间,使用完毕后没有释放掉。它的一般表现方式是程序运行时间越长,占用内存越多,最终用尽全部内存,整个系统崩溃。由程序申请的一块内存,且没有任何一个指针指向它,那么这块内存就泄露了。2、如何检测内存泄露第一:良好的编码习惯,尽量在涉及内存的程序段,检测出内存泄露。当程式稳定之后,在来检测内存泄露时,无疑增加了...原创 2019-05-02 17:11:17 · 351 阅读 · 0 评论 -
MFC 定时器用法 SetTimer、KillTimer
什么时候我们需要用到SetTimer函数呢?当你需要每个一段时间执行一件事的的时候就需要使用SetTimer函数了。 使用定时器的方法比较简单,通常告诉WINDOWS一个时间间隔,然后WINDOWS以此时间间隔周期性触发程序。通常有两种方法来实现:发送WM_TIMER消息和调用应用程序定义的回调函数。1.1 用WM_TIMER来设置定时器先请看SetTimer这个API函数的原型UI...原创 2019-04-26 08:53:17 · 856 阅读 · 0 评论 -
strtol,strtoll,strtoul, strtoull字符串转化成数字
一、功能:这一组函数根据指定的进制base(2-36或者0,为0时根据字符串自动推断转换的进制)将nptr指向的字符串转换为对应的整形。nptr可以以多个空格(isspace函数返回true的字符)开头,接着也可以有'+'或者'-'正负符号标记。如果base是16或者是0,接下来可以有“0x”的前缀,此时字符串将会当作16进制数字进行转换;如果接下的字符是‘0’,将会被当作8进制进行转换;除此...原创 2019-04-02 12:20:50 · 1133 阅读 · 0 评论 -
getopt函数
一、使用1、getopt()函数的出处就是unistd.h头文件2、函数原型:int getopt(int argc,char * const argv[ ],const char * optstring);//optstring是选项字符串getopt函数的参数:参数argc和argv:通常是从main的参数直接传递而来,argc是参数的数量,argv是一个常量字符串数组的地...原创 2019-04-02 11:38:26 · 679 阅读 · 0 评论 -
值传递,引用传递,指针传递
一、值传递1、特点:(1)形参是实参的拷贝,改变形参的值并不会影响外部实参的值。(2)从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。2、应用场景:当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。二、引用传递1、特点:(1)形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函...原创 2019-04-01 15:00:01 · 1485 阅读 · 1 评论 -
MFC添加游戏背景音乐
前一阵在给基于MFC的一个小游戏添加背景音乐的时候,刚开始是准备new一个新线程,但是在参考了一些资料与教程之后,决定采用MCI这个API,开始使用的是winmm.lib接口,使用mciSendString()函数调用,说到这点,确实很坑,网上的教程说少部分音频不能播放,很不幸,我就是那一部分,在尝试了数次时候,果断换接口,使用Vfw32.lib接口,用MCIWndCreate()函数播放,使用M...原创 2019-03-17 20:00:12 · 321 阅读 · 0 评论 -
MFC中Icon使用小结
一.步骤如下:(1)在Resource View中创建或者插入一个新的Icon资源,用于你想要的程序图标,假设ID号为IDI_ICON(这种图标要有16*16和32*32两种格式的,前者用于最小化和列表显示等,后者用于桌面图标和平铺显示等-如你给图片)(2)在C**App::InitInstance()中有几句:HICON hIcon=AfxGetApp()->LoadIcon...原创 2019-03-17 19:54:28 · 2887 阅读 · 0 评论 -
【C++】浅拷贝和深拷贝
深拷贝与浅拷贝简单的来说,【浅拷贝】是增加了一个指针,指向原来已经存在的内存。而【深拷贝】是增加了一个指针,并新开辟了一块空间让指针指向这块新开辟的空间。【浅拷贝】在多个对象指向一块空间的时候,释放一个空间会导致其他对象所使用的空间也被释放了,再次释放便会出现错误浅拷贝为了形象化说明什么是深拷贝和浅拷贝,我们就先写一个String类类里面包含【构造函数】,【拷贝构造函数】,...原创 2018-12-04 20:17:13 · 199 阅读 · 0 评论 -
重写(覆盖)、重载、重定义、多态
1 重写(覆盖)override override是重写(覆盖)了一个方法,以实现不同的功能。一般用于子类在继承父类时,重写(覆盖)父类中的方法。函数特征相同,但是具体实现不同。重写需要注意:被重写的函数不能是static的,必须是virtual的 重写函数必须有相同的类型,名称和参数列表 重写函数的访问修饰符可以不同。尽管virtual是private的,派生类中重写改写为pu...原创 2018-12-04 20:26:11 · 254 阅读 · 0 评论 -
C++经典知识
https://github.com/chankeh/cpp-backend-reference/blob/master/back-end.md一、指针与引用有什么区别?1、指针会占用内存,引用不占用内存。2、引用在定义时必须初始化。3、没有空的引用,但是有空的指针。二、static关键的几个作用1、函数体内的static变量的作用范围为该函数体,该变量内存只分配一次,因此...原创 2019-03-17 18:40:04 · 155 阅读 · 0 评论 -
C++右值引用
1.1左值和右值左值和右值的区分标准在于能否获取地址。最早的c++中,左值的定义表示的是可以获取地址的表达式,它能出现在赋值语句的左边,对该表达式进行赋值。但是修饰符const的出现使得可以声明如下的标识符,它可以取得地址,但是没办法对其进行赋值:const int& i = 10;右值表示无法获取地址的对象,有常量值、函数返回值、Lambda表达式等。无法获取地址,但不...转载 2019-03-17 18:34:09 · 143 阅读 · 0 评论 -
ostringstream的用法
使用stringstream对象简化类型转换C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类型安全和可扩展性。在本文中,我将展示怎样使用这些库来实现安全和自动的类型转换。为什么要学习如果你已习惯了<stdio.h>风格的转换,也许你首先会问:为什么要花额外的精力来学习基于<sstream&g...转载 2019-01-14 17:54:26 · 1940 阅读 · 0 评论 -
uint8_t / uint16_t / uint32_t /uint64_t数据类型详解
uint8_t / uint16_t / uint32_t /uint64_t 是什么数据类型?在nesc的代码中,你会看到很多你不认识的数据类型,比如uint8_t等。咋一看,好像是个新的数据类型,不过C语言(nesc是C的扩展)里面好像没有这种数据类型啊!怎么又是u又是_t的?很多人有这样的疑问。论坛上就有人问:以*_t结尾的类型是不是都是long型的?在baidu上查一下,才找到答案,这...原创 2019-01-14 17:55:06 · 8347 阅读 · 0 评论 -
void指针(void *的用法)
指针有两个属性:指向变量/对象的地址和长度但是指针只存储地址,长度则取决于指针的类型编译器根据指针的类型从指针指向的地址向后寻址指针类型不同则寻址范围也不同,比如:int*从指定地址向后寻找4字节作为变量的存储单元double*从指定地址向后寻找8字节作为变量的存储单元1.void指针是一种特别的指针 void *vp //说它特别是因为它没有类型 ...原创 2019-01-21 13:30:12 · 21459 阅读 · 3 评论 -
extern用法
一、 extern做变量声明l声明extern关键字的全局变量和函数可以使得它们能够跨文件被访问。我们一般把所有的全局变量和全局函数的实现都放在一个*.cpp文件里面,然后用一个同名的*.h文件包含所有的函数和变量的声明。如:/*Demo.h*/#pragma onceextern inta;extern intb;intadd(inta,intb);/*Demo.cpp...原创 2019-01-31 15:01:02 · 390 阅读 · 0 评论