c++
文章平均质量分 84
敢敢のwings
一位立志成为机器人攻城狮的自动驾驶从业人员,著有《从ROS1到ROS2无人机编程实战指南》一书。目前是阿里云专家博主、华为云享专家、古月居优秀创作者、古月居签约作者、CSDN博客专家。主要专注机器人运动学、定位感知算法、深度学习研究等,平时涉猎较广。希望未来可以努力学习并胜任系统架构师!
展开
-
Clion 使用
默认情况下,CLion编译使用的CMake是其内置的一个版本,而使用这个版本的CMake进行编译时会报出一些莫名其妙的错误,命令行中catkin_make明明可以正常编译,而这里就是会失败。回到一开始的"Threads & Variables"窗口,左上角有一些控制按钮,从左到右依次是:Rerun(Ctrl+F5),Stop(Ctrl+F2),Resume(F9),Pause(暂时用不上),Step Over(F8),Step Into(F9),Step Out(Shift+F8)。原创 2024-08-31 16:21:38 · 2576 阅读 · 0 评论 -
C++使用工具进阶(LOG输出、堆栈跟踪、代码结构、code review)
对于C++,无论是大学生还是算法工程师都是非常需要学习并使用的一门语言,而C++不像python、rust一样简单好用。不单单是在嵌套复杂代码后的逻辑还是各种类和堆栈的管理,都是非常头疼的问题。一般来说对于LOG类很多都是使用GLOG、而堆栈跟踪一般是基于GDB。而这里我们将开拓大家眼界,从另一个角度来说一些小而美的东西。这里整合一些网上非常好的博客,并结合自己的一些理解给大家整理一个非常通用的工具,也欢迎各位关注引用文章的博主。原创 2024-03-04 15:30:11 · 10522 阅读 · 0 评论 -
undefined symbol问题的查找、定位与解决方法
而这块可以看到fpdf_parse_encrypt是依赖于下边的fx_crypt文件的,再看静态库,fpdf_parse_encrypt被编译成fpdfapi.a,而fx_crypt被编译进pdrm.a静态库,所以应该是fpdfapi.a要依赖于pdrm.a静态库的。ldd命令,可以查看对应的可执行文件或库文件依赖哪些库,但可执行文件或库文件要求与操作系统的编译器类型相同,即电脑是X86的GCC编译器,那么无法通过ldd命令查看ARM交叉编译器编译出来的可执行文件或库文件。转载 2022-12-14 14:53:39 · 11030 阅读 · 4 评论 -
算法工程师应该熟知的C++高级用法
capture子句参数列表(optional)可变规范(optional)异常定义(optional)返回类型(optional)函数体1.2 即看即用语法:叫做捕获说明符参数列表表示返回类型,如果没有返回类型,则可以省略这部分。我们可以这样输出"hello,world"变量捕获与lambda闭包实现lambda函数能够捕获lambda函数外的具有自动存储时期的变量。函数体与这些变量的集合合起来叫闭包。 不截取任何变量 截取外部作用域中所有变量,并作为引用在函数体中使用 截取外部作原创 2022-11-21 15:21:08 · 7509 阅读 · 2 评论 -
SLAM本质剖析-Boost之Geometry函数大全(二)
将一个点添加到另一个点。原创 2022-11-22 11:06:05 · 6792 阅读 · 0 评论 -
并行编程OpenMP基础及简单示例
OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C、C++和Fortran。OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令,自动将程序并行处理,使用OpenMP降低了并行编程的难度和复杂度。当编译器不支持OpenMP时,程序会退化成普通(串行)程序。程序中已有的OpenMP指令不会影响程序的正常编译运行。OpenMP通过编译指导命令来并行化,什么是编译指导命令?转载 2022-11-04 15:24:08 · 4807 阅读 · 0 评论 -
C++之管道(Pipeline)模式
管道模式,不属于23种设计模式之一(是责任链模式的一种变体),但是在我们实际业务架构中还是有很多场景适用的。尤其是在多传感器的数据流处理中会非常方便。尤其是在大型场景中使用Pipeline将复杂的进程分解成多个子任务。Pipeline模式为管道模式,也称为流水线模式。顾名思义,管道模式就像一条管道把多个对象连接起来,整体看起来就像若干个阀门嵌套在管道中,而处理逻辑就放在阀门上,需要处理的对象进入管道后,分别经过各个阀门,每个阀门都会对进入的对象进行一些逻辑处理,经过一层层的处理后从管道尾出来,此时的对象就原创 2022-10-31 09:53:35 · 8731 阅读 · 0 评论 -
C++ 之 perf+火焰图分析与Debug
perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。利用perf剖析程序性能时,需要指定当前测试的性能时间。性能事件是指在处理器或操作系统中发生的,可能影响到程序性能的硬件事件或软件事件perf list主要是用于列出有哪些可用的event,可以供来分析。,其中可以列出 hard ware 的event, sw 是software的event, 其它类似。hw/hardware显示支持的硬件事件相关,如: perf list hardware。原创 2022-08-25 15:02:20 · 5588 阅读 · 0 评论 -
C++之模板(Template)模式
0. 简介模板模式是行为模式的最后一章,也是我们设计模式的最后一章。模板模式是C++高级用法中不可或缺的一部分,也是作为我这种SLAMer必不可少的需要大量使用的模式。在Ceres,G2o中都可以看到这样的用法。它在超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。1. 模板模式示意图我们可以看到模板模式结构是非常简单的设计模式。通过复用模板抽象类的方法能够避免大量的重复性代码。模板方法基于继承机制, 它允许你通过扩展子类中的部分内容来改变部分算法。 策略模式基于组合机制原创 2022-07-22 16:05:23 · 4921 阅读 · 0 评论 -
C++之观察者(Event-Subscriber)模式
0. 简介个人认为观察者模式作为行为模式中非常重要的一个部分,我们日常使用的事件机制就是一个观察者模式,当事件发生,所有的事件接收者执行事件响应函数。在ROS中的subscribers函数也是使用了类似的思想。它允许你定义一种订阅机制, 可在对象事件发生时通知多个 “观察” 该对象的其他对象。1. 订阅者模式示意图从ROS的Topic层面理解,拥有一些值得关注的状态的对象通常被称为目标, 由于它要将自身的状态改变通知给其他对象, 我们也将其称为发布者 (publisher)。 所有希望关注发布者状态变原创 2022-07-22 16:03:45 · 4481 阅读 · 0 评论 -
C++之状态(State)模式
0. 简介状态模式是一种行为设计模式, 让你能在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。这其实就有点类似算法中的有限状态机的形式。其主要思想是程序在任意时刻仅可处于几种有限的状态中。 在任何一个特定状态中, 程序的行为都不相同, 且可瞬间从一个状态切换到另一个状态。 不过, 根据当前状态, 程序可能会切换到另外一种状态, 也可能会保持当前状态不变。 这些数量有限且预先定义的状态切换规则被称为转移。1. 状态模式示意图策略模式和状态模式两个模式很相似,区别就在于策原创 2022-07-18 16:45:07 · 5420 阅读 · 0 评论 -
C++ function函数对象和bind绑定器以及lambda表达式
bind可用于给多元函数对象降元:底层实现原理二、模板的完全实例化和部分实例化优先级: 完全实例化 > 部分实例化三、function函数对象的实现原理一个实现了的函数对象匹配可变参数的类:四、bind通过前面的学习可以知道,绑定器bind返回的也是一个函数对象,功能比bind1st和bind2nd强大五、lambda表达式作用: 主要是为了避免使用一个函数对象的时候还去定义一个类,lambda表达式产生的对象用完就销毁语法: 捕获外部变量:不捕获外部变量:以传值的方式捕获外部的转载 2022-07-13 10:54:49 · 3692 阅读 · 0 评论 -
C++之策略(Strategy)模式
0. 简介作为行为模式的倒数第三章,策略模式在我们编写算法时是非常重要的,它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。1. 策略模式示意图我们可以清晰的从图中看出策略模式本质上的操作就是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。在我们对一个类的行为或其算法改变时,是不会增加Context的内容的。上下文(Con原创 2022-06-28 11:22:42 · 3523 阅读 · 0 评论 -
C++之中介者(Mediator)模式
0. 简介中介者模式和命令模式类似,都有着一层中间层来作为沟通的渠道,只是中介者模式使用了Mediator来实现实现更新函数changed。而在命令模式中使用Invoke作为最上层,用于管理具体类的操作,从而对接收者增删。简而言之,命令模式在发送者和请求者之间建立单向连接,使请求者可以调用发送者的不同方法。中介者清除了发送者和请求者之间的直接连接, 强制它们通过一个中介对象进行间接沟通。1. 中介者模式示意图中介者模式是一种行为设计模式, 能让你减少对象之间混乱无序的依赖关系。 该模式会限制对象之间的原创 2022-06-20 11:29:28 · 4097 阅读 · 0 评论 -
C++之迭代器(Iterator)模式
0. 简介迭代器模式是一种行为设计模式, 它可以有效管理数据流动的同时,让用户能在不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素。迭代器通常会提供一个获取集合元素的基本方法。 客户端可不断调用该方法直至它不返回任何内容, 这意味着迭代器已经遍历了所有元素。1. 迭代器模式示意图迭代器模式的使用方法和c11的迭代器使用方法类似,这是我们会根据我们的需求去建立迭代器模型。抽象容器(Collection):一般是一个接口,提供一个iterator()方法,例如Collect原创 2022-06-20 11:29:11 · 5761 阅读 · 4 评论 -
C++之命令(Command)模式
0. 简介我们在遇到类似GUI中多种Button点击功能的操作时,我们应该将请求的所有细节 (例如调用的对象、 方法名称和参数列表) 抽取出来组成命令类, 该类中仅包含一个用于触发请求的方法。命令模式就是这样一种行为设计模式, 它可将请求转换为一个包含与请求相关的所有信息的独立对象。 并能根据不同的请求将方法参数化、 延迟请求执行或将其放入队列中, 且能实现可撤销操作。1. 命令模式示意图命令模式可将特定的方法调用转化为独立对象。 这一改变也带来了许多有趣的应用: 你可以将命令作为方法的参数进行传递原创 2022-05-19 10:10:32 · 5309 阅读 · 0 评论 -
C++之责任链(Chain of Responsibility)模式
0. 简介对于责任链模式,其作为一种行为设计模式, 允许你将请求沿着处理者链进行发送。 收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。这种处理方法类似包与包之间的调用的思路,只是其可以不在主程序中累赘的去申明一堆if else变量使得程序更加臃肿。相比于创建设计模式的对整体架构进行的设计,和结构设计模式对对象的化繁为简的操作,作为行为设计模式,其需要我们对数据流能够充分的把握,来避免检查代码的混乱不堪。 而每次新增功能都会使其更加臃肿。 修改某个检查步骤有时会影响其他的检查原创 2022-05-12 13:16:00 · 4354 阅读 · 0 评论 -
C++之外观(Facade)模式
0. 简介外观模式作为我们常用结构模式的最后一节,一些不常用的比如说桥接、享元、代理等,这里等有时间在补充学习吧。下面我将会来继创建模式和结构模式后来讲行为模式。外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这些接口使得这一子系统更加容易使用. 其基本的结构体大致如下:1. 外观模式示意图Facade类(外观类):对外提供一个高层接口,将客户的请求交给适当子系统进行处理原创 2022-04-26 15:41:37 · 4223 阅读 · 0 评论 -
C++之组合(Composite)模式
0. 简介这一次我们继续来讲结构型模式中的组合设计模式。组合模式是一种结构型设计模式, 你可以使用它将对象组合成树状结构, 并且能像使用独立对象一样使用它们。在一般组合模式中中声明所有用来管理子对象的方法,其中包括Add、Remove等,这样实现组合方法接口的所有子类都具备了Add和Remove,但是只是是虚函数,并不会去使用。1. 组合模式结构如下图所示为组合模式的示意图,主要的核心部分为容器部分(Composite),它是含有子组件的类.组件(Component):为组合中的对象声明接口原创 2022-03-25 11:51:18 · 6028 阅读 · 1 评论 -
C++之适配器(Adapter)模式
0. 简介适配器模式是一种结构型设计模式, 它能将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。根据适配器类与适配者类的关系不同,适配器模式可分为对象适配器和类适配器两种,在对象适配器模式中,适配器与适配者之间是关联关系;在类适配器模式中,适配器与适配者之间是继承(或实现)关系。他和装饰器模式一样可以动态扩展一些遗留或者不好改动的代码。1. 适配器模式结构1.1 对象适配器实现时使用了构成原则: 适配器实现了其中一个对象的接口, 并对另一原创 2022-03-14 10:07:49 · 7603 阅读 · 0 评论 -
C++之生成器(builder)模式
0. 简介生成器是一种创建型设计模式, 当构建一个复杂对象时,将构建过程与表示分离。使得同样的过程创建不同的对象。生成器与其他创建型模式不同, 生成器不要求产品拥有通用接口。 这使得用相同的创建过程生成不同的产品成为可能。生成器方法通常支持方法链 (例如 someBuilder->setValueA(1)->setValueB(2)->create() ),来组成复杂的对象。相比于工厂模式专门用于生产一系列相关对象而言,生成器重点关注如何分步生成复杂对象。1. 生成器UML介绍生原创 2022-03-07 10:38:52 · 9131 阅读 · 2 评论 -
C++之工厂(factory)模式
0. 简介继单例模式写完后,我觉得对于C++的高级用法可以来开一个专栏来专门整理与阐述,这里,我将以我们最常用的工厂模式开始,来逐步的共同学习。https://www.cnblogs.com/hebaichuanyeah/category/824625.html......原创 2022-03-07 10:38:38 · 16912 阅读 · 2 评论 -
C++之单例(singleton)模式
https://www.cnblogs.com/chusiyong/p/11433099.html原创 2022-03-04 09:34:30 · 7014 阅读 · 0 评论