
C++
文章平均质量分 69
Huoon
这个作者很懒,什么都没留下…
展开
-
C++实现毫秒级精度定时器
定时器的实现一般需要借助系统提供的超时相关接口,比如select、 条件变量、或者sleep, usleep等,sleep,usleep提供的睡眠功能太有限,无法中途唤醒,这就导致他们其实不适合做定时器中的定时方法。而select和条件变量都可以设置定时时长,而且在中途可以唤醒,精度也很高,因此,可以采用select或条件变量作为定时方法,本文讨论使用条件变量如何实现定时任务。条件变量可以设置超时时间,如果条件变量在没有接收到来自其他线程的条件通知时,将一直阻塞,直到超时。通过这个特性可以按照定时器需要等原创 2022-05-03 00:14:58 · 7175 阅读 · 1 评论 -
使用C++实现一个简单的线程池
线程池类似于内存池,连接池等,在一开始创建好一定数量的线程,当有任务需要处理时,就将该任务丢进线程池的某个线程中处理,而不是每个任务都启动一个线程。使用线程池的好处在于,不需要频繁的创建线程,因为创建线程是一个较耗资源的操作。因此,相对而言一开始创建好线程,要比动态创建线程对性能影响更小。其次,线程池可以更好的将线程管理起来,对外提供简单的接口,内部完成对线程的调度,这也是高内聚的一个思想,将复杂封装起来,对外在满足业务场景的前提下尽可能简单。线程池作为一个独立的非业务模块,任何需要处理多任务的场景都可以使原创 2022-04-14 23:59:15 · 3457 阅读 · 1 评论 -
C语言实现C++多态
C语言实现C++多态C++中多态实现是基于虚函数表实现的,每个具备多态性对象的内部都会有一个隐藏的虚函数表,虚函数表里面的函数指针指向具体的函数实现,可能是父类中的实现,或是子类重写了的方法。C语言没有天然的多态支持,但是按照C++的实现原理,也能写出多态特性的代码。下面代码就是用C实现多态。结构体Animal中有两个函数指针,eat和drink。Cat结构体通过组合的方式包含Animal对象,此时,Cat结构体也间接获得了eat和drink方法,通过Cat结构体实现原本Animal里面的方法。创建一个原创 2021-11-15 22:31:43 · 1809 阅读 · 0 评论 -
赋值运算符函数
赋值运算符函数作为类的一个成员函数,主要用于对象之间的赋值。类一般都有默认的赋值运算符函数,然而默认赋值运算符函数只会浅拷贝,无法满足需求,有时还会产生致命错误。如下:class CString{public: CString() : _buf(nullptr) { } CString(const CString& str) : _buf(nullptr) { const int size = strlen(str._buf) + 1;原创 2021-02-22 23:56:57 · 1963 阅读 · 0 评论 -
std::move的理解和使用
最初接触到std::move,以为std::move具有类似于swap的功能,可以避免内存的拷贝。后来查看资料发现,std::move的实现并没有交换内存的操作。那么std::move是如何避免内存拷贝的呢?看它的实现发现,std::move只是进行了左右值的转换,也就是类型的转换,并没有改变对象本身。这里涉及到左值和右值的概念:左值:简单理解为赋值运算符左边的变量,可以接受右边值,例如 int a = 10; a就是一个左值右值:赋值运算符右边的值,这个值可以是一个变量页可以是一个常量,例如 i原创 2021-02-21 13:53:45 · 21152 阅读 · 5 评论 -
leetcode(14)最长前缀
14. 最长公共前缀这个题目是在多个字符串中寻找最长公共前缀。解体思路有点像冒泡排序的方法,将第一个字符串当成最长前缀串,和第二个字符串判断找出最长前缀串,这个最长前缀串又和第三个字符串判断,找到新的最长前缀串,以此类推,中途如果出现比较不相等的情况,如果是第一个字符不相等,则直接返回“”;否则结束比较,当前找到的前缀即为最长前缀。class Solution {public: string longestCommonPrefix(vector<string>& strs)原创 2020-10-12 23:01:58 · 259 阅读 · 0 评论 -
leetcode(13)罗马数字转整数
13. 罗马数字转整数这道题目和上一道题目是相反的转换,上一道题目中整数转罗马数字是把整数拆分成每一位,利用罗马数字表示规则从高位到低位拼接即可。那么罗马数字转整数也是一样的道理,从高位到低位(从左到右)拆分每一位整数对应的罗马字符串,然后将每一位整数相加就可以了。例如:“XXVII”代表27,那么需要把“XXVII”拆分成20和7,从左往右“XX”对应20,VII对应7,则“XXVII”对应的整数值为20 + 7,即27。通过例子可以看出来,解题思路很简单,就是识别每一位整数对应的罗马字符串,原创 2020-10-09 22:17:09 · 155 阅读 · 0 评论 -
leetcode(12)整数转罗马数字
12. 整数转罗马数字这道题是将十进制的整数转换成罗马数字表示,由于罗马字母的限制,只能转换1到3999之间的数。根据题目描述以及示例,可以发现转换原理很简单,就是将十进制对应位上的数字转换成罗马对应的字母就可以了,对应关系如下:字符数值I1V5X10L50C100D500M1000例如转换234为罗马数字,拆解每一位的值,找到对应的字符即可,234分解为:200 “CC”30 “XXX”4原创 2020-09-29 22:40:26 · 179 阅读 · 0 评论 -
leetcode(11)盛最多水的容器
题目链接:盛最多水的容器拿到这个题目,结合示意图看了下,基本上就是一个给定一组宽,高,求最大面积的题目, 同时很容易让人想到“木桶原理”,即,最短的那块板决定木桶的容量。题目给出了一个数组,里面存放所有的高度值,宽度值可以通过计算数组索引的差得到,因此任意两个值之间面积值为:const index1,index2;// 数组索引,index2 大于 index1const int height1 = heightArray[index1];const int height2 = heightArr原创 2020-09-28 09:04:02 · 179 阅读 · 0 评论 -
Linux C/C++程序崩溃bug调试方法
C,C++程序最常见的崩溃问题就是内存问题,内存越界,访问空指针,野指针等都会造成程序崩溃。Linux系统中当程序运行过程中出现非法操作,系统会先发送对应的错误信号,每种错误信号都有默认的处理方式,比如,当我们给一个空指针赋值的时候,系统会检测到这个内存错误,然后向进程发送SIGSEGV信号,该信号默认的处理方式是退出进程,这种情况下,只能看到进程挂掉,但无法定位错误。当出现这种问题的时候一般往往很难查找原因,下面介绍两种方式定位bug。方法一:捕获系统信号Linux操作系统提供了一组接口可以修改信号对原创 2020-09-10 18:45:32 · 6203 阅读 · 0 评论 -
CMake 编译选项设置
在CMakeLists.txt中可以通过修改CMake内置的环境变量来改变C或C++的编译选项.编译选项相关的CMake 变量如下:CMAKE_C_FLAGS = CMAKE_C_FLAGS_DEBUG = -gCMAKE_C_FLAGS_MINSIZEREL = -Os -DNDEBUGCMAKE_C_FLAGS_RELEASE = -O3 -DNDEBUGCMAKE_C_FLAGS_RELWITHDEBINFO = -O2 -g -DNDEBUGCMAKE_CXX_FLAGS = CM原创 2020-09-10 18:47:05 · 27093 阅读 · 0 评论 -
Visual Studio 2019 创建CMake Linux项目
之前我有一篇文章讲的是使用Visual Studio 2017 创建Linux C++ 项目(使用VS2017调试Linux C++代码),使用IDE的好处就是方便编码和调试。工作中也一直以这种方式开发Linux平台的项目,使用了大概两年多,总体上可以满足开发需求,但是还存在一些bug,或者说令人不太满意的地方。问题1:本地文件和远程同步问题项目中如果有脚本或者配置等文本文件,由于这些文件不参...原创 2020-04-25 00:03:48 · 3184 阅读 · 0 评论 -
使用Docker+Visual Studio 2019搭建Linux C++开发环境
使用Docker+Visual Studio 2019搭建Linux C++开发环境从Visual Studio 2017开始,Visual Studio就已经支持跨平台Linux项目的开发。使用它作为开发工具可以很方便的进行开发,调试。它的跨平台开发原理是这样的,通过建立一个Linux工程,这个工程在编译时,拷贝本地代码到远程Linux环境,然后在Linux环境下编译,实际上是一个远程编译的...原创 2019-08-17 22:43:02 · 5123 阅读 · 0 评论 -
使用VS2017调试Linux C++代码
VS2017版本现已支持开发Linux项目,就是在VS上面写代码,而编译和运行是在Linux环境下。使用场景:假如,代码最终是运行在Linux系统上,而我们又不想在Linux环境下写代码,想借用VS强大的开发功能做开发,那么就可以在VS上面创建一个Linux项目。设置:项目建好之后,需要设置远程连接,指定代码最终要运行的目标平台。编译:项目编译的时候,VS会把代...原创 2017-11-12 17:26:02 · 16849 阅读 · 11 评论 -
虚析构函数
析构函数C++语言中,每一个类都有一个默认的或者我们自定义的析构函数,析构函数的作用就是当对象销毁的时候做一些资源释放,一般我们都是这样用的。然而,有时候可能由于疏忽或者对语法不熟悉,写出来的程序最终当对象销毁的时候,析构函数并没有被调用。这种情况是存在的,下面我们举一个列子:class Base{public: Base(); ~Base(); int membe原创 2017-03-19 23:35:48 · 524 阅读 · 0 评论 -
利用函数指针实现父类函数调用子类函数
父子类关系对于继承关系中的父类和子类,我们可以说子类是父类的一种,子类继承了父类的属性和行为。因此,子类可以访问父类的所有非私有成员。相反,父类一般情况下是不能访问子类成员的。然而,我们可以通过一些方法间接的实现父类访问子类,即父类函数访问子类函数。方法一利用多态机制,一个指向子类的父类指针或引用,当调用被子类重写的虚函数时,实际上调用的是子类函数,这是通过多态的方式来实现父类调用子类,该方法需要一原创 2017-03-29 01:11:11 · 17349 阅读 · 1 评论