![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
无边界ROS2
精通python、c语言、c++,研究ROS1、ROS2.
展开
-
在C++中,关于多态的深度理解与多态编程习惯的应用思考
我在代码中定义了一个Animal基类,包含了动物的基本属性和方法,并且声明了纯虚函数,表示该函数在基类中没有具体实现,需要在派生类中进行实现。然后定义了几个派生类,包括Lion(狮子)、Elephant(大象)和Dolphin(海豚),这些派生类继承了Animal基类,并且实现了基类中的纯虚函数。然后定义了一个Smart_pointer类作为智能指针的实现,该类包含了一个Animal类型的指针成员变量,并且在析构函数中进行了delete操作。智能指针的作用是在对象使用完毕后自动释放内存,避免内存泄漏。原创 2024-06-14 18:29:24 · 1030 阅读 · 0 评论 -
在C++中占位符的作用
这样的好处是,我们可以使用同一个函数模板来处理不同类型的参数,而不需要为每种类型都编写一个单独的函数。占位符的作用是在定义函数模板时,表示可以接受任意类型的参数。通过在函数调用时指定模板参数,我们可以告诉编译器需要实例化的具体类型。在C++中,占位符通常用于函数的参数列表中,用于表示某个参数暂时不需要使用或者待补充。函数时,编译器会根据指定的模板参数生成相应的函数模板实例。是一个占位符,表示可以接受任意类型的参数。在上面的代码中,我们定义了一个函数模板。函数中,我们分别使用。原创 2024-07-09 10:09:42 · 247 阅读 · 0 评论 -
C++中常用集合算法
return 目标容器的最后一个元素的迭代器地址。@return 目标容器的最后一个元素的迭代器地址。@return 目标容器的最后一个元素的迭代器地址。@param dest 目标容器开始迭代器。@param dest 目标容器开始迭代器。@param dest 目标容器开始迭代器。@param beg1 容器1开始迭代器。@param beg2 容器2开始迭代器。@param beg1 容器1开始迭代器。@param beg2 容器2开始迭代器。@param beg1 容器1开始迭代器。原创 2024-06-25 15:50:35 · 671 阅读 · 0 评论 -
C++中常用算数生成算法
accumulate算法 计算容器元素累计总和。@param beg 容器开始迭代器。@param end 容器结束迭代器。@param beg 容器开始迭代器。@param end 容器结束迭代器。@param value t填充元素。@param value累加值。fill算法 向容器中添加元素。原创 2024-06-25 15:06:41 · 152 阅读 · 0 评论 -
C++中常用拷贝和替换算法
C++中常用拷贝和替换算法replace:代码如下:replace_if:代码如下:swap:代码如下:原创 2024-06-25 14:34:16 · 132 阅读 · 0 评论 -
C++中常用排序算法
merge:Merge是一种合并操作,将两个或多个相同或不同的数据集合并成一个。原创 2024-06-25 14:05:04 · 142 阅读 · 0 评论 -
C++中常用查找算法
上面因为自定义类型里面的值有不同的组合,所以需要重载 == ,而且重载内传入的形参需要加上const。我在代码定义了两个类num_1和num_2,其中num_1类有两个成员变量name和age,并且重载了==运算符用于比较两个num_1对象是否相等。num_2类继承自binary_function类,并且重载了()运算符用于比较两个num_1指针是否相等。在main函数中,创建了四个num_1对象,并将其指针存入vector容器v中。原创 2024-06-25 11:34:19 · 223 阅读 · 0 评论 -
C++用遍历算法
算法主要是由头文件 组成。是所有STL头文件中最大的一个,其中常用的功能涉及到比较,交换,查找,遍历,复制,修改,反转,排序,合并等...体积很小,只包括在几个序列容器上进行的简单运算的模板函数. 定义了一些模板类,用以声明函数对象。原创 2024-06-25 09:57:24 · 389 阅读 · 0 评论 -
自定义类适配器
接下来,使用for_each和适配器函数mem_fun_ref调用num_1类的成员函数ss打印姓名和年龄,并使用成员函数addAge增加每个对象的年龄。在主函数中,创建了一个存储num_1对象的vector,并向其中添加了三个num_1对象。然后,使用for_each和适配器函数num_2,打印每个num_1对象的姓名和年龄。适配器函数mem_fun_ref是一个成员函数适配器,用于调用num_1类的成员函数ss和addAge。适配器函数num_2是一个回调函数,用于打印每个num_1对象的姓名和年龄。原创 2024-06-24 17:09:29 · 156 阅读 · 0 评论 -
内建函数对象
接下来,使用for_each算法,遍历v1中的所有元素,并将每个元素分别传递给num_1函数对象作为第一个参数,而num作为第二个参数进行绑定。分为:算数类函数对象,关系运算类函数对象,逻辑运算类仿函数。这些仿函数所产生的对象,用法和一般函数完全相同,当然我们还可以产生无名的临时对象来履行函数功能。要注意的是,在num_1类中,我们继承了binary_function模板类,并且指定了参数类型和返回值类型。总结一下,函数对象适配器bind2nd可以用来绑定一个参数,并将这个参数传递给函数对象的第二个参数。原创 2024-06-24 15:50:36 · 134 阅读 · 0 评论 -
函数适配器
具体来说,代码首先创建了一个vector v1,并用for循环将0到9的整数依次添加到v1中。然后,代码使用for_each函数对v1中的每个元素应用bind2nd(ptr_fun(num_1),100)。这里,bind2nd将函数指针num_1适配为一个一元函数对象,固定了第二个参数为100。最后,代码输出了每个元素与100相加的结果。总结一下,这段代码主要展示了将函数指针适配为函数对象的方法,使用了bind2nd函数和ptr_fun函数进行适配,并使用for_each函数对容器中的元素进行操作。原创 2024-06-24 16:45:27 · 203 阅读 · 0 评论 -
二元取反匹配器
在代码中,使用not1函数对bind2nd(greater(),5)进行取反操作,表示找到第一个不大于5的元素。find_if函数会返回第一个满足谓词条件的元素的迭代器,如果找不到则返回尾迭代器。此处取反后的谓词表示将元素按降序排列。for_each函数用于遍历容器中的元素,并对每个元素执行lambda表达式。总结:上面的代码展示了使用STL算法中的not1和not2函数来对一元和二元谓词进行取反操作的示例。我在代码利用STL算法中的not1和not2函数来实现对迭代器指向的元素进行取反的操作。原创 2024-06-24 16:32:00 · 143 阅读 · 0 评论 -
一元取反匹配器
我在代码涉及到了函数适配器和取反匹配器的知识点。其中,函数适配器是通过继承unary_function模板类来自定义一个函数对象类,定义了参数类型和返回值类型,并重载了()运算符。取反匹配器利用not1函数模板将一个一元谓词的结果取反,用于在算法中进行某些条件的取反判断。在上面的代码中,通过定义num_2类来实现一个一元谓词,判断一个数字是否大于5,然后利用not1函数模板将其取反,传入find_if算法中进行条件查找。如果找到了大于5的数字,则输出该数字,否则输出没有找到。原创 2024-06-24 15:59:14 · 154 阅读 · 0 评论 -
函数对象适配器
首先,在主函数中创建了一个vector v1,并填充了0到9的数字。接下来,使用for_each算法,遍历v1中的所有元素,并将每个元素分别传递给num_1函数对象作为第一个参数,而num作为第二个参数进行绑定。要注意的是,在num_1类中,我们继承了binary_function模板类,并且指定了参数类型和返回值类型。在operator()函数中,我们将传入的两个参数进行输出,并输出它们的和。总结一下,函数对象适配器bind2nd可以用来绑定一个参数,并将这个参数传递给函数对象的第二个参数。原创 2024-06-24 15:37:17 · 341 阅读 · 0 评论 -
C++中的谓词
在本例中,lambda表达式内部定义了一个匿名函数,功能与num_1函数相同,即打印元素。我在代码使用了一元谓词,即重载了()运算符的自定义类num_1作为find_if函数的参数。接下来使用for_each函数对排序后的vector容器进行遍历,其中第二个参数传入了一个函数指针num_1,表示使用该函数作为回调函数来处理每个元素。在main函数中,通过sort函数对vector容器v进行排序,第三个参数传入了一个匿名对象num_2(),表示使用该二元谓词对元素进行排序。,谓词可作为一个判断式。原创 2024-06-24 14:45:25 · 353 阅读 · 0 评论 -
函数对象(伪函数)
这样可以方便地创建可保存状态的函数对象,实现类似函数的功能。重载函数调用操作符的类,其对象常称为函数对象(function object),即它们是行为类似函数的对象,也叫仿函数(functor),其实就是重载“()”操作符,使得类对象可以像函数那样调用。分类:假定某个类有一个重载的operator(),而且重载的operator()要求获取一个参数,我们就将这个类称为。2.函数对象(仿函数)重载了”() ”操作符使得它可以像函数一样调用。1.函数对象(仿函数)是一个类,不是一个函数。原创 2024-06-24 11:47:20 · 129 阅读 · 0 评论 -
map/multimap容器
Map的特性是,所有元素都会根据元素的键值自动排序。Map所有的元素都是pair,同时拥有实值和键值,pair的第一元素被视为键值,第二元素被视为实值,map不允许两个元素有相同的键值。我们可以通过map的迭代器改变map的键值吗?答案是不行,因为map的键值关系到map元素的排列规则,任意改变map键值将会严重破坏map组织。如果想要修改元素的实值,那么是可以的。Multimap和map的操作类似,唯一区别multimap键值可重复。原创 2024-06-24 11:19:09 · 304 阅读 · 0 评论 -
set容器中排序自定义类型
我在程序使用C++中的set容器和自定义比较器实现对自定义类对象的排序和输出。通过重载mycom类的operator()函数,定义了自定义类对象的排序规则,按照年龄升序排序。然后在主函数中创建了三个num_1对象,将它们插入set容器中,并通过迭代器遍历输出了排序结果。这样可以实现对自定义类对象的按照特定规则排序。原创 2024-06-24 09:37:21 · 127 阅读 · 0 评论 -
list 容器的实际使用
list容器是一种有序集合,可以存储任意类型的元素,可以增删改查元素,支持索引操作和迭代遍历。在c++中,容器的作用大多有做数据库使用,我这里以list 容器的一个小例题为例:// 在C++ 中,使用list容器实现一个简单的待办事项列表。用户可以执行添加任务、删除任务和显示所有任务的操作。请编写一个程序,实现这些功能在编程过程中,我们应该要养成分模块化思想。原创 2024-06-23 18:34:47 · 455 阅读 · 0 评论 -
STL容器使用时机
map的使用场景:比如按ID号存储十万个用户,想要快速要通过ID查找对应的用户。的使用场景:比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。的使用场景:比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确实位置元素的移除插入。的使用场景:比如对手机游戏的个人得分记录的存储,存储要求从高分到低分的顺序排列。的使用场景:比如排队购票系统,对排队者的存储可以采用。,则头端移除时,会移动大量的数据,速度慢。原创 2024-06-23 16:47:03 · 158 阅读 · 0 评论 -
set/multiset容器
set拥有和list某些相同的性质,当对容器中的元素进行插入操作或者删除操作的时候,操作之前所有的迭代器,在操作完成之后依然有效,被删除的那个元素的迭代器必然是一个例外。Set的元素不像map那样可以同时拥有实值和键值,set的元素即是键值又是实值。由于set容器是有序的,对于每个元素的插入都需要按照一定的规则来保持有序,因此需要使用set容器中的insert函数来插入元素,而不是push_back函数。这意味着set容器中的元素是按照某种顺序排列的,并且不能有重复的元素。原创 2024-06-23 15:48:53 · 1045 阅读 · 0 评论 -
list 容器
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 相较于vector的连续线性空间,list就显得负责许多,它的好处是每次插入或者删除一个元素,就是配置或者释放一个元素的空间。因此,list对于空间的运用有绝对的精准,一点也不浪费。而且,对于任何位置的元素插入或元素的移除,list原创 2024-06-22 17:02:52 · 1008 阅读 · 0 评论 -
queue容器
这样的设计是为了提供额外的灵活性,让程序员能够查看即将被插入的元素的位置,即队尾元素。Queue所有元素的进出都必须符合”先进先出”的条件,只有queue的顶端元素,才有机会被外界取用。Queue是一种先进先出(First In First Out,FIFO)的数据结构,它有两个出口,queue容器允许从一端新增元素,从另一端移除元素。在标准的 queue 接口中,你通常只能访问队首元素(front)或向队尾(back)添加新元素,而不能直接访问队尾元素。原创 2024-06-22 08:00:00 · 334 阅读 · 0 评论 -
stack 容器
stack是一种先进后出(First In Last Out,FILO)的数据结构,它只有一个出口,形式如图所示。stack容器允许新增元素,移除元素,取得栈顶元素,但是除了最顶端外,没有任何其他方法可以存取stack的其他元素。换言之,stack不允许有遍历行为。Stack所有元素的进出都必须符合”先进后出”的条件,只有stack顶端的元素,才有机会被外界取用。Stack不提供遍历功能,也不提供迭代器。有元素推入栈的操作称为:push,将元素推出stack的操作称为pop.原创 2024-06-21 20:01:00 · 347 阅读 · 0 评论 -
deque容器
Vector容器是单向开口的连续内存空间,deque则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。Deque容器和vector容器最大的差异,一在于deque允许使用常数项时间(固定操作)对头端进行元素的插入和删除操作。原创 2024-06-21 19:31:57 · 468 阅读 · 0 评论 -
list容器中,完成列表的升序降序
使用C++的list容器,可以通过调用sort()函数来实现列表的升序排序和降序排序。sort()函数默认使用升序排序,若要实现降序排序,可以使用greater()函数作为参数。但如果类型为复杂的自定义类,则还需要自己进行 == 重载和回调函数等操作。使用list容器。放入5个人,属性有姓名、身高、体重。1、按体重的降序排列2、体重如果相同,按身高的降序排学生类里面有姓名、年龄、身高等属性。先声明好5个对象,后分别把三个对象放入list 容器。原创 2024-06-21 18:08:18 · 261 阅读 · 0 评论 -
pair对组
pair对组是指两个元素成对出现在一起的组合。这种组合常见于数据处理和算法设计中,用于处理成对的数据或执行成对的操作。原创 2024-06-21 16:10:20 · 364 阅读 · 0 评论 -
vector容器
因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个大块头的array了。Vector的实现技术,关键在于其对大小的控制以及重新配置时的数据移动效率,一旦vector旧空间满了,如果客户每新增一个元素,vector内部只是扩充一个元素的空间,实为不智,因为所谓的扩充空间(不论多大),一如刚所说,是”配置新空间-数据移动-释放旧空间”的大工程,时间成本很高,应该加入某种未雨绸缪的考虑,稍后我们便可以看到vector的空间配置策略。原创 2024-06-20 17:21:52 · 870 阅读 · 0 评论 -
string 容器
在C++,char* 类型 可以隐式的转化为 string 类型,反之,string 类型不可以隐式转换为char* 类型,只能通过.c_str()来完成。C风格字符串(以空字符结尾的字符数组)太过复杂难于掌握,不适合大程序的开发,所以C++标准库定义了一种string类,定义在头文件string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。string封装了char*,管理这个字符串,是一个char*型的容器。原创 2024-06-20 15:25:52 · 477 阅读 · 0 评论 -
string类转大、小写操作
【代码】string类转大、小写操作。原创 2024-06-20 15:25:20 · 285 阅读 · 0 评论 -
容器嵌套容器
这段代码的作用是创建一个二维vector容器v,其中嵌套了三个一维vector容器v1, v2, v3。然后利用嵌套的for循环遍历二维vector容器v的元素,并输出到屏幕上。容器嵌套容器是指在一个容器中再次嵌套另一个容器。这种嵌套可以实现多层次的数据结构,如列表中嵌套字典、字典中嵌套列表等,使用容器嵌套容器可以灵活存储和处理复杂的数据结构。原创 2024-06-20 10:39:01 · 352 阅读 · 0 评论 -
自定义类型在容器迭代器中使用
迭代器的使用:使用迭代器遍历vector中的元素,通过v.begin()获取vector的起始迭代器,v.end()获取vector的结束迭代器,然后使用循环和迭代器指针来访问vector中的元素。使用vector容器:通过#include 引入vector头文件,并声明一个vector类型的变量v来存储num_1类的对象。初始化类对象:在main函数中,创建了三个num_1类型的对象p1、p2和p3,并通过push_back函数将它们添加到vector中。原创 2024-06-20 10:03:57 · 201 阅读 · 0 评论 -
迭代器使用
迭代器(iterator)是一种抽象的设计概念,现实程序语言中并没有直接对应于这个概念的实物。在一书中提供了23中设计模式的完整描述,其中iterator模式定义如下:提供一种方法,使之能够。提供读写操作,并能以跳跃的方式访问容器的任意数据,是功能最强的迭代器。读写,支持++、--、[n]、-n、=提供读写操作,并能向前推进迭代器。提供读写操作,并能向前和向后操作。只读,支持++、==、!读写,支持++、==、!读写,支持++、--,原创 2024-06-20 09:41:02 · 298 阅读 · 0 评论 -
C++标准异常库
异常类可以通过继承exception类来自定义异常类可以包含自定义的错误信息,方便在异常处理时输出错误原因异常类的成员函数what()必须被重写,返回错误信息的char*类型在异常类的构造函数中,可以通过条件判断来抛出异常,例如判断年龄是否小于0或大于160在主函数中,可以使用try-catch块来捕获并处理抛出的异常捕获到的异常对象可以通过引用传递给catch块,然后使用e.what()来输出错误信息。原创 2024-06-19 20:35:28 · 1140 阅读 · 0 评论 -
异常类继承自exception基类
【代码】异常类继承自exception基类。原创 2024-06-19 17:34:18 · 184 阅读 · 0 评论 -
C++容器中的迭代器
我使用C++中的vector容器进行数据存储和遍历的示例。在代码中,首先创建了一个名为v的vector容器,其中存储int类型的数据。接下来,使用迭代器iterator进行遍历,通过begin和end函数获取容器的起始和结束迭代器。使用while循环和迭代器逐个输出容器中的数据。总结代码技术点是使用vector进行数据存储和遍历的基本操作,以及使用迭代器进行容器的遍历。C++容器中的迭代器是一种用于遍历容器元素的对象,它提供了访问容器中元素的能力,并支持迭代器间的算术操作和比较操作。原创 2024-06-19 17:10:30 · 165 阅读 · 0 评论 -
C++文件读写
接着使用ifstream类打开相同的文件example.txt,以读取数据的方式。如果文件无法打开,则输出错误信息并返回1。然后使用getline函数逐行读取文件中的数据,并输出到屏幕上。读取完毕后,关闭文件。在代码中,首先使用ofstream类打开文件example.txt,以写入数据的方式。如果文件无法打开,则输出错误信息并返回1。在C++中,可以使用fstream库来进行文件的读写操作。以上就是C++中进行文件读写的基本方法。操作符向文件中写入数据。写入完毕后,关闭文件。原创 2024-06-19 16:08:55 · 123 阅读 · 0 评论 -
格式化输出
C++提供了在输入输出流中使用的控制符(有的书中称为操纵符)。原创 2024-06-19 15:36:38 · 102 阅读 · 0 评论 -
C++标准输入流
缓冲区的作用是在数据处理、输入/输出和传输过程中提供临时存储的功能,以提高计算机系统的性能和效率。cin.get() //一次只能读取一个字符。cin.get(两个参数) //可以读字符串。cin.get(一个参数) //读一个字符。原创 2024-06-19 14:43:58 · 186 阅读 · 0 评论 -
异常的多态使用
我在代码主要涉及到的技术点是C++中的异常处理和多态。在异常处理方面,通过try-catch语句块,程序可以捕获并处理在try块中抛出的异常。在这段代码中,doThow()函数中抛出了num_2类型的异常对象,然后在main函数中使用catch语句捕获该异常,并通过polymorphism多态的方式调用异常类中的printError()函数进行处理。多态是面向对象程序设计中的一个重要概念,它使得子类对象可以被当做父类对象来使用。原创 2024-06-19 11:04:46 · 405 阅读 · 0 评论