c++
文章平均质量分 66
ve2102388688
这个作者很懒,什么都没留下…
展开
-
ubuntu安装系统级性能分析工具perf
系统级性能分析工具perf1 perf简介2 查看内核版本3 CLion使用1 perf简介perf是一种系统级性能分析工具,它涉及内核调用,所以安装需要知道内核版本。系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能。备注:下面的方式并不能成功,最后会提示WARNING: perf not found for ker原创 2021-10-17 18:52:12 · 2343 阅读 · 0 评论 -
笔试输入C++
C++输入1 数字类型1.1 一行中一个、两个、多个数字1.2 一行多个数字以逗号分隔1.3 一个相对完整的代码2 字符串类型2.1 cin和getline混读问题2.21 数字类型注意:下面的案例我在笔试中都遇见过,如果输入输出出现问题,那就凉了。不妨记m为矩阵行数、n为列数。1.1 一行中一个、两个、多个数字1 一行中只有一个输入5int n;cin >> n;如果有多行测试案例,可以使用while进行循环读取5// other data7// other dat原创 2021-09-06 11:44:27 · 477 阅读 · 0 评论 -
c++ cin整数以,(逗号)分割读取
1 某些场景整数流不是空格分割,如用逗号分割例如,下面的输入,要求每行是一个数组,一共两行测试输入1,2,3,45,6,7,8下面的代码就可以很好的解决问题。 vector<int> w; int temp; while (cin >> temp){ w.push_back(temp); if (cin.get() == '\n') break; }2 先谈谈cincin会根据数据的类型以及分隔符自动对数据进行输入。数据的类型:两个常见原创 2021-06-19 15:39:51 · 9618 阅读 · 0 评论 -
C++ 容器vector等中为什么尽量使用const引用
使用const引用1 无疑使用const引用是一个好习惯,除非有理由拒绝它2 看一个案例3 不改变元素一定要加上const,不需要拷贝需要加上&1 无疑使用const引用是一个好习惯,除非有理由拒绝它在C++中容器都是值拷贝的,因此不使用引用的化,会大量拷贝垃圾数据其实,可以这么说C/C++是值拷贝编程语言。不使用额外的技术,比如指针、引用,都会发生垃圾数据的拷贝。当然,到底是不是垃圾数据由你自己决定,值拷贝是无法彻底摒弃的。2 看一个案例下面是一个提交记录,注意红色方框的部分,加上引用,原创 2021-02-04 21:35:55 · 4099 阅读 · 0 评论 -
C/C++ 二进制转十进制
二进制转十进制1 代码1 代码int getDecimalValue2(vector<int>& binary) { int ans = 0; for(int i = 0; i < binary.sizze(); ++i) { ans = (ans<<1) + binary[i]; } return ans;}思路:把整个二进制串想成两部分,当前处理的这1位。前面一个整体。当然没处理的串不算哈当然,移进一位,前面的整体*2,相当于前面原创 2021-01-28 17:32:29 · 2100 阅读 · 0 评论 -
C/C++ 二维数组第一列升序,第一列相同第二列降序
二维数组排序数组排序有内置API,一般是一维的,这里分享下二维或者多维的用法1 C++ 二维数组第一列升序,第一列相同第二列降序2 C 二维数组第一列升序,第一列相同第二列降序3 更一般的思路数组排序有内置API,一般是一维的,这里分享下二维或者多维的用法下面先分享下C++的情况,C++有好几个排序API,其内部实现一般是快排,包括稳定、不稳定、部分排序等。1 C++ 二维数组第一列升序,第一列相同第二列降序这里使用sort来完成,默认是升序,不管是一维,二维,多维,没有第三个参数都是按第一列升序排原创 2021-01-22 14:43:11 · 2609 阅读 · 1 评论 -
C++ 二维vector的push_back和遍历的简单形式
二维vector1 二维vector2 遍历输出1 二维vector定义一个二维vector,怎么给它加入数据呢?其实绕个弯。vector<vector<int>> res;首先我们需要先建立一个一维的vector,紧接着push_back for (int i = 0; i < N; ++i) { vector<int> temp; for (int j = 0; j < M; ++j) { tmp.p原创 2021-01-16 20:39:37 · 6780 阅读 · 1 评论 -
leetcode 二叉树的建立、释放内存、层序遍历输出,C++
二叉树的建立、释放内存、层序遍历输出leetcode的输入案例其实是数组存储方式,这样建树很方便1 数组存储建树2 二叉树释放内存3 二叉树遍历4 测试案例leetcode的输入案例其实是数组存储方式,这样建树很方便对于上面这个案例,你可以发现,输入其实层序遍历存储在数组,这样的结果是很好建树,利用二叉树在数组中的相对关系,如下图数据结构定义:// Definition for a TreeNode.struct TreeNode { int val; TreeNode *le原创 2021-01-16 19:19:36 · 845 阅读 · 0 评论 -
leetcode 234. 回文链表 C++
回文链表解法有两种最基本的方式,空间复杂度O(n)--递归方式,空间复杂度O(1)--找中点、反序后半部分链表、比较即可。1 递归方式2 找中点、反序后半部分链表、比较即可解法有两种最基本的方式,空间复杂度O(n)–递归方式,空间复杂度O(1)–找中点、反序后半部分链表、比较即可。1 递归方式最核心基础的数据类型是数组,链表。进而组成栈、队、堆、树、图等。从链表定义来看就注定它具有递归的特点,递归是浓墨重彩的一部分。void traverse(ListNode *head){ //前序遍历原创 2021-01-14 14:39:08 · 152 阅读 · 0 评论 -
C/C++矩阵翻折与旋转
矩阵翻折与旋转二维数组就地操作,n*n2 矩阵水平翻折3 矩阵左右翻折4 矩阵主对角线翻折5 矩阵副对角线翻折7 矩阵顺时针旋转90度8 矩阵逆时针旋转90度9 自己画一个矩阵,按结论套下就懂了二维数组就地操作,n*n2 矩阵水平翻折规律:行和是n-1,行减半;列不变 for (int i = 0; i < n/2; ++i) { for (int j = 0; j < n; ++j) { swap(&matrix[i][j], &a原创 2021-01-08 17:01:01 · 1594 阅读 · 0 评论 -
C/C++二维数组分块遍历
二维数组分块遍历1 二维数组分块遍历2 简单的按行遍历,按列遍历3 分块遍历3.1 除法,求余的物理意义3.2 何为遍历?3.3 确定数组行下标3.3 确定数组列下标3.3 完整代码3.4 技巧1 二维数组分块遍历对于二维数组,默认是行遍历的(这种场景最常见),有时候也需要按列遍历,还有些时候需要按分块矩阵顺序遍历。遍历:简单地讲,将每个元素有且仅有执行一次。分块遍历,如9*9的矩阵,每3*3一块,这样划分下来只有9个大矩阵,9个大矩阵是按行遍历的。目标:按照图中所示的数字顺序遍历。2 简单的原创 2021-01-08 10:45:19 · 1435 阅读 · 2 评论 -
C/C++各种类型说明符占用存储空间,如int、long、double占用的字节数
类型说明符占用存储空间对于特定位数的机器,类型说明符占用的大小一致,下面用的C++,没有写C代码1 我的是64位机器,至于32位机器是怎么样,可以用32位机器试下2 解释3 second.cpp对于特定位数的机器,类型说明符占用的大小一致,下面用的C++,没有写C代码1 我的是64位机器,至于32位机器是怎么样,可以用32位机器试下还是看下代码吧,不然无法理解,比如,时不时有人会提到32767,又有人说int占用4字节,甚至把两者等同起来,这是错误的。结论是:32767的时代已经过时了,还是要仔细分原创 2021-01-07 11:10:08 · 1789 阅读 · 0 评论 -
C/C++如何忽略定义了但是未使用的变量
忽略定义了但是未使用的变量1 GCC编译中警告不等于错误,但有些警告所有编译器都认为是错误2 一个案例3 忽略定义了但是未使用的变量1 GCC编译中警告不等于错误,但有些警告所有编译器都认为是错误下面提及几点,明明定义了返回值,但是不返回形参、实参类型不匹配,无法进行隐式转换编译器最初会给出警告,至于是不是错误,我认为有两点主要原因编译器厂商共同约定的,某些警告就是错误程序员可以附加其他错误项,比如你就认为某个警告就是错误啦至于我们需不需要将所有的警告全部消灭,看个人和项目要求,但是原创 2021-01-06 15:25:15 · 3396 阅读 · 1 评论 -
C/C++中大小端判断
大小端判断1 什么是大端、小端?2 两种简单的方式判别大小端2.1 使用union的特性2.2 强转成char*3 指针的强大1 什么是大端、小端?整数的表示作为计算机入门的第一步,在计算机内部用0、1表示,存储顺序有两种,分别是小端、大端小端序(little-endian)是指将表示整数的低位字节存储在内存地址的低位,高位字节存储在内存地址的高位。相反大端序(big-endian)低字节存储在内存的高位。一个例子下标是一个内存地址,从0x100开始的哈2 两种简单的方式判别大小端2.1原创 2021-01-05 19:15:19 · 1206 阅读 · 0 评论 -
C/C++使用异或交换元素及固有的缺点
异或交换元素1 如何使用异或来交换元素2 扩展,一组数,只有一个数出现一次,其他数出现两次,求出现一次的这个数?3 一组数,只有一个数出现一次,其他数出现三次,求出现一次的这个数?1 如何使用异或来交换元素代码如下/** \brief swap 异或交换两元素 * \author xxx * \copyright GNU Public License * \version 1.0 * \date 2020-1-4 * * \param[原创 2021-01-04 21:25:23 · 366 阅读 · 0 评论 -
C语言中static的理解
static的理解1 如何理解static?2 加上static改变了什么?2.1 static的存储类型解释3 加上static后带来了什么优点?4 总结1 如何理解static?static在很多的地方都能看见。那么怎么准确把握它含义呢?其实我把这个问题分成两个点, 1. 加上static改变了什么?2. 加上static后带来了什么优点?2 加上static改变了什么?最容易理解的答案是:将变量私有化,即具有内部连接属性由于static作用变量的作用域不同,所有static变量细分几种原创 2021-01-04 16:33:48 · 1539 阅读 · 0 评论 -
C/C++计算复数的模长API
计算复数的模长1 复数的表达2 计算复数的模长1 复数的表达实际上,在C语言是没有复数库的,一般而言,可以定义一个结构体struct complex { double real; double imag;};而C++是有复数库#include <complex> ,它是一个模板库,在模板中一个设计思路是,先设计主模板库—Primary template之后再分别实例化—Specializations比如,这里就简单的提及下,这里只讲C哈。// Primary temp原创 2020-12-31 16:56:45 · 1874 阅读 · 0 评论 -
error: stray ‘\’ in program
编译错误1 stray ‘\’ in program2 其实根源是出在转义字符上1 stray ‘\’ in program在C/C++中,出现这个错误,第一时间会认为是在程序中输入了中文字符,因此只需要将中文字符修改即可。不错,这是正确的。2 其实根源是出在转义字符上下面是一些典型的转义字符,那么,除了规定的转义字符外,其他转义字符均是非法的,换句话说以\开头且合法的,只有规定的转义字符当然,下面的代码是非法的,错误原因就是标题。C/C++没有定义转义字符\d"\d"然而,我们的本意并不原创 2020-12-29 19:09:47 · 22743 阅读 · 1 评论 -
Boost C++ assert的用法简析
assert的用法简析1 软件验证、测试宏assert2 assert运行时断言2.1 禁用BOOST_ASSERT2.2 自定义assert?3 static_assert编译时检查4 static_assert和assert5 lightweight_test提供最基本的单元测试功能6 test组件1 软件验证、测试宏assertC/C++本身仅提供了有限的软件验证、测试宏assert,而Boost.assert库增强了assert库,包含如下的组件assert —>运行时检查st原创 2020-12-21 20:29:54 · 1202 阅读 · 0 评论 -
Boost C++测试组件test库
Boost测试组件test1 boost::test简介和基本概念二级目录三级目录1 boost::test简介和基本概念test库用于单元测试、命令行测试组件,全称Unit Test Framework(UTF)二级目录三级目录原创 2020-12-18 20:22:39 · 3139 阅读 · 3 评论 -
Boost实用工具之如何简单、高效初始化assign
这里写简单、高效初始化1 如何给容器初始化、赋值大量数据?2 list_inserter容器赋值(先创建空的,再赋值)2.1 operator,2.2 operator+=3 generic_list容器构造时填充数据1 如何给容器初始化、赋值大量数据?这个问题,其实解决办法很普通。比如,重复调用push_back()、insert()等函数,或者使用初值列语法。但是我们希望有更高效的大量数据初始化的方法assign下有两个重要的类,分别负责不同的场景list_inserter容器赋值(先创建原创 2020-12-09 14:33:53 · 384 阅读 · 1 评论 -
Boost实用工具之如何表示无效值optional
表示无效值1 在C++中如何表示无效值?231 在C++中如何表示无效值?无效值?答:可以理解成不是我们希望的值,或者说返回值是位于解空间外的值。比如,我们希望除法分母不为0,开平方不能小于0等等如何表示无效值?答:下面是我们常见的手法发现错误,就抛出异常为无效值增加“哨兵”,比如NULL23...原创 2020-12-07 20:51:24 · 694 阅读 · 0 评论 -
C++ shared_ptr用法、简析、案例
shared_ptr用法1 shared_ptr简介2 shared_ptr案例2.1 reset()的理解2.2 make_shared的理解2.3 shared_ptr中的指针转型问题2.4 shared_ptr在容器中的应用2.5 定制删除器D2.5.1 shared_ptr管理FILE文件指针2.5.2 shared_ptr管理socket2.5.3 shared_ptr 高级用法2.6 关于桥接方式--减少文件的依赖关系,减少编译时间2.7 借shared_ptr我们分享下别名构造函数原创 2020-12-04 19:46:41 · 6959 阅读 · 0 评论 -
Boost中object_pool使用案例及让construct()支持任意参数模板
object_pool使用案例1 简介Boost::object_pool1 简介Boost::object_pool原创 2020-12-04 15:15:20 · 836 阅读 · 0 评论 -
Boost内存管理总结(scoped_ptr、unique_ptr、shared_ptr、weak_ptr、intrusive_ptr、pool、object_pool、singleton_pool)
内存管理总结1 简要介绍2 思维导图1 简要介绍Boost的内存管理库,包含两部分内容,分别是smart_ptr库和pool库,其中我们熟知的shared_ptr、unique_ptr、weak_ptr早已在2011年引入C++11标准。smart_ptr库包含scoped_ptr、unique_ptr、shared_ptr、weak_ptr、intrusive_ptrpool库包含pool、object_pool、singleton_pool2 思维导图下面是Boost中内存管理思维图,包原创 2020-12-03 11:30:05 · 449 阅读 · 0 评论 -
C++ 如何缩短编译时间(Effective C++ 条款31:将文件间的编译依存关系降至最低)
Effective C++ 条款311 目的:如何真正的缩短编译时间?1.1 如何降低文件的耦合度?2 技术1:运用Handle Class技术降低接口和实现的耦合性2.1 提出问题:耦合性的来源?3 技术2:运用Interface Class技术降低接口和实现的耦合性1 目的:如何真正的缩短编译时间?写之前,关于Effective C++ 条款31你可以搜索到很多文章,现在我得换个方式叙述,抄书没有太大意义。答:我相信能真正缩短编译时间的方法,只能从代码耦合方面做文章。而不是一些奇淫巧计。因为我们经原创 2020-12-01 15:26:29 · 1113 阅读 · 10 评论 -
C++ std::swap的设计方法与规则简析
swap1 很高兴分享,上一节遗留下swap问题2 缺省的内置std::swap的问题?3 pimpl手法下的类(模板)提高swap的速率4 分析weak_ptr中swap4.1 开始的时候为什么不调用std::swap?4.2 STEP3和STEP4调用的swap该如何理解呢?4.3 STEP3为什么要明确指定std::swap?4.4 再谈第一步STEP1?5 结论1 很高兴分享,上一节遗留下swap问题下面就简单分享下自己的想法,更详细的可以参考更专业的书籍。2 缺省的内置std::swap的问原创 2020-11-26 19:01:29 · 2131 阅读 · 0 评论 -
C++ weak_ptr用法和简析(最后是Boost对应的源码,我会提及一些哈)
weak_ptr用法1 weak_ptr简介2 weak_ptr使用模板3 weak_ptr打破循环引用1 weak_ptr简介weak_ptr是为了配合shared_ptr而引入的智能指针,作用:弥补shared_ptr的不足,解决循环引用的问题weak_ptr只是一个辅助,当然能力就很弱啦,不具有普通指针的功能,如解引用*和箭头运算符->作为一个旁观者,只能观察,构造和析构都不会改变引用计数器值行为也像一个软连接(快捷方式),如果真正的被删了,那么weak_ptr就失效了(快捷方式无效原创 2020-11-25 20:21:02 · 1290 阅读 · 1 评论 -
Boost中intrusive_ptr使用案例
intrusive_ptr使用案例1 简介Boost::intrusive_ptr2 Demo13 Demo 24 内部部分API简要的实现1 简介Boost::intrusive_ptr总体上讲:Boost::intrusive_ptr和shared_ptr功能上几乎是一致,唯一不同的是,计数器递增、递减可以由用户自定义。// 递增计数器,注意:函数名是内置,必须写这个名字!!!void intrusive_ptr_add_ref(T *p).// 递减计数器,注意:函数名是内置,必须写这个名原创 2020-11-25 19:24:19 · 633 阅读 · 0 评论 -
Boost 时间和日期总结
时间和日期总结1 今天分享Boost库关于时间和日期的相关知识1 下面是我自己做的思维导图,希望能帮助你1 今天分享Boost库关于时间和日期的相关知识Boost时间和日期库有两大核心,第二部分是核心boost::timer : 适合要求不高的计时场景。最高精度和操作系统有关date_time : 适合绝大部分任务需求,里面又分两个核心:日期(gregorian)+时间(posix_time)。其实还有一个local_time(处理全世界各地时间,这里就不提了)1 下面是我自己做的思维导图,希原创 2020-11-21 20:13:02 · 433 阅读 · 1 评论 -
float/double在内存中的格式,分享下IEEE 754规则
IEEE 754规则1 今天有空和大家分享下IEEE 754标准,同时解释下我们所谓的”精度“表达2 内存中是如何让布局的呢?3 验证结论4 一些解释4.1 疑问1:为什么把32位浮点数转成unsigned int*呢?4.2 疑问2:所谓的float有8位有效数字,怎么算的?4.3 疑问2:所谓的float的小数位数是6位,怎么算的?5 总结1 今天有空和大家分享下IEEE 754标准,同时解释下我们所谓的”精度“表达我会讲的很细,因为我觉得很多人都没有细究,哈哈。我们先看一个例子,下面是十进制的原创 2020-11-20 21:42:49 · 1656 阅读 · 1 评论 -
利用Boost库实现高精度计时器(1us)
Boost库实现高精度时间1 关于Boost2 一个特别之处3 高精度计时器4 简析1 关于BoostBoost库代表C++语言最新、最前沿的技术;C++中语言特性有2/3来自BoostBoost组件有很高的工业强度,甚至超过大多数商业产品Boost可以用于任何用途,鼓励商业,非商业用途,不受任何限制2 一个特别之处Boost库没有传统的.cpp和.h,特使用.hpp,是不需要链接的,直接把头文件放入工程就可以编译使用了。不再需要考虑动态库的问题。当然还有少部分是需要链接的。3 高精度计时原创 2020-11-20 19:39:16 · 1033 阅读 · 0 评论 -
C++ 使用new分配二维数组的一些想法和建议
C++ new二维数组1 如何理解一个二维数组 int a[m][n]?2 由m个一维数组组成3 二维数组其实就是一个一维数组3 如何选择这两种方式?1 如何理解一个二维数组 int a[m][n]?我觉得有两种很自然的想法。由m个一维数组组成二维数组其实就是一个一维数组。上面两种方式并不矛盾,展现了二维数组在内存中的组织形式。下面分析我们经常看到的两种写法。2 由m个一维数组组成我相信这个代码,大家都经常用,尤其在使用C语言(malloc/free)的时候。下面简要的分析下流程。原创 2020-11-19 15:50:46 · 1583 阅读 · 0 评论 -
C++ shared_ptr使用动态数组(std::shared_ptr and std::weak_ptr with array support)
目录1 看C++ standard书时,书上写shared_ptr还不支持动态数组,但是我的编译器却编译通过了,这让我感到很奇怪?2 结论:书上的说法没有错,但是随着标准越来越新,现在都有C++20的标准了,所以用最新的编译器没有问题,下面看看具体缘由。3 shared_ptr使用动态数组4 C++编译器支持及版本要求5 C++在线编译器6 make_shared()对数组的支持7 编译器不满足有其他解决办法1 看C++ standard书时,书上写shared_ptr还不支持动态数组,但是我的编译器却编原创 2020-09-12 13:04:26 · 8528 阅读 · 2 评论 -
如何让指针8字节读取?下一个地址偏移到底是多少?
目录1 一个指针占几个字节?2 8字节读取指针地址3 create-返回内部创建的数组首地址4 process-使用create创建的数组进行其他工作1 一个指针占几个字节?我觉得最好的答案是:自己用编译器测试。总体来说和操作系统位数有关,可以用下面的两句话概括。一个指针在32位操作系统上,占4个字节。一个指针在64位操作系统上,占8个字节。我用vs2019测试,x86都是字节,x64都是8字节。std::cout << sizeof(int*) << " " <原创 2020-08-10 15:54:18 · 2993 阅读 · 0 评论 -
vs2017/2019 不允许使用不完整的类型
1 在vs中出现这个问题,有可能是缺少头文件!2 下面是我遇到的一个问题,就是std::array的头文件没加出现的错误#include <array>std::array<float, std::numeric_limits<short>::max()> a5;3 若还有其他原因导致这个错误,可以留言。...原创 2020-08-01 18:28:28 · 6482 阅读 · 1 评论 -
C++ gflags的使用及注意事项(附一个demo)
目录1 gflags的简介2 头文件及内置类型2.1 头文件2.2 内置类型3 访问变量及参数合法性校验3.1 访问参数3.2 参数合法性校验4 参数解析5 输出及总结5.1 输出5.2 总结6 编译的注意事项6.1 编译1 gflags的简介gflags的全称(formerly Google Commandline Flags),开发者是Google。命令行参数中占有绝对的优势,开源使用很方便。网上有很多参考资料,大部分是基于官方的How To Use gflags (formerly Google原创 2020-07-24 16:59:47 · 4651 阅读 · 0 评论 -
C++ string大小写转换
这里写目录标题1 问题来源2 解决1 问题来源把一个string转换成大写或者小写,是项目中经常需要做的事情,但string类里并没有提供这个方法。2 解决通过C++库函数transform()可以很容易解决。下面是vc中的定义,可能有些不同,实际上都是一样的。参数分别是:输入string的开始,输入string的结束,输出string的开始,转换函数_CONSTEXPR20 _OutIt transform(const _InIt _First, const _InIt _Last, _Ou原创 2020-07-24 14:12:05 · 764 阅读 · 0 评论 -
vs编译器LNK2019无法解析的外部符号 关于inline
链接器工具LNK2019有很多原因造成的,这里是由于inline导致的。1 inline可以看做宏展开,在编译的时候完成的,与调用函数不一致,内联函数增加代码段的长度,而省去了调用函数时花费的时间。2 inline在类中有两种形式-显式和隐式,隐式直接将定义写在类中,显式将定义写在类的外面。下面就是隐式内联,这种写法不会有问题。3 显式内联直接写在对应的文件夹末尾即可。一般而言,inli...原创 2020-02-06 16:19:13 · 879 阅读 · 0 评论 -
const关键字的浅显理解
目录1 const的含义2 const常见的修饰2.1 修饰普通变量2.2 修饰数组2.3 修饰指针--const在*右边修饰指针,在左边修饰变量3 const的使用地方4 一个问题?const修饰的变量是真正的只读吗?5 const帮助程序员提前发现问题,避免不该修改的值被意外地修改1 const的含义const是constant的简写,是不变的意思,用来限定一个变量为只读(Read-onl...原创 2019-11-03 19:44:08 · 251 阅读 · 0 评论