C++
文章平均质量分 78
Cc1924
这个作者很懒,什么都没留下…
展开
-
C++基础第9章:序列与关联容器(2)——序列容器
array不支持增加和删除vector在内存中连续存储list基于链表,在内存中不是连续存储dequevector和list的折中,分为很多段,每一段都是连续存储的,不同段之间使用链表来链接提供了对字符串的专门支持。...原创 2022-07-26 11:41:34 · 408 阅读 · 0 评论 -
C++基础第9章:序列与关联容器(1)——容器概述
有多种算法可以实现容器比如关联容器在C++中有等,而其他语言比如python就是一个dictionary,这个本质原因是不同类型的关联容器其特点不一样,有的可能善于索引,有的可能善于增删,所以C++为了提升性能才使用了不同的容器。获取迭代器使用得到的是反向迭代器,也就是相当于把原来的容器反向,然后再从头到尾遍历。迭代器分类迭代器本质上是为了模拟和指针一样的操作,比如指针++、指针–、指针+3等操作,但是并不是所有的迭代器都支持这些操作,按照操作的不同,迭代器可以分为以下五类。https。...原创 2022-07-26 10:29:58 · 228 阅读 · 0 评论 -
C++基础第8章:动态内存管理(2)——智能指针、动态内存中的一些问题
智能指针引入目的使用new/delete内存的所有权不清晰。如下代码所示,可以在函数外销毁指针,也可以在函数内销毁指针,从而造成了内存所有权不清晰的情况。本质上是因为new/delete是非常紧密的两个操作,但是被我们认为分开了。//1.在函数外销毁指针int*fun(){//这个指针只能在fun函数外销毁了}//2.在函数内部销毁,如下静态内存,是在fun析构的时候被自动释放int*fun(){//这个指针不能在fun函数外手动delete}智能指针。......原创 2022-07-25 13:18:57 · 491 阅读 · 0 评论 -
C++基础第8章:动态内存管理(1)——动态内存基础
代码】C++基础第8章动态内存管理(1)——动态内存基础。原创 2022-07-25 11:24:27 · 234 阅读 · 0 评论 -
C++基础第7章:IO Stream(3)——流的状态、流的定位、流的同步
可以实现每次输出后自动同步,从字面上理解这个操作符就是把输出流的缓冲区大小设置成1,所以这样只要一往缓冲区写入内容就会输出。这样的好处是在操作流的时候会刷新它绑定的输出流,从而保证输出流的内容可以被显示。,因为它是标准错误输出,信息非常重要,一旦有错误就要及时输出。默认有缓冲区,因为他是标准输出,信息没有那么重要;的缓冲区一定可以被刷新,也就是内容一定可以显示。同步的使用较少,可以不用特别关注。默认没有缓冲区,也就是设置成了。...原创 2022-07-24 23:39:08 · 579 阅读 · 0 评论 -
C++基础第7章:IO Stream(2)——文件与内存操作
注意ifstream就是,ofstream就是,因为char类型的更加常用,所以C++中直接就使用char类型实例化了这种模板,并且命名为ifstream和ofstream。简单的实例注意使用文件流对象需要包含头文件。#include#include//文件流头文件#includeintmain(){//1.输出流,向文件中输出内容std//这里和std解释文件流的状态string流IO当使用。...原创 2022-07-24 22:24:14 · 1032 阅读 · 0 评论 -
C++基础第7章:IO Stream(1)——概述、输入与输出
流式IO底层是字符,也就是说输出是没有结构信息的。记录IO比如数据库的记录列表,它可以同时记录名称、数量等各种结构化的信息,所以它是一种更高层次的IO。由于C++是底层语言,所以是流式IO,可以在此基础上引入结构信息。所处理的两个主要问题表示形式的变换格式化(输出)或解析(输入)数据的内部表示与字符序列之间的转换,比如cout......原创 2022-07-24 20:22:37 · 349 阅读 · 0 评论 -
C++基础第6章:函数(3)——函数重载、重载解析、函数其他内容
2.重载解析(广义重载解析,包含很多步骤)2.1.名称查找2.1.1.限定查找与非限定查找2.1.1.1.限定查找限定从全局域查找,限定从查找。内容太多,见下一篇博客:C++基础第6章:函数(3.1)——函数其他内容:内联函数...原创 2022-07-13 16:47:13 · 262 阅读 · 0 评论 -
C++基础第6章:函数(3.1)——函数其他内容:内联函数、函数指针
为什么需要内联()?考虑如下的程序结构:这种程序结构存在的问题是在翻译单元2中调用的函数实现非常简单,但是由于它是在另一个翻译单元中被定义的,所以我们只能进行函数调用,这样就会设置堆栈开销,对程序性能不利。为了提升性能,我们可以把函数的定义放到一个翻译单元中,于是程序变成如下形式。为什么这样就可以提升性能呢?因为此时编译器会判断函数的逻辑,发现其逻辑非常简单,所以有可能会把函数在它被调用的地方进行展开,从而省去调用函数的队堆栈开销,对函数内部逻辑就地执行。注意:1.2.2中的方法把函数放到调用它的那个翻原创 2022-07-13 16:46:04 · 361 阅读 · 0 评论 -
C++基础第6章:函数(2)——函数体、函数返回类型
另外,C++17对返回临时对象的强制优化,其实就是把上面的返回值优化进行强制实施,因为C++17之前不同的编译器优化与否不一定,但是C++17中标准就确定一定要优化。临时对象:2.函数返回类型原创 2022-07-13 14:37:51 · 627 阅读 · 0 评论 -
C++基础第6章:函数(1)——函数基础、函数参数
2.函数参数形参名称变换不会引入不同的函数版本:意思就是函数重载是看返回值类型、函数名称、参数类型,而不会去看参数名称,因为参数名称只是决定了在函数内部如何访问这些参数,对函数的定义并没有影响。实参到形参的拷贝求值顺序不确定,和编译器有关,是编译期间决定的,不是运行期间。如下代码,传入z和y的时候,先给y拷贝赋值还是先给z拷贝赋值是不确定的,是和编译器有关的。C++17标准规定会强制省略复制临时对象,如下所示:函数传值、传址、传引用:注意如何理解,这三种方式本质上都是拷贝构造,只不过拷贝的内容不同。原创 2022-07-13 13:47:52 · 248 阅读 · 0 评论 -
C++基础第5章:语句(2)——基于范围的for循环、语句的综合应用(达夫设备)
注意解释中,是一个万能引用(),一般来说写都是右值引用,但是这里如果前面有的话则是万能引用。万能引用在推导的时候会推导出具体的引用类型,有可能是左值引用,也有可能是右值引用。C++17之前的推导(例如这里使用C++11):C++17的推导:C++20的推导:感觉不会用到,实际上明白C++17之前的原理就足够使用了。上面的程序使用万能引用完整的翻译如下:...............原创 2022-07-12 00:30:41 · 295 阅读 · 0 评论 -
C++基础第5章:语句(1)——语句基础、分支语句、循环语句
分支预测错误可能导致执行性能降低:这个是硬件上为了提高分支语句的执行效率而设计的,也就是在判断分支条件的时候先预测一个可能执行的分支先执行,然后等分支条件判断出来之再确定到底执行哪个分支(如果分支预测对了那么就可以提升性能,预测错了可能会降低性能)。...原创 2022-07-12 00:30:25 · 184 阅读 · 0 评论 -
C++基础第4章:表达式基础(2)——类型转换、算数操作符
另外可以实现把任何类型的指针转换成,这种用法一般是在C语言中使用,实际的目的就是为了实现函数重载。而C++中本身就有函数重载的功能,保留这个功能只是为了和C语言兼容。:程序运行期执行,和类的使用相关。它性能不高,因为是在运行期执行的,但是正是因为在程序的运行期执行,所以它比更加安全。:改变变量的常量性,比如把const转换成非const,或者把非const变成const但是注意的使用还是非常危险的,可能带来程序的不确定性::重新解释类型,把内存中的一段空间强行的解释为另一种类型。比如把类型的的内原创 2022-07-09 17:25:09 · 250 阅读 · 0 评论 -
C++基础第4章:表达式基础(1)——引入、左值和右值
注意左值和右值的概念是相对于赋值表达式的来说的,对于一个对象或者数值,不能说它是左值还是右值,就没有这种说法。而是应该把这个对象或者数值带入到复制表达式中,说它在这个表达式中是左值还是右值。2.2.C++中各种左值和右值的概念首先明确,下面所说的求值的概念并不是通常所说的把变量的值是多少拿出来,而更像是确定某个量的本质是什么;比如对泛左值求值,得到的是它所关联的那块内存;对纯右值求值,得到的可能就是某个运算符的操作数。2.3.理解左值和右值左值首先是一个泛左值,也就是它是表达一个对象,绑定一块内原创 2022-07-09 16:08:13 · 525 阅读 · 0 评论 -
C++基础第3章:数组、vector与字符串(3)——vector、string
也就是说,首先是一个类,其次是一个模板类,也就是传入不同的模板参数,可以得到不同的类。C/C++为了性能考虑对内建数组的很多行为进行了限制,比如不允许数组的复制。而为了易用性牺牲了一部分性能,允许复制。其次vector可以在运行期间改变元素个数,这个对于内建数组是不支持的,内建数组的大小在编译期间就确定了。1.3.构造与初始化聚合初始化:因为在语言的发展过程中是先出现了内建数组,后来出现了,因此为了保证和内建数组一些特性相同,有聚合初始化的方式。其他初始化方式缺省初始化:vector是一原创 2022-07-08 14:51:14 · 1105 阅读 · 0 评论 -
C++基础第3章:数组、vector与字符串(2)——数组其他操作、C字符串、多维数组
1.2.访问数组元素基于元素个数:for循环,最常见的方式基于©begin/©end:基于起止指针,比较规范基于range-based for循环:其实就是语法糖,本质和2中使用起止指针是一样的2.C字符串C字符串本质上就是字符数组字符串就是,即null结尾的字符串。 其引入的本质就是为了访问字符串的方便,因为只有引入了结尾的结束字符,才知道字符串到哪里结束。C语言提供了和C字符串有关的函数,需要包括头文件3.多维数组多维数组本质上是一维数组,虽然对于二维数组可以理解成矩原创 2022-07-07 19:38:06 · 292 阅读 · 0 评论 -
C++基础第3章:数组、vector与字符串(1)——数组到指针
数组是具有特定的类型的,比如,它的类型就是。注意这样看起来定义有些奇怪,但是背后的定义就是这样的。此外注意类型和类型是两种类型,虽然他们的尺寸是一样的,但是变量除了尺寸之外, 还有支持的操作,而二者支持的操作就是不同的。比如有的操作,但是就没有这种操作。注意在定义数组的时候,数组的长度必须是一个字面量 或者 常量表达式,而不能是一个变量,也就是说数组的长度必须是一个在编译期间就知道的量,而不能是一个在运行期间在知道的量 。尽管在C语言中定义变量数组在C99标准中是可以的,而且在C++的有的编译器中保留了C原创 2022-07-07 16:44:17 · 614 阅读 · 0 评论 -
C++基础第2章:对象与基本类型(3)——类型别名与类型自动推导/域与对象的生命周期
比如这种类型别名,它并不是一个新的类型,而是某种类型的别名。但是它一定是的类型,只不过长度不一样,有可能是,也有可能是,它是和具体的平台有关的,但是总之它所表示的类型返回一定是能够访问整个内存的。所以这个变量存在的意义就是为了防止定义变量的范围太小,不能足够访问整个内存。因此通常在for循环中使用是更加规范的一种方式。另外同样的类型别名还有,这个与恰好相反,它是指定了在不同的机器平台上,类型的尺寸必须是32位,所以它可能是int类型,也有可能是long类型。引入类型别名有两种方式,主要二者写法有所不同。是原创 2022-07-02 20:21:57 · 280 阅读 · 0 评论 -
C++基础第2章:对象与基本类型(2)——指针、引用/常量、常量表达式
注意 :既然指针具有相同的尺寸,为什么还要区分不同类型的指针呢?比如,这是因为指针中存储的是一个内存地址,内存地址的长度都是一样的,所以指针是具有相同的尺寸的。但是它存储的内存地址存储的变量是具有类型的,我们只是得到了这个变量的首地址,并不知道这个变量的尺寸,这样就无法访问这个变量了。比如要从内存地址开始访问4个字节,从内存地址开始访问一个字节。所以指针类型就是规定了指针所指向对象的长度。注意:对和的理解可以这样看:对其解引用的话,得到的就是,因此这个指针所指向的内容是一个常量,是不能改的。原创 2022-07-02 16:58:48 · 340 阅读 · 0 评论 -
C++基础第2章:对象与基本类型(1)——对象、值、变量的类型/隐式类型转换
另外注意:原创 2022-07-01 18:11:20 · 200 阅读 · 0 评论 -
C++基础第1章:C++初探——main函数、系统IO
函数:一段能被反复调用的代码,可以接收输入,进行处理并(或)产生输出– 返回类型:表示了函数返回结果的类型,可以为 void– 函数名:用于函数调用– 形参列表:表示函数接收的参数类型,可以为空,可以为 void ,可以无形参。– 函数体:具体的执行逻辑main 函数:特殊的函数,作为整个程序的入口– 返回类型为 int ,表示程序的返回值,通常使用 0 来表示正常返回。– 形参列表有两种形式:2.系统IO2.1.iostreamiostream :标准库所提供的 IO 接口,用于与用户交互原创 2022-06-30 18:59:23 · 187 阅读 · 0 评论 -
C++基础第0章:C++介绍——什么是C++/编译链接模型
C++原创 2022-06-30 11:52:03 · 144 阅读 · 0 评论 -
shell脚本一些便捷操作
文章目录1.命令缩写2.打开ros功能包自动刷新环境变量3.shell脚本运行多个launch文件1.命令缩写编辑~/.zshrc文件,添加如下内容:alias clc='clear' alias llh='ls -lah'alias sdev='source ./devel/setup.zsh'alias szsh='source ~/.zshrc'alias gzsh='gedit ~/.zshrc'2.打开ros功能包自动刷新环境变量补充:3.shell脚本运行多个launc原创 2022-05-16 19:40:48 · 416 阅读 · 0 评论 -
ros节点启动挂掉使用gdb调试——访问未初始化的内存错误
文章目录1.问题2.gdb调试定位错误3.问题解决1.问题在ros节点启动的时候,如果节点运行出问题会报错process has died,然后还会打印log日志,但是这个日志基本没什么用,里面一般不会打印哪个文件或者运行到哪出错误了,所以无法用于调试。实际比较快的定位错误还是要使用gdb。2.gdb调试定位错误首先重新编译程序,把Release模式改成Debug模式。然后要根据运行的打印输出初步判断有可能是哪个节点出错,然后在运行这个节点的时候使用gdb在运行这个可能出错的节点的时候使用gd原创 2022-05-07 22:36:51 · 1055 阅读 · 0 评论 -
Cherno C++系列笔记24——P68~P69 虚析构函数、类型转换
文章目录1.P68 虚析构函数1.1.普通继承(没有多态)1.2.多态(基类指针指向派生类对象)2.P69 类型转换2.1.隐式类型转换和显式类型转换2.2.C风格的强制类型转换2.3.C++风格的强制类型转换2.3.1.cherno讲解2.3.1.1. static_cast2.3.1.2. reinterpret_cast2.3.1.3. dynamic_cast2.3.1.4.const_cast1.P68 虚析构函数参考:视频 笔记1.1.普通继承(没有多态)#include<iost原创 2022-04-16 13:29:42 · 368 阅读 · 0 评论 -
Cherno C++系列笔记23——P66~P67 类型双关、联合体union
文章目录1.P66 类型双关1.1.实例11.2.实例22.P67 联合体union2.1.实例12.2.实例22.2.1.使用类型双关(指针类型重解释)2.2.2.使用联合体union1.P66 类型双关参考:视频 笔记类型双关用来在C++中绕过类型系统。C++中有类型系统,当我们创建变量时必须声明整数或双精度数或类等等。C++中的类型是由编译器强制执行的,但我们可以直接访问内存。所以实际上内存双关就是我们对某个类型的内存进行另一种类型的解释,因为我们直接拿到了内存地址,可以把它解释为任意数据类型原创 2022-04-08 19:26:22 · 1476 阅读 · 0 评论 -
Cherno C++系列笔记22——P64~P65 多维数组、std::sort排序
文章目录1.P64 多维数组1.1.二维数组的内存分配和初始化1.1.1.内存分配1.1.2.初始化1.2.二维数组的内存释放1.3.三维数组1.4.尽量使用一维数组代替多维数组提高内存访问效率1.4.1.缓存命中和缓存不命中1.4.2.用一维数组代替二维数组1.P64 多维数组参考:视频 笔记1.1.二维数组的内存分配和初始化1.1.1.内存分配多维数组实际上就是数组的数组,是数组的集合,可以用指针处理数组。如下代码:#include<iostream>int main(){原创 2022-04-07 14:57:17 · 1870 阅读 · 0 评论 -
Cherno C++系列笔记21——P62~P63 线程、计时
文章目录1.P62 线程2.P63 计时1.P62 线程参考:视频 笔记使用线程类的所有东西需要thread头文件,如下代码开启一个worker线程,注意给这个类传入的参数是这个线程里要运行的函数指针,因此只传入函数名,而没有(),这就是线程工作的方式。#include<iostream>#include<thread>void DoWork(){}int main(){ std::thread worker(DoWork); //工作线程 std原创 2022-04-07 14:05:23 · 365 阅读 · 0 评论 -
Cherno C++系列笔记20——P60~P61 为什么不使用using namespace std、命名空间
文章目录1.P60 推荐不使用using namespace std2.P61 命名空间1.P60 推荐不使用using namespace std参考: 视频 笔记说起来这节的内容很简单,就是讲了使用using namespace std的话,如果两个库中有同名的函数可能会产生函数错误调用的问题。这个问题很难排查,所以Cherno建议不要使用using namespace std,他自己使用第三方库的时候都是在前面写上命名空间,而使用自己的库的时候才会使用using namespace。但是我觉原创 2022-04-07 13:19:02 · 539 阅读 · 0 评论 -
Cherno C++系列笔记19——P58~P59 函数指针、lambda表达式
文章目录1.P58 函数指针1.1.函数指针的使用举例1.2.函数指针类型的解释1.3.带参数的函数的函数指针1.4.函数指针作为变量进行调用2.P591.P58 函数指针参考:视频 笔记注意这里讲的函数指针是C语言中的原始的函数指针,现在在C++中几乎没有人使用了。但是仍然会遇到很多别人写的这种类型的代码。1.1.函数指针的使用举例函数指针是将一个函数赋值给一个变量的方法。先看下面的代码#include<iostream>void HelloWorld(){ std::co原创 2022-04-06 13:06:10 · 558 阅读 · 0 评论 -
Cherno C++系列笔记18——P55~P57 宏定义、auto关键字、静态数组std::array
文章目录1.P55 宏定义2.P561.P55 宏定义参考:视频 笔记宏定义用于函数注意宏定义的语句最后不要加;,而应该在调用的语句后面加;,因为这样更加符合语法规则(在调用的地方加;)#include<iostream>#define LOG(x) std::cout << x << std::endlint main(){ LOG("Hello"); std::cin.get();}宏定义用于控制日志输出下面的代码就是判断是否定原创 2022-04-02 17:41:44 · 993 阅读 · 0 评论 -
CMake语法之find_package
参考:Cmake之深入理解find_package()的用法参考博客写的非常好,推荐仔细看博客。另外博客中有github代码链接,可以参考代码进行理解。总结来说find_package命令有两种模式:Module模式 : cmake需要找到一个叫做Find<LibraryName>.cmake的文件。这个文件负责找到库所在的路径,为我们的项目引入头文件路径和库文件路径。cmake搜索这个文件的路径有两个,一个是cmake安装目录下的share/cmake-<version>原创 2022-04-03 19:42:08 · 1166 阅读 · 0 评论 -
Cherno C++系列笔记17——P52~P54 处理多返回值、模板、堆和栈内存的比较
文章目录1.P52 处理多返回值2.P53 模板2.1.模板函数2.2.模板类2.2.1.将数组大小作为模板参数2.2.2.将数组大小和数组类型都作为模板参数2.3.何时使用模板3.P54 堆和栈内存的比较1.P52 处理多返回值参考:视频 笔记这一节没有什么实质有用的内容,可以大致总结为处理多返回值的两大方式。一个是使用引用或者指针把多个返回值作为形参传入函数;另一个是返回的结果是一个特殊的数据结构,比如结构体、数组、元组等等。视频中主要讲解了返回结果是一种特殊数据结构的例子,包括结构体、原始数组原创 2022-04-02 16:35:31 · 677 阅读 · 0 评论 -
Cherno C++系列笔记16——P49~P51 静态库、动态库和生成静态库
文章目录0.前言1.P49 使用静态库2.P50 使用动态库3.P51生成静态库0.前言这三部分没有讲解特别多的新东西,就是说了静态库和动态库的区别。但是在动态库那里讲了有两种不同的加载方法,没有太听懂。但是感觉也不太会用到,所以这三节都没有笔记,为了博客记录完整性还是在这里列出来了。1.P49 使用静态库参考:视频 笔记2.P50 使用动态库参考:视频 笔记3.P51生成静态库参考:视频...原创 2022-04-02 14:30:25 · 369 阅读 · 0 评论 -
Cherno C++系列笔记15——P47~P48 动态数组std::vector、动态数组vector的使用优化
文章目录1.P47 动态数组 std::vector1.1.STL标准模板库1.2.std::vector1.2.1.数组的存储1.2.2.数组的访问1.2.3.数组作为参数要用引用进行传递2.P48 动态数组 std::vector 的使用优化2.1.push_back中的复制现象2.1.1.代码分析2.1.2.结果分析2.2.优化一:reserve声明数组大小避免数组扩容产生拷贝2.3.优化二:用emplace_back直接在数组内存上构造对象1.P47 动态数组 std::vector参考:视频原创 2022-04-02 13:25:39 · 996 阅读 · 0 评论 -
size_t关键字什么意思
A warning - comparison between signed and unsigned integer expressions [-Wsign-compare]的解决方法原创 2022-04-01 13:28:31 · 203 阅读 · 0 评论 -
Cherno C++系列笔记14——P44~P46 智能指针、复制与拷贝构造函数、箭头操作符
文章目录1.智能指针1.1.unique_ptr(优先使用,开销低)1.2.shared_ptr1.3.weak_ptr1.智能指针参考:视频 笔记1.1.unique_ptr(优先使用,开销低)unique_ptr是作用域指针,超出作用域时它会被销毁,然后自动调用delete。为什么叫做unique独一无二的?因为我们不能复制一个unique_ptr,因为如果复制一个unique_ptr会有两个指针,两个unique_ptr指向同一个内存块。如果其中一个死了,它会释放那段内存,而另一个uniq原创 2022-04-01 11:50:07 · 1245 阅读 · 0 评论 -
Cherno C++系列笔记13——P42~P43 this关键字、对象生存期(栈作用域生存期)
文章目录1.P42 this关键字1.1.实例11.2.实例21.3.实例31.4.实例41.5.实例52.P43 对象生存期(栈作用域生存期)2.1.变量的作用域2.2.使用栈常犯的错误2.3.栈超过作用域自动释放的好处利用2.3.1.堆上分配内存超过作用域自动释放(智能指针类的本质)2.3.2.其他应用1.P42 this关键字参考:视频 笔记this关键字是一个指向当前对象实例的指针。1.1.实例1如下代码,假设构造函数中要给类的成员变量赋值,我们可以使用成员初始化列表。但如果想在方法内部原创 2022-04-01 11:16:08 · 481 阅读 · 0 评论 -
Cherno C++系列笔记12——P40~P41 隐式转换与explicit关键字、运算符及其重载
文章目录1.P40 隐式转换于explicit关键字2.P41 运算符及其重载1.P40 隐式转换于explicit关键字参考:视频 笔记隐式转换的意思是不会明确的告诉编译器要怎么做,像是编译器通过上下文自动推导要做的事情。C++允许编译器对代码执行一次隐式转换,在两个类型之间C++允许进行隐式转换,而不需要用cast做强制转换,类型转换是将数据类型转换到另一个类型的过程。如下代码所示,由于Entity这个类有两个构造函数,分别传入stirng和int作为形参,所以就可以直接写Entity a =原创 2022-03-31 13:29:24 · 660 阅读 · 0 评论