![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
c++
文章平均质量分 58
Mister Zhu
云在青天水在瓶
展开
-
【gdb】24.gdb调试和coredump
gdb调试和coredump### 参考网址:https://baijiahao.baidu.com/s?id=1599347824327158577&wfr=spider&for=pchttps://www.jianshu.com/p/e38a3f1cf7f7https://www.pianshen.com/article/2260634841/ulimit -c unlimited #可以产生core且不受大小限制sysctl -w kernel.core_patte原创 2021-04-26 09:27:51 · 295 阅读 · 0 评论 -
【多线程/C++】阻塞队列的C++多线程 实现 BlockingQueue
阻塞队列实现:当队列为空时,从队列获取元素的操作将会被阻塞,直到队列中被放入了元素;当队列满时,有两种方案:方案1: 往队列里存放元素的操作也会被阻塞,直到有元素被从队列中取出或者删除。具体方法:定义一个条件变量std::condition_variable not_full_;在存放操作时,判断队列为满时,使用not_full_.wait(lock)阻塞线程;当进行删除队列元素的操作后,就使用not_full_.notify_all()来唤醒not_full_.wait(lock)原创 2021-06-23 15:34:36 · 2633 阅读 · 1 评论 -
【C++】50.编程中切换状态的【有限状态机】
对于有限状态机的知识,这里推荐浅墨毛星云大佬的博客【游戏设计模式】之三 状态模式、有限状态机 & Unity版本实现,博客里做了具体的代码讲解。以下是我看了该博客之后的一点心得:对于有很多状态切换的功能,我们可能会不假思索的使用if-else直接把所有可能的情况都列举出来,这样会产生一大堆代码,并且因为漏掉某个细节,然后又修补bug,添加代码,进而就会破坏代码结构。这种方式明显不可取。虽然if-else和switch-case有时候可以通用,但是某些时候,输入不是表达式或者是没有定义成枚举原创 2021-12-16 20:30:00 · 983 阅读 · 0 评论 -
【C++】50.浮点数的std::fixed、std::setprecision()、std::setw()用法
#include <iostream>#include <string>#include <vector>#include "opencv2/highgui/highgui.hpp"#include "opencv2/opencv.hpp"// g++ test.cpp `pkg-config opencv --libs --cflags` -std=c++11 -pthread -o testint main() { float a = 42949原创 2021-12-06 20:05:23 · 7672 阅读 · 0 评论 -
【C++】49.float的精度问题
对于float的精度问题,这篇博客【float的精度和取值范围】讲的很清晰。转载 2021-12-16 18:45:00 · 426 阅读 · 0 评论 -
【c++】48.g++编译opencv、多线程
g++ test.cpp -std=c++11 -o test `pkg-config opencv --cflags --libs`原创 2021-11-25 19:24:20 · 1292 阅读 · 0 评论 -
【c++】47.释放vector容器内存std::vector<int>().swap(vct),clear()函数并不能释放内存数据
#include <vector>#include <iostream>int main(void) { std::vector<int> vct; vct.push_back(99); vct.push_back(88); vct.push_back(77); vct.clear(); std::cout << "vct[0]=" << vct[0] << std::endl; return原创 2021-11-18 18:36:08 · 1256 阅读 · 0 评论 -
【C++】46.宏定义##连接符和符#的使用
推荐下面两篇博客:1、C/C++语言宏定义##连接符和符#的使用2、c++/c中的##连接符的使用在c/c++语言中,我们可以使用##来对一些字符进行连接,方便使用,尤其是在宏定义中使用该符号,可以省下很多工夫,详细的例子如下所示:#define GetSVN_Version(Type) GetSVN##Type##Versionvoid GetSVNClientVersion(int iValue)void GetSVNPoolVersion(int iValue)void转载 2021-11-18 18:35:56 · 286 阅读 · 0 评论 -
【C++】45.尽量不要在构造函数中调用函数或开启线程
我们有时候会有些不规范的编程习惯,如,在构造函数中开启detach分离线程,或者在构造函数中写一个初始化函数,在这个初始化函数中开启detach分离线程。这样做会有意想不到的程序崩溃问题,而且还不好排查。因为你所有的语法和逻辑都没有任何问题。这种问题一般都是你的线程中调用了其他对象,但是那个对象却可能还没有初始化,没有初始化你就调用别人,肯定是会报错的。我见到的是一个多继承的例子。// Test继承A和Bclass Test :A: B{// Test的构造函数初始化,a(args)和b(args原创 2021-10-14 21:26:35 · 1113 阅读 · 0 评论 -
【C++】44.使用xx.so动态链接库
如果有某些功能代码被编译成了动态链接库文件(在linux下是xx.so的形式),那么该文件需要和调用该动态库的二进制执行文件放在同级目录下,否则会报错找不到相关文件。但是当有大量动态链接库时,都和调用他们的二进行文件放在一级目录下,会使得目录结构不简洁。可以使用以下方案:将生成的动态链接库文件都放到某个lib目录下,例如,放在二进制文件(假如是bin_exe)的同级目录下的lib目录中,可以这样做:在终端中的二进制同级目录下输入下面这两行:path=$PWD/libexport LD_LIBRA原创 2021-09-29 19:06:18 · 806 阅读 · 0 评论 -
【C++】43.使用【类对象】与 【类指针】的区别
在我们平时写代码或阅读代码时,经常会看到,某个类A中需要使用另一个类B的方法。那么下面会看到两种用法:一种是直接定义一个B类对象。一种是在类A中定义一个B类指针;如// BlockingQueue<std::shared_ptr<cv::Mat>>std::shared_ptr<BlockingQueue<std::shared_ptr<cv::Mat>>> camera_image_queue_ptr_;camera_转载 2021-09-28 19:39:41 · 239 阅读 · 0 评论 -
【C++】42.使用YAML文件进行参数配置、读取与生成YAML文件
c++中如果要使用YAML,需要安装yaml-cpp库,安装完成后使用时还需要包含下面的头文件:#include "yaml-cpp/yaml.h"关于安装以及语法,可以参考下面两篇博客C++ 解析yaml文件的使用方法:https://blog.csdn.net/sunlin972913894/article/details/103038082c++ 开发中利用yaml-cpp读写yaml配置文件:https://cloud.tencent.com/developer/article/14234原创 2021-09-08 14:14:14 · 9042 阅读 · 4 评论 -
【C++】41. std::copy和assign的用法
对于std::copy的用法,可以参考 https://blog.csdn.net/a_ran/article/details/17385911,我这里直接介绍对于std::vector来说std::copy和assign的用法。std::vector和std::string有个assign()成员函数,用于拷贝、赋值操作,它们允许我们顺次地把一个std::vector或std::string 对象的部分内容拷贝到另一个std::vector或std::string 对象上。当需要把一个vector对原创 2021-09-06 10:15:17 · 4407 阅读 · 0 评论 -
【C++】40. std::array与int a[]方式创建数组的区别
C++11中std::array的使用std::array<type,size> array1;std::array<int,3> array1和 int a[]={1,2,3}有什么区别呢??现在还没时间细看,待弄清楚后再更新这篇博客原创 2021-09-01 15:19:39 · 280 阅读 · 0 评论 -
【C++】39. std::ofstream把程序中的中的变量值存储到文件中
更详细的介绍请参考C++ ofstream和ifstream详细用法在c++代码中,我们通常可以使用类似std::cout的方法打印变量值。如果想把这些变量值存储到文件中保存起来,可以使用std::ofstream的方法,如下:ofstream是从内存到硬盘,ifstream是从硬盘到内存,其实所谓的流缓冲就是内存空间。std::ofstream output;// 1.打开文件。//如果该文件不存在,需要先手动创建该文件,否则不会自己创建该文件,就不会写入成功,但是不会中断程序.output.原创 2021-07-15 14:10:52 · 3076 阅读 · 0 评论 -
【C++】38.类成员变量声明为 对象与指针的区别
在我们平时写代码或阅读代码时,经常会看到,某个类A中需要使用另一个类B的方法。那么下面会看到两种用法:一种是直接定义一个B类对象。一种是在类A中定义一个B类指针;如:// 头文件std::shared_ptr<cv::Mat> img_ptr_;std::shared_ptr<BlockingQueue<std::shared_ptr<cv::Mat>>> img_queue_ptr_;// .cc文件// std::make转载 2021-07-15 11:48:04 · 1291 阅读 · 0 评论 -
【C++】37.为什么要使用Lambda表达式
为什么要使用Lambda表达式?1.可以在某个函数的函数体内直接定义,省了一步定义成员函数的操作;2.作为函数的参数,类似(可能就是)回调函数的作用。1.可以在某个函数的函数体内直接定义,省了一步定义成员函数的操作Lambda表达式就是匿名函数,他可以用在某个函数内部,使用lambda表达式定义一个匿名函数,就像是一个正常的c++语句一样,不需要额外定义一个函数,一般情况下,这个lambda表达式的函数体比较短小,不要写的太复杂。如:int func(){ auto a_lambda_fu原创 2021-07-12 17:29:26 · 2077 阅读 · 1 评论 -
【C++】35.判断一个文件是否存在、 查找字符串中的子串
1.判断一个文件是否存在,IsFileExists()bool IsFileExists(const std::string &file_name) { std::ifstream fin(file_name); if (fin) { return true; } else { std::cout << file_name << " is not exist" << std::endl; return false; }原创 2021-07-07 11:31:38 · 776 阅读 · 0 评论 -
【C++】34. gflags中的 --flagfile= 用法
如果要把代码中的变量做成可通过配置文件进行配置的,可以使用gflag来实现。如,想要通过代码运行FLAGS_apple_nums可以这样定义:DECLARE_int32(apple_nums); //定义在 .h文件---------------------------------------------------------DEFINE_int32(apple_nums, 0, "num of apple"); //定义在 .cc文件对于gflags中的--flagfile用法,不管后面原创 2021-07-01 15:51:18 · 1929 阅读 · 0 评论 -
【C++】33.二级指针 **p
参考原文: https://blog.csdn.net/liangyihuai/article/details/77094996定义一个二级指针int **p;*p是指向某个地址的指针,直接给*p赋值,可以改变该指针的值;**p是*p指向的地址中存放的值;string *poiterVar1 = NULL;string **poiterVar2 = &poiterVar1;string str = "hello";/*if (*poiterVar2 == poiterVar1)转载 2021-06-10 16:47:00 · 896 阅读 · 0 评论 -
【C++】32. Boost C++ 库系列博客搜集
Boost C++ 库第 1 章 简介第 2 章 智能指针第 3 章 函数对象第 4 章 事件处理第 5 章 字符串处理第 6 章 多线程第 7 章 异步输入输出: Asio库第 8 章 进程间通讯第 9 章 文件系统第 10 章 日期与时间第 11 章 序列化第 12 章 词法分析器第 13 章 容器第 14 章 数据结构第 15 章 错误处理第 16 章 类型转换操作符...转载 2021-06-17 09:36:34 · 104 阅读 · 0 评论 -
【C++】31. Boost::circular_buffer——循环缓冲区
一、概述 Boost.Circular_buffer维护了一块连续内存块作为缓存区,当缓存区内的数据存满时,继续存入数据就覆盖掉旧的数据。 它是一个与STL兼容的容器,类似于 std::list或std::deque,并且支持随机存取。circular_buffer 被特别设计为...转载 2021-05-31 11:55:09 · 952 阅读 · 0 评论 -
【c++】30.为什么可以通过指针或引用实现多态,而不可以通过对象呢?
目录 一、类对象的存储方式:二、无论通过对象还是指针,能使用的方法只与它们静态类型有关。三、 不同类型的指针有什么区别?四、 指针与引用来实现多态五、对象不能实现多态 引言: 在c++中司空见惯的事情就是:可以通过指针和引用可以实现多态,而对象不可以。 那为什么?让我们来解开这神秘的暗纱!转载自:https://www.cnblogs.com/yinheyi/p/10525543.html一、类对象的存储方式: 在一个类的实例中,只会存放非静态的成员变量。 如果该类中存在虚函数的话,再多加一.转载 2021-05-14 16:06:23 · 431 阅读 · 0 评论 -
【c++】29.设计模式总结
持续更新中…1.有个通用的使用多态、虚函数 的方法:1.定义一个容器,其中的元素类型是基类,在容器中存入不同子类类型的指针。2.不同子类中定义自己的接口虚函数。3.当遍历该容器时,会根据该容器中的不同类型自动调用不同子类的接口函数。2.如果增加一个需求 或者 更改一个需求很频繁时候做法是:1.先定义一个基类Base_A,在这个基类定义公共的一个接口虚函数 Func();2.再定义子类 Derived_B、Derived_C 继承于这个基类 Base_A,在子类 Derived_B、D原创 2021-05-13 10:13:42 · 105 阅读 · 0 评论 -
【c++】28.虚析构函数、纯虚函数
1.虚函数:在类的成员函数前面加virtual关键字的函数;一般把虚函数定义在public区,方便在主函数中调用如果一个类有一个虚函数,则该类就有一个虚函数列表,所有该类的对象都共享这个虚函数表;(QT调试过程中显示的是vptr)如果一个类有一个或者一个以上的虚函数,则该类有且只有一张虚函数表,每个类都只有一个虚函数表,该类的所有对象都共享这张虚函数表子类的虚函数表中子类的虚函数覆盖父类的虚函数的情况,当子类将父类的虚函数override时,就覆盖了父类的虚函数;满足override的条件:函数名转载 2021-05-11 18:10:17 · 685 阅读 · 0 评论 -
【c++】27.事件驱动、IO复用、sellect、poll、epoll三者的区别
事件驱动的理解: 1.要理解事件驱动和程序,就需要与非事件驱动的程序进行比较。实际上,现代的程序大多是事件驱动的,比如多线程的程序,肯定是事件驱动的。早期则存在许多非事件驱动的程序,这样的程序,在需要等待某个条件触发时,会不断地检查这个条件,直到条件满足,这是很浪费cpu时间的。而...转载 2021-05-08 20:01:32 · 808 阅读 · 0 评论 -
【c++】26.浅谈“事件驱动”、select、poll、epoll
浅谈“事件驱动”1.通常,我们设计一个事件处理模型的程序有两种思路:一种是通过轮询的方式;一种通过事件驱动的方式,事件驱动方式也被称为消息通知方式。下面举个简单收信的例子,来说明两种实现方式的不同:(1) 传统的邮件,邮递员把它放到你家的邮箱里。因为你不知道什么时候有邮件,所以你要经常去检查邮箱,最近到底有没有邮件。这就是所谓的轮询方式,你要时常去检查,有没有发生事件发生,当你检查到有事件发生时,你采取相应措施,处理相关事件。(2)现代的电子邮件,你不用自己去查看邮箱,如果有新邮件,电脑转载 2021-05-08 19:58:25 · 762 阅读 · 0 评论 -
【c++】25.事件驱动的详解
事件驱动和异步IO 通常,我们写服务器处理模型的程序时,有以下几种模型: (1)每收到一个请求,创建一个新的进程,来处理该请求; (2)每收到一个请求,创建一个新的线程,来处理该请求; (3)每收到一个请求,放入一个事件列表,让主进程通过非阻塞I/O方式来处理请求 上面的几种方式,各有千秋, 第(1)中方法,由于创建新的进程的开销比较大,所以,会导致服务器性能比较差,但实现比较简单。 第(2)种方式,由于要涉及到...转载 2021-05-08 10:29:37 · 1138 阅读 · 0 评论 -
【c++】24.std::function和std::bind详解
1. 可调用对象可调用对象有一下几种定义:是一个函数指针,参考 C++ 函数指针和函数类型;是一个具有operator()成员函数的类的对象;可被转换成函数指针的类对象;一个类成员函数指针;C++中可调用对象的虽然都有一个比较统一的操作形式,但是定义方法五花八门,这样就导致使用统一的方式保存可调用对象或者传递可调用对象时,会十分繁琐。C++11中提供了std::function和std::bind统一了可调用对象的各种操作。不同类型可能具有相同的调用形式,如:// 普通函数int ad转载 2021-05-08 17:56:31 · 364 阅读 · 0 评论 -
【c++】23.【函数指针】定义? 为什么不直接调用函数而要使用函数指针?
知乎问题:C++中函数指针有什么作用? 为什么不直接调用函数而要使用函数指针?猫之公爵公之猫12 人赞同了该回答我觉得这个问题。。。可以去好好看看B站上有个讲设计模式的视频,讲的非常好。。。。简单来讲,函数指针,和虚函数有着一样的用处(其实他们本质上也是一样的),都是为了一个作用:延时绑定(晚绑定)。这也是一个语言中,框架和库的区别。。。以前的C程序想用别人的东西,大部分都是库,是一堆代码的集合,所以你要用库,就是调用它的功能,然后返回。。。框架的出现改变了这种情况,比如MFC框架(或者windows s转载 2021-05-08 17:01:48 · 1357 阅读 · 0 评论 -
【c++】22. STL容器的底层实现详解
文章目录 顺序容器vector(向量容器)deque(双端队列)list 关联容器set(集合)multisetmap(key,value)multimap 顺序容器 vector(向量容器) 特点内存可2倍增长的动态数组数据结构:线性连续空间维护三个...转载 2021-04-26 09:23:42 · 589 阅读 · 0 评论 -
【C++】21.函数传参 传指针和传引用的区别
指针传参向函数传指针参数时,注意区分指针的指向(地址) 与 指针指向的地址中存放的值的区别:改变形参指针的指向,实参指针指向不会变,实参指向的地址存放的值也不会变;改变形参指针指向的地址中存放的值,实参指针指向的地址中的值也会改变。例1:改变形参指针的指向例如,有个指针ptr1指向变量a。把ptr1传给函数的一个形参指针ptr2(这也是值传递,它所传递的是一个地址值)。如果在函数中将形参指针ptr2指向了另外一个变量b的地址,那也只是形参指针ptr2的指向变了,不影响实参ptr1。void原创 2021-06-25 17:43:19 · 952 阅读 · 0 评论 -
【C++】20. const char *str[]、指针的字节长度等 分析
在64位操作系统中,所有类型的指针都是8字节。在32位操作系统中,所有类型的指针都是4字节。对于const char *str[]={"aa","bbb" ,"1234567890"};,它的每个元素都是一个char*指针,所以它的每个元素占8字节。即:sizeof(str[0])==8;sizeof(str)/sizeof(str[0])==3;字符型char占1个字节整型int占4个字节长整型long int占8个字节sizeof(char)==1sizeof(int)==4siz原创 2021-07-01 10:40:15 · 3046 阅读 · 0 评论 -
【C++】19. 深入 char * ,char ** ,char a[ ] ,char *a[] 内核
原文链接:https://blog.csdn.net/daiyutage/article/details/8604720转载 2021-06-15 17:47:18 · 114 阅读 · 0 评论 -
【C++】18.char[] 与 string 的区别 与 互相转化、c_str() 函数用法
char*与string的本质区别是:string是一个容器,c++中封装了一个string类,功能极其强大,而char*则是一个指针,指向一个数组的首地址。1. char*向string转换char*向string转换支持隐式类型转换,即:char* c[ ] = {1,2,3};std::string str1 = c ;2. string转char*而string转char*一般需要用到一个c_str()函数;std::string str2("456");char* ch转载 2021-06-15 11:57:38 · 572 阅读 · 0 评论 -
【C++】17. map []操作符、insert()、emplace()
对于 std::map容器来说,调用[]操作符会自动创建一个value为空的键值对原创 2021-05-14 17:07:37 · 5757 阅读 · 0 评论 -
【c++】16.回调函数、注册回调函数
回调函数机制 使用了 函数指针。1.定义一个函数指针,如typedef void (*func_ptr)(std::string str);2.定义一个 回调函数 void func(std::string str),需要注意的是,回调函数必须和前面定义的函数指针参数类型和参数个数一致3.定义一个注册回调函数 void SetCallback(func_ptr ptr);, 其中 func_ptr 是一个函数指针类型,之后会把一个回调函数地址(函数名func)赋值给 ptr;func_ptr m_p原创 2021-05-08 17:57:41 · 6056 阅读 · 5 评论 -
【c++】15.订阅消息后转化为proto消息,再序列化,最后通过tcp发送出去
上位机服务端订阅autosar的AP消息,然后将AP消息通过proto的set_xxx(value)等函数赋值给proto消息编译后的结构体类型,例如:下面的proto_msg 是由xx.proto编译后得到的结构体类型,就是我们要赋值的proto结构。其中add_xx()函数,xx是proto_msg结构中的repeated类型,要向proto结构中增加一个xx,就使用add_xx()。给proto_msg在的id进行赋值就使用set_id(value);auto *perception_obst原创 2021-04-28 16:24:58 · 348 阅读 · 0 评论 -
【c++】14.编译proto和proto相关用法
编译proto和proto相关用法1.编译proto的问题重装protoc可参考 https://blog.csdn.net/u013498583/article/details/74231058查看当前protoc版本: protoc --version查看protoc安装位置:which protoc查找protoc相关文件:sudo find / -name protoc编译proto文件protoc caffe.proto --cpp_out=./ 生成caffe.pb.h、caffe原创 2021-04-20 13:58:23 · 5299 阅读 · 1 评论 -
【c++】13.必须用指针取值的情况.md
有时候我们会弄不清什么时候用指针,什么时候不用指针。我习惯性是不用指针的,因为我自己用不好指针,可能出现某些bug。但是一个合格的程序员,即使不用指针,也应该掌握使用指针的各种用法。碰到下面这种情况的时候,必须使用指针。uint8_t obu_buffer_[kBufferSize] = {0};int length = data_stream_->read(obu_buffer_, kBufferSize, 0);// 路端传给车端的数据:头 + obuMsg长度 + ObuMsg + 校验原创 2021-04-28 11:45:25 · 293 阅读 · 1 评论