C/C++
文章平均质量分 74
一杯盐水
这个作者很懒,什么都没留下…
展开
-
C++面试题(二)
文章目录1. C语言中的static有什么作用?2. C++ const 有什么用?3. C与C++各自如何定义常量?有什么?4. 既然C++中有更好的const为什么还要使用宏?5. C++中引用和指针的区别?6. new/delete与malloc()/free()的区别?7. #include < a.h >与#include "a.h"有什么区别?8. 在C++程序中调用C编译器编译后的函数,为什么要加extern “C”?9. 什么是动态特性?10. 什么是封装?C++中是如何实现的?原创 2021-12-07 14:42:52 · 714 阅读 · 0 评论 -
C++面试题(一)
文章目录1. C和C++的特点和区别2. C++多态3. 虚函数实现4. C和C++内存分配问题5. 协程6. CGI的了解7. 进程间通信方式和线程间通信方式8. TCP握手和释放9. http和https的区别10. 虚拟内存的概念与介绍11. 单链表的反转算法12. 红黑树以及其查找复杂度13. KMP字符串匹配14. TCP超时等待、重传以及流量控制1. C和C++的特点和区别C语言的特点: 1.作为一种面向过程的结构化语言,易于调试和维护; 2.表现能力和处理能力极强,可以直接访问内存的物原创 2021-12-03 18:41:37 · 441 阅读 · 0 评论 -
C++之PIMPL
做过C++开发一段时间的都会比较清楚动态库和静态库;在这里就不对静态库和动态库做说明了,因为这不是重点(相信做C++开发的你,对这两种库类型也有自己的见解)。重点是,对库接口的封装上面;若我们封装的不好,发现对接口文件进行修改后,发现编译时比较慢;如果库和可执行程序不是一起进行编译的,还要手动进行库和头文件的更换,让人很难受。所以就引出了今天的PIMPL,多余的话不多说了,直接上干货吧!PIMPL什么是PIMPLPIMPL的优点参考代码什么是PIMPL PIMPL(Pointer to Implem原创 2021-12-03 16:06:46 · 280 阅读 · 0 评论 -
C++ 用__attribute__((deprecated(message)))管理废弃API
__attribute__((deprecated(message)))可用于管理废弃API函数或者变量,同时保留其兼容性#include <iostream>#define MY_DEPR(message) __attribute__((deprecated(message)))MY_DEPR("Please use test_fun2() instead.")int test_fun(){ return 0;}int test_fun_2(){ retu原创 2021-11-23 14:03:40 · 1082 阅读 · 0 评论 -
C++随机数生成
文章目录一、伪随机数生成1. rand()2. srand()3. 测试代码二、C++11随机数生成1. 随机数生成算法2. 随机数分布类型3. random_device一、伪随机数生成1. rand() rand()会返回一个随机数值,范围是在0至RAND_MAX间。RAND_MAX定义在stdlib.h头文件中,其值为2147483647。2. srand() srand()可以用来设置rand()产生随机数时的随机数种子。通过设置不同的种子,可以获取不同的随机数序列。例如,可以利用sran原创 2021-11-22 17:22:42 · 27893 阅读 · 0 评论 -
Kd tree原理详解
目录一、kd-tree简介二、kd-tree的实现过程1. kd-tree的创建2. 最近邻搜索三、kd-tree代码实现一、kd-tree简介 kd-tree(全称为k-dimensional tree),它是一种分割k维数据空间的点,并进行存储的数据结构;在计算机科学里,kd-tree是在k维欧几里德空间组织点的数据结构。Kd-tree是二进制空间分割数的特殊情况,常应用于多为空间关键数据的搜索,例如范围搜索和最近邻搜索。 kd-tree的每个节点都是k维点的二叉树。所有的非叶子节点可以看做为将一原创 2021-11-19 16:27:12 · 7600 阅读 · 1 评论 -
__func__,__FUNCTION__,__PRETTY_FUNCTION__的区别
在C语言中,常用获取函数名成的方法都有__func__、__FUNCTION__、__PRETTY_FUNCTION__。那么它们的区别是什么呢? 1) __func__、__FUNCTION__: 主要是获取函数的名称。 2) __PRETTY_FUNCTION__: 不仅能获取函数的名称,同样也能获取函数传递的参数。#include <iostream>using namespace std;int test_fun(int a, int b){ cout <原创 2021-11-17 10:43:40 · 2623 阅读 · 0 评论 -
Linux __attribute__((aligned(n)))和#pragma pack
目录字节对齐1. 什么是字节对齐2. 字节对齐作用C语言中字节对齐1. __attribute__关键字2. pragma pack代码案例__attribute__扩展1. 函数属性2. 变量属性3. 类型属性字节对齐1. 什么是字节对齐 在C语言中,数据结构是一种复合的数据类型,其构成元素既可以是基本的数据类型(例如,int、long、char、bool等)的变量,也可以是复合数据类型(例如,数组、链表、数据结构等)的数据单元。在数据结构中,编译器为其每个成员按照正常边界进行空间分配。各个成员按原创 2021-11-16 14:34:45 · 1443 阅读 · 0 评论 -
KMP算法详解之C++
文章目录简介KMP算法实现创建模块串中的next字符串匹配 最近在深入的学习Linux上面的一些知识,感觉自己还欠缺很多,于是就开始动手学习。当我看到kmp算法的时候不知道它是干什么用的,在网上也翻阅了很多资料,有的写的还不错,有的写的很模糊;所以我也想写一篇关于KMP算法的详解(从我的角度),可能会有不好的地方,希望多多关照,敬请谅解! 简介 KMP算法是一种改进的字符串匹配算法,有D.E.Knuth、J.H.Morris和V.R.Pratt三位大神提出来的,称之为Knuth-Mo原创 2021-03-26 10:51:16 · 450 阅读 · 0 评论 -
10 大经典排序算法之C++实现
文章目录简介排序算法冒泡排序选择排序插入排序希尔排序归并排序快速排序堆排序计数排序桶排序基数排序简介排序算法是《数据结构与算法》中的最基本算法之一,这是需要熟练掌握的基本知识。排序算法可以分为内部排序和外部排序,内部排序是数据在内存中进行排序;而外部排序是因为数据量非常的大,无法一次性加载完所有的数据到内存中,在排序的过程中需要访问外存,例如磁盘。常见的内部排序算法有:冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序、堆排序、计数排序、桶排序、基数排序。各类算法的基本信息,如下表所示:原创 2021-03-23 17:22:43 · 214 阅读 · 0 评论 -
C++设计模式之外观模式(十)
Facade Pattern简介代码简介 外观模式(Facade Pattern)属于结构型模式,它隐藏了系统的复杂性,并向客户提供一个可以访问系统的接口。为子系统中的一组接口提供了一个统一的访问接口,这样使得子系统更加容易的被使用或者访问。使用场景:为了一个复杂的模块或子系统提供统一的外界访问接口;子系统相对独立,外界对子系统的访问属于黑盒操作;UML图:代码#include <iostream>#include <memory>class SubSy原创 2020-11-19 18:10:59 · 92 阅读 · 0 评论 -
C++设计模式之组合模式(九)
composite pattern简介代码简介 组合模式(Composite Pattern)是将多个对象组合形成树形结构,来表示具有“整体-部分”关系的层次结构。组合模式对单个对象(即:叶子构件)和组合对象(即:容器构件)的使用具有一致性,组合模式又被称为“整体-部分”(Part-Whole)模式,属于结构型模式。Component: 定义一个接口。Leaf: 为叶子构件,不包含组件构件。Composite: 为组合构件,包含子组件构件。代码// composite_pattern.原创 2020-10-22 15:23:45 · 112 阅读 · 0 评论 -
C++设计模式之装饰者模式(八)
decorator pattern简介代码简介 装饰者模式(decorator pattern)是在不改变原来类的成员变量和成员函数,以及其使用的继承关系的情况下,动态的扩展一个对象的功能。也是通过构建个一个包装类,来装饰指定的类,从而实现新的功能。Component: 定义一个抽象接口。ConcreteComponent: 定义一个具体的接口,继承于Component抽象接口。Decorator: 拥有一个抽象接口(Component)对象的实例,并实现一个和抽象接口一致的接口。Conc原创 2020-10-22 14:54:44 · 113 阅读 · 0 评论 -
C++设计模式之桥接模式(七)
bridge pattern简介代码简介 桥接模式(bridge pattern)是一种结构型模式;它是将抽象部分和实现部分进行分离,使它们都可以独立变化,互不干扰。常用于一个对象有多个变化因素,以及多个对象有共同的变化因素时,可以考虑桥接模式。Abstract: 用于定义抽象类的借口,并维护一个指向ImplementAbstract类实现的指针。RefineAbstractA/B: 扩充Abstract抽象类;在RefineAbstractA/B中可以调用在ImplementAbstract原创 2020-10-20 14:43:33 · 160 阅读 · 0 评论 -
C++设计模式之适配器模式(六)
adapter pattern简介代码简介 适配器模式(adapter pattern)是一种结构型模型,会将一种接口转换为另一种需要的接口,以便使用。适配器模式有两种,一是类模式适配器;另一种是对象模式适配器。类模式适配器:对象模式适配器: 优点: 1. 屏蔽具体实现的方法,实现了依赖倒转;2.把不方便使用的接口转换为统一接口,方便使用。代码class Target {public: Target() = default; virtual ~Target() = d原创 2020-10-20 11:42:32 · 86 阅读 · 0 评论 -
C++设计模式之原型模式(五)
prototype pattern简介代码简介 在C++中,我们清楚有浅拷贝和深拷贝两种方式去复制一个对象;浅拷贝和深拷贝的主要区别是对指针拷贝的处理:浅拷贝是共享指针;而深拷贝各个对象均有自己的内存空间,是相互独立、互不干扰的。 在类中,有一个默认的拷贝构造函数,它是浅拷贝;若想实现深拷贝,则需要重写拷贝构造函数。而原型模式(prototype pattern)是一种创建型设计模型,允许一个对象创建另一个可定制的对象,并且不需要任何处理。 优点: 1.简化对象的创建,不需要关注其对象创建过程原创 2020-10-19 15:00:20 · 137 阅读 · 0 评论 -
C++ 设计模式之建造者模式(四)
builder pattern简介代码简介 建造者模式(builder pattern),是将一个复杂对象的构建及其表示这两部分分离开来,并能通过同样构建方式构建不同的表示。 复杂对象的创建,通常是由多个子对象构建而成的;由于项目工程需求的不断变化,相应复杂对象的各部分同样也会发生变化,若重新去构建这个对象,会使得代码过于臃肿,不利于维护扩展。虽然,需求是变化的;但是,构建过程是不会发生变化。建造者模式,就是提供一种封闭机制,将变化和不变化的部分进行隔离开来(即创建对象是变化的,表示是不变化的)。原创 2020-10-19 12:12:01 · 98 阅读 · 0 评论 -
C++设计模式之工厂模式(三)
目录简单工厂模式简介说明code工厂方法模式简介说明code抽象工厂模式简介说明code 工厂模式属于创建型模式,可分为三类,简单工厂模式、工厂方法模式、抽象工厂模式;这三类模式是由易到难,由简到繁的。下面简单阐述一下这三种工厂模式简单工厂模式简介说明 简单工厂模式是工厂模式中最简单的一类;它是一个工厂生产多种不同的产品;对外隐藏类产品的实现细节,只暴露需要的产品类型。客户提供需要产品的产品类型给到工厂,就会返回相应的产品。客户只需要关心产品的基类类,不需要知道获取到的是哪一个子类。 使用场原创 2020-10-16 14:13:06 · 260 阅读 · 1 评论 -
C++设计模式之单例模式(二)
单例模式Singleton Pattern简介单例模式实现的方式1.饿汉式2.懒汉式3.线程安全方式4.泛编方式使用场合简介 单例模式(Singleton Pattern,又称单件模式),是一种使用非常广泛的设计模式。其目的是为了保证一个类之某程序中有且只有一个实例,并且提供了一个全局访问的接口,即该实例是被程序共享的。 单例模式的类图:#mermaid-svg-HSHPKp0ewT84cqc6 .label{font-family:'trebuchet ms', verdana, arial;原创 2020-10-11 21:00:12 · 112 阅读 · 0 评论 -
C++ 设计模式(一)
设计模式简介什么是GoF设计模式的类型创建型模式(Creative Patterns )结构型模式(Structural Patterns)行为型模型(Behavioral Patterns)简介 过去学习了所有的设计模型,但由于长时间的不使用,会逐渐的被遗忘掉;因此,最近又重新开始学习编程的设计模式;而我本身是从事C++相关的开发,网上关于C++的例子相对较少(大部分为java),故用C++代码实现了这些设计模式。 设计模式主要是针对面向对象语言提出的一种设计思想,主要是用于提高代码的可复用性,原创 2020-09-30 16:56:42 · 417 阅读 · 0 评论 -
C++11与线程相关的新特性
C++11 与线程相关的新特性std::threadstd::mutexstd::lock相关std::atomicstd::call_oncestd::condition_variablestd::futurestd::asyncstd::thread 在C++11之前我们会用pthread_xxx来创建线程,相对来说是比较繁琐且不易读的。因此C++11引入了std::thread来创建线程,支持对线程join或者detach的操作,代码如下:#include <thread>#原创 2020-07-13 13:51:25 · 301 阅读 · 0 评论 -
C++11 auto 和decltype的使用
auto和decltype的使用autoauto使用的限制auto 的推导规则decltypedecltype 的推导规则auto和decltype的配合使用autoC++编程时,常常需要把表达式的值赋给变量,需要在声明变量的时候清楚的知道变量是什么类型。然而做到这一点并非那么容易,有时候根本做不到。为了解决这个问题,C++11新标准就引入了auto类型说明符,用它就能让编译器替我们去分析表达式所属的类型。和原来那些只对应某种特定的类型说明符(例如 int)不同。auto 让编译器通过初始值来进行类型推原创 2020-05-30 23:30:55 · 1431 阅读 · 0 评论 -
C: getopt函数
getopt函数1、getopt函数说明2、代码实例1、getopt函数说明#include<unistd.h>extern char *optarg;extern int optind, opterr, optopt;int getopt(int argc, char * const argv[], const char *optstring)/* * * @作用:是一...原创 2020-04-27 18:59:27 · 340 阅读 · 0 评论 -
图像常用的插值算法:最近邻插值、双线性插值和双三次插值算法
图像常用的插值算法最近邻插值算法双线性插值算法双三次插值(bicubic)算法三种插值算法的优缺点插值算法是图像缩放中的一项基本且重要的算法;在图像缩放中,输出图像像素点坐标可能对应输入图像上几个像素点之间的位置,这个时候就需要通过灰度插值处理来计算出该输出点的灰度值。图像插值是图像超分辨率的重要环节,不同的插值算法有不同的进度,插值算法的好坏也直接影像着图像的失真程度。常用的插值算法有以下三种...原创 2020-04-26 18:11:24 · 10346 阅读 · 0 评论 -
C++ memcpy勿对类进行拷贝
最近接手了前辈的有一套C++代码,先说明前辈之前是搞C的。在接手后,由于客户的需求变更,所以在对某些代码进行了调整;可是出现了异常显现。每次运算的都是正常的,但是在程序运行结束后,就会出现double free corruption;从表象上分析,是对某一块内存进行了两次释放,导致的;通过Debug调试,是在释放某一个对象中的成员变量时出现的;后来通过查看代码,发现对类变量的赋值用的是memc...原创 2020-03-24 15:19:15 · 1584 阅读 · 0 评论 -
C++虚函数和纯虚函数
目录虚函数什么是虚函数代码事例虚函数的初始化过程虚函数的内存分布纯虚函数什么是纯虚函数代码事例总结虚函数什么是虚函数虚函数是在基类中声明一个带有virtual关键字的的成员函数;且该函数在其派生类中可以被重新定义的。在C++中,虚函数主要用于多态机制的实现,关于多态,就是可以用基类的指针指向派生类的实例,然后通过基类的指针条用派生类的成员函数。用法格式:virtual function_...原创 2020-03-18 11:49:35 · 179 阅读 · 0 评论 -
std::vector扩容解析
目录STL中的vector扩容原理代码事例STL中的vector扩容原理新增元素:vector通过一个连续的数组存放元素,如该数组已经存满,需要重新分配一块内存,将原来的数据拷贝到新的内存中,释放之前的内存,然后再插入新的元素;vector的对象被构建的时候,它的capacity是0,当push_back或insert第一个元素后,其capacity变为1;在对vector进行删除元素时...原创 2020-03-16 11:10:23 · 820 阅读 · 0 评论 -
C++ 获取linux系统指令的输出结果
在arm上嵌入式开发的时候遇到了一个这样的问题,实现的功能是正确的,但是在运行过程中,同一个算子在计算的时候会随机出现计算错误的现象;为了快速的还原错误环境,就需要将计算的结果和正确的结果对比;由于数据量比较大,所以采用的是保存到文件中,利用md5sum去对比。但是在运行C++程序的时候,需要获取Linux系统指令运行的结果,故写下了这边博客。需要用到C中的popen、pclose、fgets三...原创 2020-03-13 12:26:30 · 2311 阅读 · 1 评论 -
C++中的RTTI
RTTI 是“Runtime Type Information”的缩写,意思是:运行时类型信息。它提供了运行时确定对象类型的方法。本文将简略介绍 RTTI 的一些背景知识、描述 RTTI 的概念,并通过具体例子和代码介绍什么时候使用以及如何使用 RTTI;本文还将详细描述两个重要的 RTTI 运算符的使用方法,它们是 typeid 和 dynamic_cast。 其实,RTTI 在C++中并不是转载 2017-06-26 17:14:42 · 697 阅读 · 0 评论 -
C++中四种强制转换符
C++中四种强制转换符分别为:const_cast, static_cast, dynamic_cast, reinterpret_cast;在C++中这是一个很常见的话题,特别是对于新人。然后就…… 一般来说,在类型转换中会出现以下几种情况: - int 转换 float:常出现在数学计算中,比如:提高计算的精度等; - int 转换 enum:枚举常用于表意,而实际参与计算原创 2017-06-26 19:43:54 · 791 阅读 · 0 评论