C++
文章平均质量分 68
Code C++
大江东去浪淘尽千古风流人物
主要研究方向:XR SLAM 三维重建 欢迎讨论&&交流
展开
-
【C++】C++封装三大特性
静态成员函数不可访问静态成员函数,原因,静态成员函数初始化在程序初始化的时候完成。静态成员函数只会产生一份函数实例 也即多个类型的对象公用一块代码。this 指针 指向被调用的成员函数所属的对象 使用this变量。深拷贝:在堆区申请空间,进行拷贝操作,需要手工释放申请空间。在类内的非静态成员函数返回自身 return *this。只有非静态成员变量才属于类的对象上。浅拷贝:简单的复制拷贝操作。成员函数 分开存储。原创 2024-01-24 09:58:07 · 389 阅读 · 0 评论 -
【函数对象模板类】(function object) function使用方式
表示函数的参数列表。然后,我们使用function模板类将它们都封装为std::function<int(int, int)>类型的对象,即可以接受两个整数参数并返回一个整数结果的函数对象。这个结构定义了一个名为command_func_t的函数指针类型,该函数接受两个参数:一个int类型的整数和一个char**类型的指向字符数组的指针。需要注意的是,这只是一个简单的示例,实际应用中,command_func_t可以用于更加复杂和灵活的情况,例如注册回调函数、事件处理等场景。原创 2023-11-03 10:21:06 · 153 阅读 · 0 评论 -
【C++】pose文件保存,结构化文件保存
【代码】【C++】pose文件保存,结构化文件保存。原创 2023-09-06 11:27:16 · 97 阅读 · 0 评论 -
【C++】中位数求解,中位数绝对偏差MAD的应用
MAD 的计算过程首先找到数据集的中位数,然后计算每个观测值与中位数的绝对差,并求这些绝对差的中位数。对于标准正态分布的观测值,约50% 的数据落在中位数加减一个中位数绝对偏差的范围内。对于标准正态分布,约68% 的数据落在均值加减一个标准差的范围内,常见的3sigma原则,约95% 的数据落在均值加减两个标准差的范围内,约99.7% 的数据落在均值加减三个标准差的范围内。来估计中位数绝对偏差(MAD)。中位数绝对偏差(MAD)的特性是,在标准正态分布中,数据集的中位数绝对偏差大约等于标准差乘以一个常数。原创 2023-07-31 19:25:18 · 882 阅读 · 0 评论 -
【C++ 异步任务 】`std::future`
你可以在一个线程中启动一个异步任务,并在另一个线程中等待它的完成并获取结果。这提供了一种方便和高效的方式来处理并发编程中的异步操作。类模板用于持有异步操作的结果。它模拟一个尚不存在的值,并提供一些方法来等待该值的完成并获取结果。接受一个函数或函数对象作为参数,并创建一个异步任务来执行该函数或函数对象。是一个函数模板,可以用于异步地执行函数或函数对象,并返回一个。类模板用于设置异步操作的结果。方法,可以设置异步任务的结果,进而使关联的。异步操作的机制,用于获取异步任务的结果。对象以表示异步操作的结果。原创 2023-07-26 10:56:02 · 267 阅读 · 0 评论 -
【回调函数】
方法传递一个回调函数对象,可以将回调函数注册到主机类中。当触发回调函数时,会自动将回调函数作为任务添加到批量工作器中进行处理。当触发回调函数时,会自动将回调函数作为任务添加到实时工作器中进行处理。: 触发所有已注册的回调函数,并通过给定的参数调用这些回调函数。每个回调函数都是一个可以接受任意参数类型的函数对象,被定义为。接口,你可以根据自己的需求添加不同类型的参数和回调函数。对象与主机类中的回调函数关联起来。是模板参数,表示回调函数可以接受的参数类型。函数添加到主机类的回调函数列表中。原创 2023-07-25 15:00:20 · 130 阅读 · 0 评论 -
【c++】std::move 所有权转移的使用
这种情况下会产生资源的拷贝,如果智能指针类型的变量内部包含了大量或复杂的资源,可能会带来性能上的开销。当使用std::move(ref_frames)时,会将ref_frames的所有权转移到ref_frames_,这样做可以达到移动语义,避免了不必要的资源拷贝。综上所述,使用std::move可以有效地进行资源的转移,避免不必要的拷贝操作,提高代码的性能和效率。资源移动涉及将资源的所有权从一个对象转移到另一个对象,而资源拷贝则是创建一个新的对象,并将原始对象的值复制到新对象中。例如变量或函数返回的左值。原创 2023-07-12 19:32:38 · 1147 阅读 · 0 评论 -
【CMake】构建类型详细解读
RelWithDebInfo:用于构建较少的优化库或可执行文件,包含调试符号。MinSizeRel:用于不增加目标代码大小的优化方式,来构建库或可执行文件。Debug:用于在没有优化的情况下,使用带有调试符号构建库或可执行文件。Release:用于构建的优化的库或可执行文件,不包含调试符号。原创 2023-07-06 11:29:18 · 479 阅读 · 0 评论 -
【C++】提前声明(Forward declaration)好处
总的来说,提前声明在C++中有很多好处,包括减少编译依赖、解决循环依赖问题、提高编译速度、增加代码灵活性和减少编译连接时间。减少编译依赖:通过提前声明,可以减少对头文件的依赖。减少编译连接时间:在大型项目中,提前声明可以减少编译时间和连接时间的开销,因为不需要为每个使用的类型都检查完整的定义。提高编译速度:当只需要使用类的指针或引用时,提前声明可以避免编译器产生完整定义的开销,从而提高编译速度。增加代码灵活性:通过提前声明,可以在某些情况下隐藏类的定义细节,从而增加代码的灵活性和可维护性。原创 2023-07-06 10:33:50 · 376 阅读 · 0 评论 -
【C++】函数绑定器技术
在上面的代码中,std::placeholders::_1表示绑定函数的第一个参数,std::placeholders::_2表示绑定函数的第二个参数。占位符std::placeholders::_1和std::placeholders::_2是C++标准库中定义的特殊占位符,用于在使用std::bind或其他函数绑定器时指定参数位置。通过占位符std::placeholders::_1,可以将该函数对象的参数与调用时的参数进行绑定。通过绑定部分参数,可以将函数对象转换为可进行排序或筛选的比较函数。原创 2023-07-05 11:51:35 · 614 阅读 · 1 评论 -
【C++ 】STL求全排列和组合
【代码】【C++ 】STL求全排列和组合。原创 2022-11-11 20:00:04 · 355 阅读 · 0 评论 -
Pangolin库链接库问题
Handler'包含了pangolin库的头文件,而pangolin的一些函数没有定义,说明pangolin没有被链接,在CMakeLists.txt中继续添加。原创 2022-07-28 16:19:38 · 721 阅读 · 0 评论 -
C++11判断inf, nan(异常值判断与处理)
inf/NaN c++异常值判断与处理原创 2022-07-23 11:43:50 · 2256 阅读 · 0 评论 -
C++ this 指针
在 C++ 中,每一个对象都能通过 this 指针来访问自己的地址。this 指针是所有成员函数的隐含参数。因此,在成员函数内部,它可以用来指向调用对象。1. C++ Primer Page 258引入 this: 是 C++ 中的一个关键字,也是一个 const 指针,它指向当前对象,通过它可以访问当前对象的所有成员。当我们调用成员函数时,实际上是替某个对象调用它。成员函数通过一个名为 this 的额外隐式参数来访问调用它的那个对象,当我们调用一个成员函数时,用请求该函数的对象地址初始化 thi原创 2022-05-08 16:41:25 · 575 阅读 · 0 评论 -
【C++】【设计模式之】生产者-消费者模型(理论讲解及实现)
一、什么是生产者-消费者模型1、简单理解生产者-消费者模型假设有两个进程(或线程)A、B和一个固定大小的缓冲区,A进程生产数据放入缓冲区,B进程从缓冲区中取出数据进行计算,这就是一个简单的生产者-消费者模型。这里的A进程相当于生产者,B进程相当于消费者。2、为什么要使用生产者-消费者模型在多线程开发中,如果生产者生产数据的速度很快,而消费者消费数据的速度很慢,那么生产者就必须等待消费者消费完数据才能够继续生产数据,因为生产过多的数据可能会导致存储不足;同理如果消费者的速度大于生产者那么消费者就会经常原创 2022-07-12 17:37:58 · 8981 阅读 · 2 评论 -
【C++】find()函数用法查找
1. 查找指向指定元素的迭代器find函数主要实现的是在容器内查找指定的元素,并且这个元素必须是基本数据类型的。查找成功返回一个指向指定元素的迭代器,查找失败返回end迭代器。2. 在数组中查找:# include <iostream># include <vector># include <algorithm> //注意要包含该头文件using namespace std;int main(){ int nums[] = {原创 2022-05-18 14:58:21 · 6813 阅读 · 0 评论 -
【C++】std::numeric_limits 类型对应最值查询
1. std::numeric_limits 类型对应最值查询C++ 工具库 类型支持 std::numeric_limits定义于头文件 template< class T > class numeric_limits;numeric_limits 类模板提供查询各种算术类型属性的标准化方式(例如 int 类型的最大可能值是 std::numeric_limits::max() )。通过 numeric_limits 模板的特化提供此信息。标准库为所有算术类型制定可用的特化:定义于原创 2022-05-18 07:32:23 · 1267 阅读 · 0 评论 -
【C++】深度探索C++对象模型
1.什么是C++对象模型:语言中直接支持面向对象程序设计的部分,对于各个支持的底层实现机制.本书是C++第一套编译器cfront的设计者所写(了解C++对象模型, 有助于在语言本身以及面向对象观念两方面层次提升.).explicit(明确出现于C++程序代码).implicit(隐藏于程序代码背后).2. 关于对象每个非内联(non-inline)成员函数只会诞生一个函数实例. 而内联函数会在每个使用者身上产生一个函数实例.C++在布局以及存取时间上的额外负担主要由虚(virtual)引原创 2022-05-08 19:36:57 · 1009 阅读 · 0 评论 -
常见容器及操作复杂度
set、multiset、map、multimap特点:底层实现是红黑树,键值有序,set 和 map 键不可重复,而 multiset 和 multimap 可重复;操作复杂度:插入、删除、查找都为O(logN);unordered_set,unordered_map,unordered_multiset,unordered_multimap特点:底层实现是哈希表,键值无序,unordered_set 和 unordered_map 键不可重复,而另外两个可以重复;操作复杂度:插入、..原创 2022-05-06 17:00:20 · 668 阅读 · 0 评论 -
【C++】C++格式化输出/输出格式控制/输出精度控制
文章目录1. google c++规范2. 隐式类型转换 (构造函数的隐式调用)3. C++ 参考手册如下解释1. google c++规范explicit关键字只需用于类内的单参数构造函数前面。由于无参数的构造函数和多参数的构造函数总是显示调用,这种情况在构造函数前加explicit无意义。google的c++规范中提到explicit的优点是可以避免不合时宜的类型变换,缺点无。所以google约定所有单参数的构造函数都必须是显示的,只有极少数情况下拷贝构造函数可以不声明称explicit。例如作为原创 2022-05-05 15:33:25 · 2069 阅读 · 0 评论 -
资料整理(资源)
主板适配网络信息大全http://bios.uqidong.com/原创 2021-05-27 09:21:21 · 197 阅读 · 0 评论 -
堆和栈的区别(面试经验总结)
C++中,内存分为5个区:堆、栈、自由存储区、全局/静态存储区和常量存储区。栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区。通常存放局部变量、函数参数等。堆:是由new分配的内存块,由程序员释放(编译器不管),一般一个new与一个delete对应,一个new[]与一个delete[]对应。如果程序员没有释放掉, 资源将由操作系统在程序结束后自动回收。自...原创 2018-10-01 11:52:17 · 3558 阅读 · 0 评论 -
Eigen向量化内存对齐/Eigen的SSE兼容,内存分配/EIGEN_MAKE_ALIGNED_OPERATOR_NEW
1.总结对于基本数据类型和自定义类型,我们需要用预编译指令来保证栈内存的对齐,用重写operator new的方式保证堆内存对齐。对于嵌套的自定义类型,申请栈内存时会自动保证其内部数据类型的对齐,而申请堆内存时仍然需要重写operator new。有一种特殊情况本文并未提到,如果使用std::vector ,需要传入自定义内存申请器,即std::vector<Vector4d, AlignedAllocator>,其中AlignedAllocator是我们自定义的内存申请器。这是因为,std原创 2022-01-13 23:06:46 · 2155 阅读 · 3 评论 -
【C++】获取结构体中变量的偏移量
C/C++获取结构体中变量的偏移量1.某些特殊需求下,我们需要知道某个变量在其结构体中的偏移位置。通常的做法就是定义一个宏变量,如下:#define OFFSET(structure, member) ((int64_t)&((structure*)0)->member) // 64位系统#define OFFSET(structure, member) ((int32_t)&((structure*)0)->member) // 32位系统2.使用示例:#incl原创 2022-01-13 22:39:58 · 1644 阅读 · 0 评论 -
【error】error: field * has incomplete type
在编译程序是出现了如题错误, 类或结构体有前向声明的用法,编译到这里时还没有发现定义,不知道该类或者结构的内部成员,没有办法具体的构造一个对象,所以会报错。两种解决方法:方法一:将类成员改成指针就好了;方法二:将结构体定义放同一个地方。类或结构体的前向声明只能用来定义指针对象或引用,因为编译到这里时还没有发现定义,不知道该类或者结构的内部成员,没有办法具体的构造一个对象,所以会报错。将类成员改成指针就好了。 程序中使用incomplete type实现前置声明有助与实现数据的隐藏。要求调用对象的程原创 2022-01-10 22:58:31 · 7652 阅读 · 0 评论 -
cmake生成so包并调用(C++project,build,cmake)
1. 目录结构2 . downloads2.1buildmoduleprocessCMakeLists.txt====>cmake_minimum_required(VERSION 3.5)if(CMAKE_COMPILER_IS_GNUCC) message("COMPILER IS GNUCC") ADD_DEFINITIONS ( -std=c++11 )endif(CMAKE_COMPILER_IS_GNUCC)SET(CMAKE_CXX_原创 2021-12-17 11:01:04 · 2916 阅读 · 0 评论 -
【C++】四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast
C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast文章目录C++四种类型转换运算符:static_cast、dynamic_cast、const_cast和reinterpret_cast1.为什么要有显示类型装换?2. static_cast 关键字,int转double向上类型转换,低精度像高精度;指针类型`void 转`int;具体类型指针之间的转换,例如`int转`double `3. const_cast 关键字:去原创 2021-08-09 11:51:42 · 345 阅读 · 0 评论 -
【C++】random随机数与【C++11】/rand()和srand()的用法
文章目录随机数1. c++ 11 random随机数的使用(推荐使用)1.11.21.31.42.1 C++中随机函数rand()和srand()的用法(老本版)2.2 限制随机数的范围随机数C++ 提供了一组函数以生成和使用随机数字。随机数字就是从一组可能的值中进行随机选择而获得的一个值。该组中的值都有相同的被选中的几率。随机数字常用于许多不同类型的程序中,以下是一些示例:计算机游戏通常要使用随机数字来模拟一些随机过程,例如掷骰子或发牌。模拟程序使用随机数字来决定后续将要发生的一系列操作或人与动原创 2021-08-06 12:02:16 · 4792 阅读 · 0 评论 -
【C++】容器与继承
容器与继承Exercise 15.28:Define a vector to hold Quote objects but put Bulk_quote objects into that vector. Compute the total net_price of all the elements in the vector.Exercise 15.29:Repeat your program, but this time store shared_ptrs to objects of type原创 2021-07-06 09:21:53 · 295 阅读 · 0 评论 -
【C++】重载运算符(二)
1.4 下标运算符p501下标运算符必须是成员函数,表示容器的类通常可以通过容器中的位置访问元素,定义下标运算符operator[]一个包含下标运算符的类,通常,定义2个版本:一个返回普通引用,另一个是类的常量成员引用P14.26StrBlob & StrBlobPtr,实例#include <vector>using std::vector;#include <string>using std::string;#include <initia原创 2021-06-23 20:29:56 · 197 阅读 · 0 评论 -
【C++】重载运算符(一)
1.重载运算符重载运算符特点重载运算符本质上是一次函数调用除了operator() 运算符调用外,其他重载运算符不能含有默认参数。当重载的运算符是成员函数时,this绑定到左侧运算对象。成员运算符函数(显式)的参数数量比运算对象少一个。运算符重载列表该将运算符定义为成员函数还是普通成员?参考是什么,如下。Exercise 14.1: 重载操作符与内置操作符有哪些不同?重载操作符在哪些方面与内置操作符相同?不同点我们可以直接调用重载的operator函数。重载操作符原创 2021-06-19 14:54:47 · 542 阅读 · 2 评论 -
【C++】浅析析构函数(基类中)为什么要写成虚基类?
为什么有了虚析构函数,就能先调用子类的析构函数?class A { virtual ~A(){}};class B : A { virtual ~B(){}};A *p = new B();delete p; 唯一差别是,每个析构函数结束时会自动(隐含地)调上父类的析构函数,而普通虚函数并不会 唯一差别是,每个析构函数结束时会自动(隐含地)调上父类的析构函数,而普通虚函数并不会 。本质上 当类里面有定义虚函数时,编译器会给类增加一个虚函数表,里面来存放虚函数指针,这样就增加原创 2021-06-18 10:05:55 · 397 阅读 · 2 评论 -
【C++】动态内存管理/move/以及移动构造与移动赋值运算符
动态内存管理类对象移动与右值引用int a;int b;a = 3;b = 4;a = b;b = a;// 以下写法不合法。3 = a;a+b = 4;在 c 语言中, 确切地说应该是左值表达式,右值表达式:表达式是有值的,值是有类型的,值是动态的,类型是静态的,这是基本的概念 。通常来说有名字的变量就是左值(如上面例子中的 a, b),而由运算操作(加减乘除,函数调用返回值等)所产生的中间结果(没有名字)就是右值,如上的 3 + 4, a + b 等。我们暂且可以认为:左值就原创 2021-06-18 09:58:34 · 410 阅读 · 0 评论 -
【C++】原子操作(atomic)与无锁编程学习记录
lambdastd::bind智能指针使用深度库基于数据结构与算法的优化atomic 操作与多线程数据安全 原子内存操作设计模式:单例模式C++11原子操作与无锁编程https://www.jianshu.com/p/3e122ee901c5今天我将就C++11多线程中的atomic原子操作展开讨论;比较互斥锁,自旋锁(spinlock),无锁编程的异同,并进行性能测试;最后会讨论一下内存序的问题;为了流畅阅读你最好先熟悉一下C++11 Atomic的基本操作英文文档,这里还有一份我觉得做原创 2021-06-18 09:50:08 · 841 阅读 · 0 评论 -
【C++】LINK类型错误分析记录
LINK类型错误情况1:根据生成路径,查找是否成功生成静态库/动态库,一般在./bin文件中。情况2:是否在CMakeLists中target_link_libraries中添加链接静态库操作情况3:是都存在类模板,需要实例化,接口函数,这种情况很隐蔽,一般不容易想到。情况4:是否需要添加相关的头文件情况5:是否添加多余的头文件 ,导致头文件循环引用的问题,这种情况很隐蔽,一般不容易想到。情况6:没有成功生成静态库或者静态库,这种情况下查找是否缺少依赖,是否程序缺少头文件,是否是程序原创 2021-06-18 09:45:42 · 540 阅读 · 0 评论 -
【C++】拷贝控制与资源管理
1. 拷贝控制与资源管理管理类外资源的类必须定义拷贝控制成员。如P447中所见,这种类需要通过析构函数来释放对象所分配的资源。一旦一个类需要析构函数,那么几乎可确定它也需要一个拷贝构造函数和一个拷贝赋值函数。明确拷贝语义:可以定义拷贝操作,使类的行为看起来像一个值或者一个指针。类的行为像一个值,意味着他应该有自己的状态。深拷贝,副本与本身独立。行为像指针的类则是一个共享状态。浅拷贝,副本与原对象使用相同的底层数据。改变副本也会改变原对象,反之亦然。CP5_ex13_11_h 实例1:我们将在下一节原创 2021-06-14 12:05:38 · 251 阅读 · 0 评论 -
【C++】拷贝,赋值与构造
1. 拷贝构造函数/合成拷贝构造函数(copy constructor)1.1 定义:复制构造函数是一个构造函数,它的第一个参数是对类类型的引用,任何附加参数都有默认值。1.2 如下情况使用:case 1:使用 = 定义变量case 2: 将对象作为参数传递给非引用类型的参数case 3: 从具有非引用返回类型的函数返回一个对象case 4: 括号初始化数组中的元素或聚合类的成员case 5:一些类类型还为它们分配的对象使用复制初始化。1.3 形如下:拷贝构造函数的第一个参数必须是类.原创 2021-06-10 10:24:39 · 529 阅读 · 0 评论 -
【C++】关联容器学习记录
关联容器特性pair 类型Write a program to read a sequence of strings and ints , storing each into a pair. Store the pairs in a vector. P381,11.12make_pair 或者pair的4种初始化方式。 Exercise 11.12: #include <vector>#include <utility>#include <stri原创 2021-06-03 10:20:40 · 182 阅读 · 1 评论 -
【C++】algorithm具体操作记录
find寻找特定元素位置int main(char argc, int* argv[]) { vector<int> intVec = { 0,1,1,1,1,2,3,4,5,6,7,8,9 }; if (pos != intVec.end()) cout << "The value 5 exists,and its position is " << distance(intVec.begin(), pos) + 1 << endl; els原创 2021-05-30 15:01:15 · 88 阅读 · 0 评论 -
【C++】bind参数绑定 P354(通用的函数适配器)
1. 什么时候该使用bing ?什么时候该使用lambda?当只有少数地方调用时候使用lambda,当需要多次调用lambda时,需要定义一个函数,而不是多次编译相同的lambda表达式。调用bind的一般形式为:auto newCallable = bind(callable,arg_list)callable本身是一个可调用的对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。即当调用newCallable时,newCallable会调用callable,并传递原创 2021-05-30 14:55:09 · 189 阅读 · 0 评论