自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

凡辰道

身在紫陌红尘,心慕炽日星辰

  • 博客(40)
  • 收藏
  • 关注

原创 C++ 位拷贝

分享一个C++的按位拷贝的代码。

2023-10-26 20:00:49 315

原创 cmake报错:Unsupported protocol

解决cmake报错:Unsupported protocol

2023-01-05 00:17:25 1120

原创 C++ 毫秒转日期 以及 日期转时间的类

目录简述类定义毫秒数转日期以任意年为基准的毫秒数转日期日期转毫秒数日期转以任意年为基准的毫秒数检测是否是闰年检测日期有效性打印日期简述由于C标准库<ctime>(或者<time.h>)中,只支持1970年之后的日期。因此我自制了一个可以将日期转化为从公元1年1月1日0点0分0秒开始所经历的毫秒数,或者反过来将毫秒数转化为对应日期。如有错漏,还望指摘。类定义class time_struct {public: time_struct() = default;

2020-09-10 20:13:30 3006 1

原创 自定义for循环

首先,这里说的for循环,是指C++中新增的for(a : b)格式的for循环。最近碰到了这样的问题,就来记录一下。如有错漏,还望指摘。C++新增的这种for循环,使用来遍历容器中的每一个元素。但是有时候,我想自定义自己的容器,那能不能也使用这样的for循环呢?答案肯定是可以的。那么需要什么要求呢?for循环的大致逻辑要向弄明白有什么需求,我们首先需要弄明白,这个for循环是怎么实现的。比如对于for(ele : list), 其实大致相当于如下代码:for(auto it = list.b

2020-06-03 14:54:24 1301

原创 C++ shared_ptr的实现

template<class T>class MySharedPtr{private: T* ptr = nullptr; std::atomic_uint* num = nullptr;public: constexpr MySharedPtr() noexcept {} constexpr MySharedPtr(std::nullptr_t) noexcept {} MySharedPtr(T* p) : ptr(p) {

2020-05-25 21:07:50 3299 6

原创 设计模式(C++)——单例模式

单例模式这是我平时用的比较多的模式。所谓单例模式,就是说我希望全局只有一个实例。比如说日志模块,整个系统我只希望有一个日志模块,每个模块在打印日志的时候我希望他们用到的都是同一个实例,而不是各自为政,打印到了不同的日志中。此时就需要用到单例模式。单例模式在实现时,有懒汉模式与饿汉模式两种方式。其中懒汉模式又分线程安全与不安全两种。1. 懒汉模式,线程不安全懒汉模式,就是指你不调用接口,那我就永远不真正生成实例,只有到真正用的时候才会真正地生成实例。class SingletonClass {pr

2020-05-15 16:43:08 1067

原创 C++小技巧——将类型typedef成数组

今天学习到一个新的C++小技巧:将一个类型定义成数组。大概像这样:typedef struct _s{ int a = 0;}s[1];这样在定义s的时候可以分配在栈上,但是又因为是数组,在传递的时候是传递指针,而不用额外再定义指针。使用的时候是这样:void func(s input){ input->a++;}int main(){ s tmp; func(tmp); cout << tmp->a <<

2020-05-13 15:37:34 762

原创 设计模式(C++)——抽象工厂模式

抽象工厂模式抽象工厂是负责多个配套类的统一创建,某些类我希望他们配套使用,比如说衣服,当我指定了要穿西装,如果我要穿衣服(?),那么我希望创建的是西装上衣而不是大背心儿。// Coat.h//衣服抽象类#pragma onceclass Coat{public: virtual void wear() = 0;}//Pants.h//裤子抽象类#pragma onceclass Pant{public: virtual void wear() = 0;}/

2020-05-13 11:48:19 239

原创 设计模式(C++)——工厂模式

工厂模式工厂模式提供了一种创建对象的方式。它将创建的过程隐藏了起来,调用者只负责获取,不关心创建的细节。// Shape.h// 抽象类class BaseShape{public: BaseShape(int x, int y) : x_(x), y_(y); void draw() = 0;private: int x_, y_;}//ShapeImpl.h#include "Shape.h"#include <iostream>clas

2020-05-13 10:12:20 255

原创 设计模式——C++版

开一个新坑……边学习边总结。如有错漏,还望指摘。什么是设计模式?设计模式,可以说是个老生常谈的话题了,面试必问,考试必考,敲黑板,送分题。那么什么是设计模式呢?百度一下:软件设计模式(Design pattern),又称设计模式,是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。简单说就是:前辈们在解决无数问题后总结出来的“三板斧”。这些设计模式可以解决绝大部分问题的同时,还可以保证代码的可读性、可靠性、重用性、易扩展性、可维护性等等。反正学就完事了嗷。起源为了尊重一下前辈,这

2020-05-13 09:08:40 310

原创 字符串处理——判断是否是数字或字母

最近写的代码涉及到字符串的判断,主要是判断一个字符是否是十进制数字、十六进制数字、大写字母、小写字母。学到了一些新知识。最开始我采用最简单暴力的方法:char ch;if(ch >= '0' && ch <= '9') //十进制数字if(ch >= '0' && ch <= '9' || (ch >= 'A' &&a...

2020-04-23 11:02:44 2864

原创 虚函数的默认值

这两天写的代码涉及到虚函数的默认值,来记个笔记主要是以下case:class Base{public: virtual void print_msg(const char* msg = "Base") { std::cout << msg << std::endl; return; }};class De...

2020-04-23 09:31:05 487

原创 一个输入密码用的隐藏输入小程序

#include <iostream>#include <string>using namespace std;// 输入密码函数void process_password(std::string& password);// 测试函数int main(){ string pw; process_password(pw); co...

2019-12-18 11:46:02 200 1

原创 socket编程——阻塞、非阻塞、同步、异步

我这里主要是参考了这篇文章。一开始我很疑惑,同步异步和阻塞非阻塞有什么区别么?看了这篇文章感觉有所悟,所以来总结一下。阻塞与非阻塞阻塞所谓阻塞,是指将一个IO操作交给底层之后,底层不执行完毕不返回。也就是程序运行到这里就卡住了,直到底层运行完毕才能继续。比如说一次接收,对于阻塞的recv,如果对面还没有发任何数据,也就是底层没有接收到任何数据,那么程序就会一直卡在这里,直到对面有数据...

2019-11-29 10:35:18 272

原创 C++ 计时

我这里主要说的计时器。因为我有时候要测试一下模块性能,所以需要计时。C++中计时主要有两种。clock_t当对于精度要求不高时,使用clock_t。这种方法是毫秒级。使用方法:#include <time.h>int main(){ clock_t start = clock(); Sleep(1000); clock_t end = clock(); in...

2019-11-27 12:17:37 321

原创 Windows下的Socket编程——基本步骤

基本流程:客户端:初始化调用socket分配套接字设置套接口模式填充SOCKADDR_IN来说明服务器地址调用connect连接服务器和服务器通信(调用send发送数据,或调用recv接收数据)。调用closesocket关闭套接字结束服务服务器端:初始化调用socket分配套接字设置套接口模式填充SOCKADDR_IN来说明服务器地址调用bind绑定端...

2019-11-22 16:11:04 2135

原创 C++宏定义中#和##的用法

前段时间很到了宏定义中的新知识:#与##,感觉打开了新天地的大门。首先来介绍一下这两种功能:##的用法是负责将其后面的东西转化为字符串,比如:#define TO_STRING(str) #strint main(){ cout << TO_STRING(this is a string) << endl; return 0;}这段代码中,TO_S...

2019-11-19 16:51:19 4330 1

原创 Bison之destructor

前两天看到了这个用法。感觉这个关键词感觉还是挺误导人的。因为我一开始以为,在每次销毁token的时候都会调用这个destructor。因为我的token有的会带有指针类型的值,但却并不是所有匹配规则都会用到这个指针指向的值。所以我以为只要设置了destructor,在每次匹配成功一个规则的时候,就不用手动去释放没有用到的token了。结果并!没!有!原来,这个destructor,只有在发生...

2019-11-01 10:43:10 511

原创 yyless与yymore

这两个函数可以轻松地帮我们将词法分析器改为LALR(n)的词法分析器。yymore()yymore函数是指,将下次分析的结果词汇,接在当前yytext的后面,而不是替换已有内容。(当前已有内容并不会影响下次分析)比如如下代码:%x xdquote\" { BEGIN(xdquote); }<xdquote>[^"]+ { yymore(); }<xdquote&...

2019-10-29 18:10:12 2002 1

原创 线程安全与可重入

今天看到一个新词汇:可重入。来总结一下。可重入和线程安全有什么区别和联系呢?可重入可重入,就是指可以重复进入,不论是多个线程同时调用该函数,还是说函数在执行过程中遇见了中断,而中断处理中又调用了该函数。可重入就是指在这两种情况下,函数并不会产生错误的结果。线程安全线程安全是指,当其他线程运行时,函数不会产生错误的结果,不论其他线程运行的是该函数亦或是其他函数。所以呢,线程安全和可重...

2019-10-29 17:03:02 214

原创 C 强制类型转换 char转int的小陷阱

c++中signed char转int最高位扩展问题

2019-10-29 16:30:34 8032 1

原创 Bison 操作符前可以为空导致的归约/归约冲突

今天遇见一个很奇怪的归约/归约冲突:expr: NUM | expr opt '=' expr ;opt: '+' | '-' | /* empty */ ;大概类似这样,一直在报归约/归约冲突,我就懵了,哪里冲突了???直到我仔细研读了一波output文件才弄明白:当栈里已经有expr opt '=' expr的时候,本来应该按照左...

2019-10-21 18:13:00 1287

原创 Bison(yacc)如何正常退出以及返回值

之前说过如何将Bison的输入源改为指定字符串。然而当我将输入源改为指定字符串之后,发现遇到了一个很奇怪的问题:yyparse无论如何都会调用yyerror进行报错。本来我准备在yyerror里进行内存的释放,这样一来,无论分析成功与否,内存都会被释放,导致分析的结果都没了。比如如下的bison代码:calc: expr '=' { calculate($1); } ;exp...

2019-10-18 18:38:11 2050

原创 Bison%code的使用

最近遇到一个很恼人的问题:我在Bison的YYSTYPE的定义中使用了unordered_map*,并在开头的%{ … %}段中include了unordered_map头文件。然而当我使用–defines选项生成bison头文件时,却发现:嗯?不识别unordered_map??怎么肥四?我明明引用了头文件啊!namespace也用了啊!打开生成的头文件一看:嗯??我引用的头文件呢???...

2019-10-15 17:48:33 994

原创 更改Bison-Flex的输入源

在我最开始使用Bison-flex时,出于某些原因,涉及到题目这个问题。在此来说明一下该如何操作。如有错漏,还望指摘。

2019-10-15 16:58:14 1385

原创 do{}while(0)的用法

这几天在看代码的时候遇到了一个好像很神奇的用法:do{ … }while(0)。do{ … }while(1)我能理解,就是一直循环,然后在循环体内设置跳出条件,或者干脆就不跳出。那do{ … }while(0)是干嘛的呢?在内部也改变不了循环条件,然后执行一次就结束,那不就是没循环嘛?赶紧查了一下,原来,这种用法主要是针对宏定义使用的。这里我们来看一下如下代码:#define INCR...

2019-10-15 15:46:27 736

原创 禁止拷贝、赋值和单例模式

这几天涉及到禁止类的拷贝与赋值,所以来写一下相关的东西。如有错漏,还望指摘。首先,如果未定义构造函数、拷贝函数和赋值操作符的时候,C++会为类自动生成默认版本的。如果想禁止类的拷贝、赋值,甚至构造,有两种方法。将其设为私有。这种方法很简单,就是写一个拷贝构造函数、赋值操作符,然后将其放在private限定符下。这样当外部想要拷贝或者赋值时,就会发现这个是私有的,禁止访问。使用这种方法时,...

2019-10-12 18:01:59 1806

原创 杂注__declspec

今天看到一个一个好玩的东西:__declspec。这是C++提供的一个关键词,配合一些属性可以对标准c++做一些扩充。总结一下其中我觉得有意思的。如有错漏还望指摘~__declspec的用法是:__declspec(属性1 [, 属性2, … ])。其中我学会了的有如下一些属性:deprecated这个属性可以修饰变量、函数、结构体、命名空间等等,用来标明这个名称或者实体,由于效率、...

2019-09-05 18:25:26 831 2

原创 new、delete和malloc、free详解与混用问题

以前看到的资料都说,new和delete、new[]和delete[]、malloc和free,必须配套使用,不应该混用。然而我最近遇到一些相关的问题,因此不得不探究一下,混用了会怎么样呢?其实要想知道能不能混用,问题在于:他们有什么区别?其实很简单:malloc只负责分配内存,free只负责释放内存。new在分配内存的同时,还会调用构造函数;delete在释放内存的同时还会调用析构函...

2019-08-13 16:24:43 4453 4

原创 如何在main函数之前和之后执行代码

如何在main函数之前和之后执行代码

2019-08-09 14:37:52 1761

原创 模板特化

上一篇《模板与重载》里,我遇见了想同时使用模板函数与非模板函数的情况。后来才知道,其实并不需要,当我想对某些特定的类型进行特殊操作时,只需要使用模板特化就可以。所谓特化,就是说对于模板函数,对于某些类型可能需要特殊处理,所以进行特殊化。可以分为特化与偏特化,其实就是将模板列表中的模板全部特化还是部分特化。使用 template<> 来告诉编译器,这是一个特化的模板。类模板:...

2019-08-07 16:15:31 201

原创 模板与重载

今天编程遇到一个问题,使用重载会简单不少,但是如果输入类型不在预设的类型中,又会出现问题。使用模板又比较麻烦。所以突发奇想,模板和普通函数同时使用的时候会怎么样?比如如下代码:int type(int){ return 0;}template<class T>int type(T){ return 1;}本以为会报错,毕竟class T里是包含int...

2019-08-06 16:34:25 703 2

原创 cin效率

今天在刷LeetCode的时候,发现最快的代码和我的算法一模一样,但是多了两行:std::ios::sync_with_stdio(false);std::cin.tie(0);我把这两行代码加到我的代码中,发现果然快了不少。所以我就好奇,这两行代码究竟是用来干嘛的呢?查了一下才知道:首先,C++为了保证与C的兼容,所以将cin和stdin(如scanf)的流进行了同步,以保证你在代...

2019-04-16 19:20:36 321

转载 源代码到可执行代码的过程

这一部分一直很好奇,不过一直也没仔细记。这次记一下。源代码 --(预处理、编译、优化)–> 汇编代码 --(汇编)–> 目标文件 --(链接)–> 可执行文件预处理读取源程序,对其中的伪指令(以#开头的指令)和特殊符号进行处理。主要包括:宏定义,条件编译指令,头文件包含指令,特殊符号(如LINE,FILE)。通常使用以下命令来进行预处理:gcc -E hello.c ...

2019-04-06 21:22:44 932

原创 进程与线程

面试遇到的问题,进程与线程有什么区别呢?就我查到的资料而言,我的感觉是,进程与线程,就像施工队与工人。怎么讲呢?一个施工队中有好多工人,一个进程底下可以有多个线程。进程拥有资源,有堆内存,就像施工队有个大仓库。但是真正工作的,运行在CPU上的,是线程,就像实际干活的是工人。而且线程拥有的资源很少,只有一个程序计数器,一组寄存器,外加栈(而这些,正是运行程序所必备的资源)。就像工人拿个安全帽...

2019-04-06 12:53:32 74

原创 打印类

为了方便显示,总会有一种方法来使得类可以直接被print,cout等函数直接打印出来。python中是__str__()和__repr__()方法。 其中__str__() 方法是针对用户的,使用print可以直接打印。而__repr__()是针对开发者的,主要是在交互界面进行打印。java中是toString()方法。而C语言中,主要是通过友元函数重载,即对于操作符<<的重载来...

2019-04-06 12:05:42 289

原创 C++内存分配

c++运行时,内存主要包括几个部分:堆栈全局区代码区(文字常量区)堆:堆空间最大,链表形式,物理空间不连续,由低地址向上扩展。存储由程序员用new和malloc等函数分配的变量。需要手动释放,不然容易内存泄漏。每个进程有一个堆。每次申请堆内存时,从小到大遍历链表,直到找到大于等于申请空间的内存,然后取出其中等于申请空间的内存,将剩余内存返回堆中。栈:栈存储非静态局部变量,以及一...

2019-04-06 11:45:21 457

原创 内联函数与宏定义函数的异同

面试时被问到了这个问题,当时突然懵了,所以来整理一下。如有疏漏,还望指摘。内联函数与宏定义的函数很相似,都是在运行前,先将一些简短的函数,直接替换为实现代码,以此来省去函数调用时,参数入栈、程序跳转等的时间开支。宏定义的函数:使用宏定义#define定义的函数。其在预编译阶段就被进行简单的替换,因为只是简单的替换,所以无需定义参数和返回值的类型,也不会对参数进行临时拷贝以及析构。如下宏定义函...

2019-04-05 13:26:33 827

原创 构造函数中的初始化列表,以及构造函数和析构函数的调用顺序

新学到了C++里新的初始化方法,初始化列表。因此来整理一下。若有错漏,还望指摘。构造函数构造函数可分为普通构造函数和拷贝构造函数。普通构造函数构造函数就是在类实例化时,自动调用来生成类的函数。若未定义,则系统自动生成。比如:class test{};test A;在实例化A的时候就会调用普通构造函数。形式为函数名与类名相同,没有也不能声明任何类型的返回值。拷贝构造函数...

2019-04-01 18:00:50 1018

原创 重载,隐藏与虚函数

这几天学了一下继承,对于这几个概念比较一下。共同点:重载、隐藏和虚函数,说的都是重名函数,即函数名相同。不同点:重载:在相同作用域,同名函数,但传入参数不同,没有特定关键字。需要小心传入参数的二义性。根据参数不同调用不同的函数。class A{public: void test(){ cout << "test void" << endl...

2019-04-01 16:00:27 316

空空如也

空空如也

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

TA关注的人

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