
C++
文章平均质量分 76
moneymyone
不经历风雨,怎么迎接暴风雨。
展开
-
多进程编程通信——消息队列
管道的通信方式是效率低的,因此管道不适合进程间频繁地交换数据。而的通信模式则高效许多。消息队列提供了异步的通信协议,是内核中的一个优先级队列,多个进程通过访问同一个队列,进行添加结点或者获取结点实现通信。原创 2023-09-15 10:48:08 · 402 阅读 · 0 评论 -
多进程编程通信(1)
对于匿名管道,通信范围是父子关系的进程。因为管道没有实体,也就是没有管道文件,只能通过 fork 来复制父进程 fd 文件描述符,来达到通信的目的。另外,对于命名管道,它可以在不相关的进程间也能相互通信。因为命令管道,提前创建了一个类型为管道的设备文件,在进程里只要使用这个设备文件,就可以相互通信。不管是匿名管道还是命名管道,进程写入的数据都是缓存在内核中,另一个进程读取数据时候自然也是从内核中获取,同时通信数据都遵循先进先出原则,不支持 lseek 之类的文件定位操作。原创 2023-09-15 10:47:18 · 89 阅读 · 0 评论 -
优雅地打印堆栈跟踪信息——Backward-cpp
而 Backward 会将堆栈信息打印出来,帮助定位。有点像gdb时的backtrace只有当源文件可访问时,它才能显示代码片段。所有以管道“|”为前缀的“源”行和代码片段都是内联下一帧的帧。项目源码本质上只有文件,集成到自己的程序中非常方便,如果加入文件一起编译,则自己代码中不需要调用Backward-cpp中的函数,非常方便。原创 2023-09-15 10:43:38 · 1981 阅读 · 0 评论 -
C++ | 负数比0大?
这句,判断左边是int类型,判断右边是 unsigned int 类型, 有符号和无符号进行比较的时候,会统一转换为无符号数进行比较,所以当负数和无符号比较时,负数会转换为无符号的数,当待比较的无符号数是0的时候,等式恒成立。上述代码,在int 和 unsigned int 比较的时候,将左侧k 转换为 unsigned int 了,所以即便k是负数,转换为无符号后仍然符合。因此如果左侧类型的等级大于右侧的,编译器会将右边数据类型转换为左边变量的类型,然后赋值,这样不会丢失数据精度;原创 2023-09-05 11:03:19 · 657 阅读 · 0 评论 -
C++ | 程序暂停功能
回到问题本身,根本就是我通过终端,发送一个信号给程序,程序接收到了,然后改变运行的代码;我再次发送时,程序又接收到了,再恢复代码。使用opencv 的waitKey函数是可以在有限的时间内,监听键盘按键,如果没有按下键盘,则继续,如果按下键盘则特殊处理。函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,此处作为延时函数使用。播包一样的功能,按下空格键,程序就暂停了,可以根据三维界面进行观察。就是获取字符串,如果获取到空格,则暂停。命令给程序发送信号,可以自定义。,这样程序就可以随时接收到信号了。原创 2023-09-04 13:34:37 · 411 阅读 · 0 评论 -
Effective STL | 条款4:用empty来代替检查size()是否为0
不同的list实现用不同的方式解决这个矛盾,依赖于他们的作者选择的是让size或splice的区间形式达到最高效率。如果你去掉了splice的区间形式要更新它所修改的list的大小的需求,splice就可以是常数时间,但。如果你碰巧使用了一个常数时间的splice的区间形式比常数时间的size优先级更高的list实现,如果你碰巧使用了一个常数时间的splice的区间形式比常数时间的size优先级更高的list实现,**A:**对于list特有的splice有很多要处理的东西。算出接合进来的元素的个数。原创 2023-09-04 13:16:14 · 106 阅读 · 0 评论 -
Effetive STL | 条款3:使容器里对象的拷贝操作轻量而正确
即使只使用其中的一些或者我们立刻使用从某个地方获取(比如,一个文件)的值覆盖每个默认构造的值,这也得构造maxNumWidgets个Widget对象。STL进行了大量拷贝,但它通常设计为避免不必要的对象拷贝,实际上,它也被实现为避免不必要的对象拷贝。(insert或push_back等)的那个对象了,进入容器的是你指定的对象的拷贝;如果你希望结果对象表现为派生类对象,比如,调用派生类的虚函数等,总是错的。也就是说,不是建立一个Widget的容器,建立一个Widget*的容器。等,对象会移动(拷贝)原创 2023-09-04 13:15:15 · 93 阅读 · 0 评论 -
Effetive STL | 条款2 : 小心对“容器无关代码”的幻想
typedef只是其它类型的同义字,所以它提供的的封装是纯的词法(译注:不像#define是在预编译阶段替换的)。不同的容器是不同的,而且它们的优点和缺点有重大不同。如果使用过程中,你发现从列表的中部插入和删除客户并不像你想象的那么频繁,仅仅需要快速确定客户列表顶部的20%——一个为nth_element算法量身定做的任务。要限制如果用一个容器类型替换了另一个容器可能需要修改的代码,就需要在类中隐藏那个容器,而且要通过类的接口限制容器特殊信息可见性的数量。很多人会试图在他们的软件中泛化容器的不同,而。原创 2023-09-01 17:07:19 · 114 阅读 · 0 评论 -
Effective STL 1.仔细选择你的容器
当面对容器时,STL给了你很多选项。如果你的视线超越了STL的范围,那就会有更多的选项。在选择一个容器前,要保证考虑了所有你的选项。原创 2023-09-01 17:04:50 · 141 阅读 · 0 评论 -
C++ | 源码分析 Why double free?
原代码中因为使用了。原创 2023-08-29 10:48:15 · 433 阅读 · 0 评论 -
MEC | 条款6 区别累加累减操作符的前置和后置形式
函数必须产生1个临时对象,用作返回值,该临时对象需要构造,也需要析构。后置式操作符并未调用其入参,该入参唯一的作用就是区别前置式和后置式。但从效率而言,前置式 不需要多创建1个对象,就能完成自身数值变化。当我们故意省略入参的名称时,编译器就不会对未使用的入参发出警告。的第二个调用动作施行于第一个调用动作的返回对象,而。返回1个对象,因为该对象存储的是累加之前的旧值。自变量,并且在它被调用时,编译器默默地为该。操作符,它们都是将某个值累加。是允许的,改变的都是原对象。,则可以进行2次累加,但是。原创 2023-08-29 10:44:25 · 120 阅读 · 0 评论 -
MEC | 条款5 对定制的“类型转换函数”保持警觉
能够以单一自变量成功调用的 constructors如此 constructors 可能声明拥有单一参数,也可能声明拥有多个参数,并且除了第1个参数之外都有默认值class Namepublic:// 可以把 string 转换为 Name...public:// 可以把 int 转换为 Rational隐式类型转换操作符 :是一个 member function,关键词 operator 之后加上1个类型名称。因为已经有了类型名称,因此不能为此函数指定返回值类型。public:...原创 2023-08-20 10:22:48 · 117 阅读 · 0 评论 -
MEC | 条款4 非必要不提供 default constructor
如果谨慎设计 template, 可以消除对default constructor 的需求,例如标准库中的 vector template 会产生出行为类似的“可扩展数组”的各种 classes,不要求其类型参数拥有一个 default constructor.当我们定义1个类,如果没有定义构造函数,C++会默认提供1个构造函数(Constructors),用来将对象初始化,因此,一般来说,“合理地从无到有生成对象”的 classes,都应该内含 default constructors,而。原创 2023-08-13 21:45:31 · 126 阅读 · 0 评论 -
MEC | 条款3 绝对不要以多态(polymorphically)方式处理数组
因此,编译器为PrintBSTArray 函数所产生的指针算术表达式,对于 BalancedBST objects 所组成的数组而言就是错误的。所以删除 derived class 的时候,会调用基类的析构函数,解决这种办法需要将基类的析构函数设为虚函数。编译器假设数组中每个元素的大小是 BST 的大小,但其实每个元素大小是 BalancedBST 的大小。当数组被删除,数组中每1个元素的 destructor 都必须被调用,编译器其实看到的这样的句子。是个指针,指向数组起始处。所指内存两者相距多远?原创 2023-08-13 21:44:10 · 154 阅读 · 0 评论 -
MEC | 条款2 最好使用C++转型操作符
转换函数指针的代码是不可移植的, C++不保证所有的函数指针都被用一样的方法表示,在一些情况下这样的转换会产生不正确的结果,所以应该避免转换函数指针类型。这个操作符的转换结果几乎总是与编译平台息息相关,所以 reinterpret_cast 不具有移植性。static_cast 拥有与C旧事转型相同的威力和意义,以及相同的限制。reinterpret_cast 最常用的用途是转换“函数指针”类型。显然,const_cast 最常见的用途就是。要从C的旧事转型,改为新的转型方法。用来执行继承体系中的“原创 2023-08-13 21:42:47 · 128 阅读 · 0 评论 -
gcc/g++ 编译选项详解
它打开 -ffast-math、-fallow-store-data-races 和176 Using the GNU Compiler Collection (GCC) Fortran 特定的 -fstack-arrays,除非指定 -fmax-stack-var-size,和-fno-protect-parens。-fold-unroll-loops 意味着 -fstrength-reduce 和 -frerun-cse-after-loop。这是使用旧的循环展开器完成的,其循环识别基于前端的注释。原创 2023-08-13 21:41:05 · 4459 阅读 · 0 评论 -
EffectiveC++ | 48 认识 template 元编程
*template metaprogramming(TMP,模板元编程)**是编写 template C++ 程序并执行于编译期的过程。以 C++ 写成,执行于 C++ 编译器内的程序。TMP程序的输出就是从 templates 具现出来的若干 C++ 源码,然后再被编译。可以理解为对调用templates 的地方进行适配。由于 template metaprograms执行于 C++ 编译期,因此可以将很多工作从运行期转移到编译期。某些在运行期才能检测出来的错误,在编译器即可找出来;原创 2023-04-09 23:45:25 · 186 阅读 · 0 评论 -
C++ | std::iota实现递增序列
std::iota实现递增序列原创 2023-01-18 14:51:59 · 889 阅读 · 0 评论 -
C++ for循环效率优化
C++ for循环效率优化结论耗时: 相当于 < < 耗时: 引用取值 < 拷贝取值耗时: std::copy < 遍历赋值emplace_back效率不一定比push_back高;在 vector 这样的序列容器中,比右值参数的少做一次移动构造, 比左值参数的少做一次拷贝构造;for循环优先使用 或 或 拷贝vector数组时,优先使用std::copyC++ for循环效率优化原创 2023-01-18 14:48:10 · 731 阅读 · 0 评论 -
驱动点云格式修改带来的效率提升
驱动点云格式修改带来的效率提升原创 2022-07-27 16:06:35 · 270 阅读 · 0 评论 -
apollo 路面检测分析
apollo 路面检测分析原创 2022-07-26 20:01:10 · 930 阅读 · 5 评论 -
Git使用
Git使用原创 2022-07-26 19:59:50 · 167 阅读 · 0 评论 -
未知点云结构文件转换需求
未知点云结构文件转换需求原创 2022-07-26 19:58:45 · 267 阅读 · 0 评论 -
刷题整理(一)
刷题整理原创 2022-04-18 23:32:33 · 213 阅读 · 0 评论 -
C++ bug解决经验(一)
C++ bug解决经验(一)1 error: expected initializer before ‘namespace’仔细检查下,头文件定义函数时未添加分号,或者函数未写完就编译了。2 ‘typedef’ was ignored in this declaration原因:结构体没有定义别名解决:曲调typedef或者在结构体括号外添加别名typedef struct Vehicle{ std::string name; }Veh; // veh就是别名3 坐标转换之原创 2022-04-01 21:47:45 · 3825 阅读 · 0 评论 -
控制台输出彩色文字
控制台输出彩色文字原创 2022-02-24 14:03:56 · 1506 阅读 · 0 评论 -
ubuntu展示点云使用boost::this_thread报错
解决ubuntu使用boost::this_thread报错原创 2022-02-12 15:37:01 · 1555 阅读 · 0 评论 -
【C++】vector 排序
vector 排序1. 数组排序,元素为整数2. 数组排序,元素为类1. 数组排序,元素为整数// 打印函数void Print(vector<int>& nums){ std::cout << "Sorted numbers:" << std::endl; for (size_t i = 0; i < nums.size(); i++) { std::cout << nums[i];原创 2021-08-24 00:44:37 · 2264 阅读 · 0 评论 -
二进制位运算的巧用
二进制位运算的巧用 int n = 10; // 1 判断奇数偶数 if ((n & 1) == 1) { // 奇数 } else if ((n & 1) == 0) { // 偶数 } // 2 乘以2左移,除以2右移,无符号整数这么用,但要注意溢出,有符号整数注意符号 int n2 = n << 1; int n3 = n >> 1; // 3原创 2021-08-14 00:47:53 · 153 阅读 · 0 评论 -
C++知识点打结(二)
C++知识点打结(二)11. 多继承12. 内存分配13. 枚举14. fopen15. 32位机器输出16. 转义字符17. 预算符优先级18. Const19. 预处理20. Fork进程拷贝11. 多继承含有纯虚函数的类是抽象类,不能实例化。在多继承中,派生类和被继承的第一个基类的地址相同,和第二个基类的地址不同12. 内存分配栈:就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。堆:就是那些由new分配的内存块,他们的释原创 2021-07-03 12:59:51 · 226 阅读 · 0 评论 -
C++知识点打结(一)
C++知识点打结(一)1. 类初始化过程2. 数组地址3. 进制4. 正则表达式匹配符5. strlen & sizeof6. 继承7. 打印时格式化字符串8. 浮点数9. 友元10. Char1. 类初始化过程类的初始化过程也就是方法执行的过程。父类的静态域-子类的静态域 父类的非静态域-父类的构造函数 子类的非静态域-子类的构造函数 规律就是 父类先于子类 静态的先于非静态的其中静态域包含静态代码块与静态方法,这个谁在前面,则先执行谁。构造函数先调用基类的,再调用派生类的,析构函数相反原创 2021-07-03 12:59:31 · 336 阅读 · 0 评论 -
牛客网刷题-验证IPv4 或 IPv6 地址
题目编写一个函数来验证输入的字符串是否是有效的 IPv4 或 IPv6 地址IPv4 地址由十进制数和点来表示,每个地址包含4个十进制数,其范围为 0 - 255, 用(".")分割。比如,172.16.254.1;同时,IPv4 地址内的数不会以 0 开头。比如,地址 172.16.254.01 是不合法的。IPv6 地址由8组16进制的数字来表示,每组表示 16 比特。这些组数字通过 (":")分割。比如, 2001:0db8:85a3:0000:0000:8a2e:0370:7334 是一原创 2021-04-12 22:56:37 · 356 阅读 · 0 评论 -
[Leetcode] 2-3-4-5-8-13
Leetcode 刷题213. 罗马数字转整数方法一 比较当前字符,并获取下一位字符方法一改进 GetValue方法中,判断下一位字符时,直接取值,并修改iPos的值方法二 可使用map,直接将可搭配的组合写入map中,然后根据前后字符查找即可,但须开辟额外空间。2. 两数相加思路 每次相加需要记录进位carry3. 无重复字符的最长子串方法一 创建一个vector,记录每次不重复的字符串方法二 每次通过iLeft和iRight记录不重复字符串左右索引4. 寻找两个正序数组的中位数方法 先判断总个数为奇数还原创 2021-04-07 01:21:13 · 154 阅读 · 0 评论 -
[Leetcode] 6 Z 字形变换
[Leetcode] Z 字形变换题目描述解法一改进解法一官方解答题目描述解法一class Solution {public:string convert(string s, int numRows) { int iSize = s.size(); string sOutput; if (s == "" || iSize == 1 || numRows == 1) return s; int iWidth = 2 * numRows - 2; vector<string>原创 2021-03-31 10:19:31 · 88 阅读 · 0 评论 -
刷题一道
题目描述/*****某产品包含若干模块,当前只在一个机器上采用串行的方式编译模块。该产品想对编译时长进行优化,通过采购新的机器,让不同模块可以并发编译,以提升构建效率。某些模块之间会存在依赖关系,被依赖的模块必须优先编译,且存在依赖关系的必须放置在同一台机器上进行编译。问,在已知所有单个模块的编译时长,以及模块间的依赖关系的条件下,并发后的构建时长是多少?示例:模块使用大写字母表示,最多26个,且不重复模块ID 编译时长A 5B 2C 4D 1E原创 2021-03-28 23:10:12 · 121 阅读 · 0 评论 -
牛客网刷题
牛客网刷题1 随机数2.取近似值3.字符串排序4.求int型正整数在内存中存储时1的个数5.简单密码破解6.字符串排序7.成绩排序1 随机数#include<iostream>#include<algorithm>#include<vector>#include<set>using namespace std;int main(){ int iCount = 0; while(cin >> iCount)原创 2021-03-17 17:22:20 · 209 阅读 · 0 评论