c++
文章平均质量分 75
惊鸿一博
毕业于中国科学院大学/中科院自动化研究所;专注于SLAM,三维重建,图像处理,视觉定位等;曾就职于鸿海集团,大陆集团,现在某自动驾驶独角兽企业;热爱分享,热爱生活;欢迎一起交流,学习,进步。
展开
-
添加Sophus库时CMake找不到Sophus的问题
Sophus库文件, Could not find a package configuration file provided by "Sophus" with any of the following names: SophusConfig.cmake sophus-config.cmake原创 2024-08-12 22:30:00 · 55 阅读 · 0 评论 -
C++_#pragma GCC visibility pop 什么意思
是一种特定的编译器指令(pragma),用于GNU GCC(GNU Compiler Collection)和其他兼容GCC的编译器中,以。这在复杂的项目中特别有用,当你需要在代码的某个部分改变符号的可见性,但又不想影响到其他部分时。例如,如果你正在编写一个库,并希望隐藏大多数内部符号,但想要临时暴露一些特定的函数或变量,你可以使用。这些值控制了符号在共享库中的可见性,即它们是否可以被库外部的代码看到和链接。将是可见的,即使它们都位于同一个源文件或库中。来管理这些更改,而不会影响库的其他部分。原创 2024-08-10 22:15:00 · 283 阅读 · 0 评论 -
C语言_将多个标志位保存到一个char里
首先,为每个标志位定义一个位掩码(bit mask)。位掩码是一个整数,其只有一个二进制位为1(代表你的标志位),其他位都是0。原创 2024-07-10 22:30:00 · 437 阅读 · 0 评论 -
c++将一个复杂的结构体_保存成二进制文件并读取
在 C++ 中,可以将复杂的结构体保存到二进制文件中,并从二进制文件中读取它。为了实现这一点,你可以使用文件流库。以下是一个示例,展示如何将一个复杂的结构体保存到二进制文件中,并从二进制文件中读取它。原创 2024-07-02 22:00:00 · 499 阅读 · 0 评论 -
C++_如何改变std::tuple中元素的值,即使是const?
第三方库库函数,使用了 const std::tuple 作为参数, 当需要改变这里tuple中元素的值, 这么办?答: 使用引用传参数,如何使用引用呢?见如下代码?原创 2024-06-06 22:30:00 · 435 阅读 · 0 评论 -
gcc_预处理语句--#include和#include_next
gcc_预处理语句--#include和#include_next原创 2024-04-23 23:00:00 · 797 阅读 · 0 评论 -
C++多线程_线程同步_ sem_t信号量
信号量是一种变量,其访问是原子操作的。这就使得应用程序可以对其采用两种操作。1、等待信号量,当信号量是0的时候,程序阻塞等待。当信号量 > 0 的时候,程序就可以继续运行了。2、发送信号量,其作用是让信号量的值+1。这就实现了线程的同步控制。} sem_t;#endifsem_init : 初始化信号量sem_destroy : 释放信号量sem_post : 增加信号量的值。原创 2024-01-23 23:30:00 · 744 阅读 · 0 评论 -
C++多线程_std::future与std::promise
在并发编程中,我们通常会用到一组非阻塞的模型:promise\future。在python、js、java中都提供future\promise,是现代语言常用的非阻塞编程模型。原创 2024-01-23 21:45:00 · 1715 阅读 · 0 评论 -
C++_Lambda表达式的完整介绍
最常见的lambda的表达式写法如下这里只是计算两个数的和,我们一般情况下肯定是不会这么用的,更多的时候,我们都是和stl的一些算法结合使用,例如自定义一个结构体的排序规则和打印。int a;int b;int main()// 根据Item中成员a升序排序});// 打印vec中的item成员});return 0;这样的写法让我们代码更加简洁、清晰,可读性更强。在c++的官方文档中,给出了lamda表达式的四种写法,这里知乎的排版有点难用,所以直接在官方文档。原创 2024-01-19 22:15:00 · 2162 阅读 · 1 评论 -
C++_linux下_非阻塞键盘控制_程序暂停和继续/for循环每隔2s执行一次
在程序执行过程中,点击键盘p按键(pause), 程序暂停, 点击键盘上的n按键(next),程序继续执行。原创 2023-10-16 21:30:00 · 1277 阅读 · 0 评论 -
怎样获取字符串数组的长度_使用sizeof(array) / sizeof(array[0])
C、C++中没有提供直接获取数组长度的函数,对于存放字符串的字符数组提供了一个strlen函数获取长度,那么对于其他类型的数组如何获取他们的长度呢?其中一种方法是使用sizeof(array) / sizeof(array[0]), 在C语言中习惯上在使用时都把它定义成一个宏,比如#define GET_ARRAY_LEN(array,len) {len = (sizeof(array) / sizeof(array[0]));这样对于一些简单的数组可以使用这个宏或者这个函数来获取数组的长度了。原创 2023-09-11 20:30:00 · 1283 阅读 · 0 评论 -
C++宏定义不受命名空间的约束
C++宏定义不受命名空间的约束。转载 2023-02-28 11:17:03 · 213 阅读 · 0 评论 -
多边形或轮廓等距离外扩或收缩
给定一个简单多边形,多边形按照顺时针或者逆时针的数许排列内部等距离缩小或者外部放大的多边形,实际上是由距离一系列平行已知多边形的边,并且距离为L的线段所构成的。原创 2022-08-17 23:11:12 · 4480 阅读 · 11 评论 -
内存问题分析工具_valgrind之memcheck基本使用
1. 下载安装下载地址:Valgrind: Current Releases安装:例如版本 valgrind-3.18.1tar xvf valgrind-3.18.1.tar.bz2cd valgrind-3.14.0/./configuremakesudo make install2. 使用示例valgrind --log-file=valgrind.log --tool=memcheck --leak-check=full --show-leak-kinds=all .原创 2022-03-18 15:09:48 · 1554 阅读 · 0 评论 -
Eigen编译_Eigen向量化_内存对齐 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
目录1 缘起2 什么是向量化运算?2.1 A Simple Example2.2 重构2.3 Heap vs Stack2.4 还有坑?3 再谈Eigen4 总结1 缘起Eigen是一个非常常用的矩阵运算库,至少对于SLAM的研究者来说不可或缺。然而,向来乖巧的Eigen近来却频频闹脾气,把我的程序折腾得死去活来,我却是丈二和尚摸不着头脑。简单说说我经历的灵异事件。我的程序原本在NVIDIA TX2上跑的好好的,直到有一天,我打算把它放到服务器上,看看传说中的RT转载 2022-03-01 18:13:06 · 5298 阅读 · 7 评论 -
Eigen中 EIGEN_MAKE_ALIGNED_OPERATOR_NEW_IF的使用方式_C/C++中的预编译简介
目录1 概述2 常见的预处理指令3 其他预编译指令4 预定义标识符5 #define5.1 使用宏函数,定义类的成员函数5.2 Eigen中使用宏函数,重载类的成员函数(内存分配方式)1 概述预处理指令提供按条件跳过源文件中的节、报告错误和警告条件,以及描绘源代码的不同区域的能力。比如 使用术语“预处理指令”为了与 C 和C++编程语言保持一致。 预处理器的主要作用就是把通过预处理的内建功能对一个资源进行等价替换,最常见的预处理有:文件包含,条件编译、布局控制和..原创 2022-03-01 15:44:59 · 2998 阅读 · 1 评论 -
C++_实现一个简单的智能指针shared_ptr
目录1 shared_ptr的实现原理2 代码简单实现参考1 shared_ptr的实现原理智能指针的一种通用实现技术是使用引用计数。智能指针类将一个计数器与智能指针指向的对象相关联,用来记录有多少个智能指针指向相同的对象,并在恰当的时候释放对象。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,引用计数加1;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构原创 2022-01-26 21:01:31 · 1681 阅读 · 0 评论 -
C++_const与指针_指向常量的指针(const int* p) 对比 常量指针 (int* const p = &a);
1. const 限定一个变量时问题:const int a = 10; a是否可以改变?答案: c语言中允许改变,c++中不允许改变c语言改变一个const变量的方式:#include <stdio.h>int main() { const int a = 10; //a = 100; // err printf("a的值:%d\n", a); // a的值:10 int *p = &a; *p = 100; pr原创 2022-01-18 23:41:23 · 919 阅读 · 0 评论 -
C++_数据结构_堆用法详解
1. 基本概念堆(heaps)是一种特殊的数据组织方式,STL中的 priority_queue 容器适配器底层就是采用堆来组织数据存储的。为了弄明白堆是什么,首先要搞清楚什么是树存储结构。1.1 树存储结构树是分层排列的元素或节点。每个节点有一个键,它是节点中所保存的对象,就如同链表中的节点。父节点是有一个或两个子节点的节点。一般父节点可以有任意个数的子节点,树中的父节点不需要有相同个数的子节点。没有子节点的节点叫作叶节点。一般父节点的键与其子节点有一些关系。树都有一个根节点,它是树的基础,.转载 2021-12-20 15:00:33 · 1755 阅读 · 0 评论 -
算法笔记_面试题_20.数组相关_模板及示例十几道
1. 排序数组的相关操作例1. 合并两个排序数组描述:将按升序排序的整数数组A和B合并,新数组也需有序。来源:(lintcode 6 · 合并排序数组简单)样例 1:输入:A = [1] B = [1]输出:[1,1]解释:返回合并后的数组。样例 2:输入:A = [1,2,3,4] B = [2,4,5,6]输出:[1,2,2,3,4,4,5,6] 代码有点类似 合并两个排序链表。只不过这里使用时vector相关的操作。class Solution ...原创 2021-11-30 11:44:09 · 604 阅读 · 0 评论 -
算法笔记_面试题_19.链表_模板及示例十几道
1. 删除链表中所有重复节点描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。返回同样按升序排列的结果链表。示例 1:输入:head = [1,2,3,3,4,4,5] 输出:[1,2,5]示例 2:输入:head = [1,1,1,2,3] 输出:[2,3]代码因为删除的是所有重复的节点,只要重复全都删除。所有链表的头可能会发生变化。所以为了方便起见,我们...原创 2021-11-24 18:48:15 · 800 阅读 · 0 评论 -
算法笔记_面试题_18.动态规划_模板及示例十几道(下)
接文章 算法笔记_面试题_18.动态规划_模板及示例十几道1. 背包问题例14.class Solution {public: /** * @param m: An integer m denotes the size of a backpack * @param A: Given n items with size A[i] * @param V: Given n items with value V[i] * @return: The.原创 2021-11-20 22:49:16 · 570 阅读 · 0 评论 -
算法笔记_面试题_18.动态规划_模板及示例十几道(上)
目录1. 引例例1.数字三角形最小路径和代码1_ traverse法代码2_ 分治法DC代码3_动态规划DP_记忆化搜索(分治法DC + 记忆化)代码4_动态规划DP_多重循环(本文重点,重点记忆)动态规划方法对比:记忆化搜索 对比 多重循环2. 动态规划的套路2.1 动态规划的四点要素2.2什么情况下使用动态规划?2.3什么情况下不使用动态规划?2.4面试中常见的动态规划类型参考:九章算法 lintocde leetcode 代码随想录carl...原创 2021-11-13 20:34:48 · 646 阅读 · 0 评论 -
c++_string与double/int互转
1. 字符串string转数值double/int等使用 stringstreamstringstream ss;string timeStr = s0.substr(0, 16);ss << timeStr;double t; // int t;ss >> t;使用atof atoistring myStr = "123.332";double myNum = atof(myStr.c_str());string myStr = "123";do原创 2021-09-23 15:07:34 · 382 阅读 · 0 评论 -
C++_你真的知道++i 和 i++的区别吗?_左值/右值/右值引用
目录基本概念左值右值左值引用右值引用参考基本概念C++ Primer 第五版13.6.1 P471: 左值持久,右值短暂。左值左值 lvalue(又称 locator value):代表一个在内存中占有确定位置的对象(换句话说就是有一个地址,一个对象)。(如 int a; a+1 =2; 这里的(a+1)表示:表达式的临时结果,没有确定的内存空间(换句话说,它们只是计算的周期驻留在临时的寄存器中)。变量是左值变量可以看做一个运算对象(没有运算符的表达式)返回左.原创 2021-07-19 21:29:03 · 292 阅读 · 0 评论 -
C++_Hash容器总结
一、Hash基本概念散列Hash函数是一种特殊的映射函数, 散列表Hash Table由散列函数所产生的一种数据结构. 这是一种非常重要的数据结构.首先, 先了解散列表在数据结构方面的基础:散列表是用于存储动态集的一种非常有效的数据结构。通过散列函数h(key)的计算结果,直接得到key关键字表示的元素的存储地址。散列技术中,可能会有两个不同的key1和key2,通过h(key)计算得到的地址是一样的,这就发生了冲突。散列技术中散列函数h(key)和解决冲突的技术是最关键的问题。1.1 散列转载 2021-07-15 12:43:19 · 1332 阅读 · 0 评论 -
c++_如何将一个const变量转成非const变量_const_cast
目录C++提供了四个转换运算符const_cast(expression)用const_cast来去除const限定传统转换方式实现const_cast运算符为何要去除const限定前面讲了C++继承并扩展C语言的传统类型转换方式,最后留下了一些关于指针和引用上的转换问题,没有做详细地讲述。C++相比于C是一门面向对象的语言,面向对象最大的特点之一就是具有“多态性(Polymorphism)”。要想很好的使用多态性,就免不了要使用指针和引用,也免不了会碰到转换的问题,所以在这一.转载 2021-05-23 08:36:05 · 12433 阅读 · 1 评论 -
C++_虚函数的实现的基本原理
目录1. 概述2. 虚函数表构造过程3. 虚函数调用过程4. 多重继承5. 菱形继承1. 概述简单地说,每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表,其中存放着该类所有的虚函数对应的函数指针。例:其中:B的虚函数表中存放着B::foo和B::bar两个函数指针。 D的虚函数表中存放的既有继承自B的虚函数B::foo,又有重写(override)了基类虚函数B::bar的D::bar,还有新增的虚函数D::quz。提示:为了描述方转载 2021-05-22 11:08:24 · 342 阅读 · 0 评论 -
C++_ 多态与虚函数介绍
多态性同样的接口访问功能不同的函数,从而实现“一个接口,多种方法”。在C++中,多态性的实现和联编(也称绑定)这一概念有关。C++支持两种多态性:编译时多态性,运行时多态性。编译整体过程1.预处理:包含宏替换,条件编译,include导入文件(针对C/C++) 2.编译:包含词法分析,语法分析,语义分析,中间代码生成与优化,生成汇编文件 3.汇编:将汇编文件编译成2进制的机器码 4.链接:将目标文件与外部符号进行链接,得到一个...原创 2021-05-20 12:17:20 · 337 阅读 · 0 评论 -
C++_auto_ptr与unique_ptr智能指针
目录1 auto_ptr与unique_ptr2 unique_ptr特性3 unique_ptr可以:4 unique_ptr对auto_ptr的改进如下:4.1 auto_ptr支持拷贝构造与赋值操作,但unique_ptr不直接支持4.2 unique_ptr可以用在函数返回值中4.3 unique_ptr可做为容器元素5 示例1 auto_ptr与unique_ptrauto_ptr是用于C++11之前的智能指针。由于 auto_ptr 基于排他所有权模式:两转载 2021-05-20 10:12:21 · 782 阅读 · 0 评论 -
C++_弱引用 强引用_weak_ptr/share_ptr
目录1 为什么有引用计数2 强引用3 弱引用1 为什么有引用计数C++中存在两种语义:值语义(value sematics)和对象语义(object sematic),对象语义也可以叫做引用语义(reference sematics)。值语义,指的是对象的拷贝与原对象无关,就像拷贝int一样,C++的常用类型数据等都是值语义。 对象语义,指的是面向对象意义下的对象,是禁止拷贝的。在设计一个类的时候该类是否可以被拷贝(即具备拷贝构造函数),取决于拷贝后的语义是否成立,比如一个Thr转载 2021-05-18 20:03:44 · 822 阅读 · 0 评论 -
C++_智能指针shared_ptr、unique_ptr、weak_ptr、auto_ptr总结
参考资料:《C++ Primer中文版 第五版》介绍我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。内存四区模型一个由C/C++转载 2021-05-10 07:46:51 · 879 阅读 · 0 评论 -
图像处理_OpenCV图像增强算法实现(直方图均衡化、拉普拉斯、Log、Gamma)
目录1. 基于直方图均衡化的图像增强2. 基于拉普拉斯算子的图像增强3. 基于对数Log变换的图像增强4. 基于伽马变换的图像增强参考:1. 基于直方图均衡化的图像增强直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增强图像细节。彩色图像的直方图均衡化实现: #include <opencv2/highgui/highgui.hpp>转载 2021-04-25 16:30:08 · 497 阅读 · 0 评论 -
C++_模板全特化、偏特化
目录1. C++模板2. C++模板全特化3. C++模板偏特化4. 模板类调用优先级1. C++模板大家都对C++的模板编程应该都能很熟练使用了,下面就是一段很简单不过的例子了//模板函数template<typename T, class N> void func(T num1, N num2){ cout << "num1:" << num1 << ", num2:" << num2 <<..转载 2021-03-26 13:21:06 · 317 阅读 · 0 评论 -
C++_二维数组的动态申请内存3种方法
1.两层指针先申请一个指针数组,再为数组中每个指针申请内存//申请:int **Matrix = new int*[ROW]; for (int i = 0; i < ROW; i++) Matrix[i] = new int[COL];//释放:for (int i = 0; i < ROW; i++) delete[] p[i];//先释放指针数组中的一级指针 delete[] p;//在释放二级指针优劣:行和列都可以是变转载 2021-02-01 17:22:45 · 3918 阅读 · 1 评论 -
图像处理_如何保存浮点型数值的图像? (C++ / OpenCV)
前言保存浮点型的图像,比如保存深度图,深度值不是整数的情况. 但一般的图像格式(png jpg等)只能保存整数类型的数值,因为要显示出来的话,需要与整数类型的颜色表一一对应.这里给出两种方式方式1将对应的数值整数化,即乘以一个值,转成整数,保存起来,在使用时再除以这个整数(比如256)#include <opencv2/opencv.hpp>#include <cstdlib>#include <ctime>int main_png(int ar原创 2021-01-20 15:49:36 · 12117 阅读 · 15 评论 -
设计模式_单例模式回顾_C++版不使用锁保证多线程安全
最推荐的懒汉式单例(magic static )——局部静态变量说明:这种方法又叫做 Meyers' SingletonMeyer's的单例, 是著名的写出《Effective C++》系列书籍的作者 Meyers 提出的。所用到的特性是在C++11标准中的Magic Static特性:If control enters the declaration concurrently while the variable is being initialized, the concurrent ex原创 2021-01-03 18:08:55 · 415 阅读 · 0 评论 -
opencv的Mat与Eigen的Matrix相互转换
目录1 opencv的Mat与Eigen的Matrix相互转换1.1 Eigen 转 cv::Mat1.2 cv::Mat 转 Eigen1.3 float 与 double 互转2 SE(3):把cv的旋转矩阵转换为Eigen中旋转矩阵的赋值1 opencv的Mat与Eigen的Matrix相互转换首先包含这几个头文件,据说Eigen相关的要放在前面。#include <Eigen/Core>#include <Eigen/Dense>#inc原创 2020-10-15 15:38:34 · 6190 阅读 · 2 评论 -
随手记_C++语法中的一些注意事项
1.默认实参必须在形参列表结尾2.原创 2020-10-13 22:01:39 · 212 阅读 · 0 评论 -
深入理解什么是变量?
总结:变量是为某一内存起一个名字,本质就是代表内存中的一段存储空间。变量名存在编译器中(如vs 下的cl.exe),变量名指向一块内存地址,编译之后,变量名变成地址。变量是一种使用方便的占位符,用于引用计算机内存地址。 参考:http://baike.baidu.com/link?url=QH98DaRn-l9tI-EGi1U3AWbuEXBLoTXXQ9mUE4ouwdQ8M_UcY5JLH原创 2017-06-01 14:03:05 · 965 阅读 · 0 评论