c/c++
文章平均质量分 75
c/c++
alliiin
寄一个春天
展开
-
float、double类型的转化和判断为零问题
double精度误差在1e-15,所以要判断一个单精度浮点数:则是if( abs(f) <= 1e-6);若小于,为0,大于,不为0。一般float型只能精确到小数到后六位即1e-6,将float型的数a的绝对值abs(a)与1e-6比较,如果abs(a)比1e-6还要小的话就可以认为a的值为零,因为小数六位以后是不精确的,是没有意义的。float是32位,double是64位。float32位中,有1位符号位,8位指数位,23位尾数位。double64位中,1位符号位,11位指数位,52位尾数位。原创 2023-10-21 09:08:19 · 851 阅读 · 0 评论 -
STL算术生成和集合算法
/ beg1容器1开始选代器//end1容器1结束选代器//beg2容器2开始选代器//end2容器2结束选代器// dest目标容器开始迭代器。//beg1容器1开始选代器//end1容器1结束选代器。//求两个集合的并集// 注意:两个集合必须是有序序列。// beg开始选代器//end 结束选代器。// dest目标容器开始选代器。// beg2容器2开始选代器。//dest目标容器开始选代器。// beg2容器2开始选代器。//end2容器2结束选代器。//end2容器2结束选代器。原创 2023-09-26 19:07:17 · 388 阅读 · 0 评论 -
STL排序、拷贝和替换算法
/ 容器元素合并,并存储到另一容器中。// 按值查找元素,找到返回指定位置迭代器,找不到返回结束迭代器位置。// 按条件替换元素,满足条件的替换成指定元素。// dest目标容器开始迭代器。// beg1容器1开始迭代器。//end1 容器1结束选代器。// end2容器2结束迭代器。// oldvalue 旧元素。//beg2容器2开始选代器。//dest目标起始选代器。// 反转指定范围的元素。// 互换两个客器的元素。// beg开始选代器。// beg开始选代器。// beg开始选代器。原创 2023-09-26 16:54:12 · 262 阅读 · 0 评论 -
STL常用遍历、查找算法
算法主要是由头文件<algorithm><functional> <numeric>组成<algorithm>是所有STL头文件中最大的一个,范围涉及到比较、交换、查找、遍历操作、复制、修改等等。<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数<functiona>定义了一些模板类用以声明函数对象。原创 2023-09-26 09:15:21 · 133 阅读 · 0 评论 -
内建函数对象
template<class T> T multiplies<T>//乘法仿函数。emplate<class T> T divides<T>//除法仿函数t。template<class T> T modulus<T>//取模仿函数。template<class T> T negate<T>//取反仿函数。template<class T> T minus<T>//减法仿函数。template<class T> T plus<T>//加法仿函数。其中negate是一元运算,其他都是二元运算。原创 2023-09-24 19:29:53 · 61 阅读 · 0 评论 -
STL函数对象和谓词
函数对象在使用时,可以像普通函数那样调用,可以有参数,可以有返回值。函数对象使用重载的()时,行为类似函数调用,也叫仿函数。函数对象超出普通函数的概念,函数对象可以有自己的状态。如果operator(接受一个参数,那么叫做一元谓词。如果operator(接受两个参数,那么叫做二元谓词。重载函数调用操作符的类,其对象常称为函数对象。函数对象(仿函数)是一个类,不是一个函数。函数对象可以作为参数传递。返回bool类型的仿函数称为谓词。原创 2023-09-24 16:44:16 · 70 阅读 · 0 评论 -
stl案例二——员工分组
公司今天招聘了10个员工,10名员工进入公司之后,需要指派员工在那个部门工作员工信息有:姓名 工资组成;部门分为:策划、美术、研发随机给10名员工分配部门和工资通过multimap进行信息的插入 key(部门编号)value(员工)分部门显示员工信息。原创 2023-09-24 15:24:13 · 87 阅读 · 0 评论 -
set/multiset容器、map容器
对于自定义类型,set必须指定排序规则才能插入元素public:int age;public://年龄降序person p1("张三",20);person p2("李四",28);person p3("王五",17);it!=s.end();it++)cout <<"姓名: " << it->name<< "年龄: "<<it->age;return 0;原创 2023-09-24 14:40:37 · 69 阅读 · 0 评论 -
list容器排序案例
案例描述:将Perspn自定义数据类型进行排序,Person中属性有姓名、年龄、身高。排序规则:按照年龄进行升序,如果年龄相同按照身高进行降序。原创 2023-09-23 18:05:10 · 113 阅读 · 0 评论 -
stack栈、queue队列、list链表容器
栈的数据结构特性是:先入后出,后入先出,只能从栈顶插入、删除和访问。可将栈视为一叠盘子,最后叠上去的盘子首先被取下来,而不能从中间或底部取出盘子。队列的数据结构特性是:先进先出,允许在开头删除,在末尾插入,类似排队系统。队列容器允许从一端新增元素,从另一端移除元素队列中只有对头和队尾才可以被外界使用,因此队列不允许有遍历行为队列中进数据称为入队,出数据称为出队list是双向链表的一个泛化容器,它的数据元素可通过链表指针串接成逻辑意义上的线性表。原创 2023-09-23 17:33:00 · 176 阅读 · 0 评论 -
c++STL概述
for(;it_s!= it_e;it_s++)//对容器取* 得到的是<>里的类型。原创 2023-09-23 13:00:49 · 281 阅读 · 0 评论 -
c++异常
所谓错误是指在程序运行的过程中发生的一些异常事件(如:除 0 溢出,数组下标越界,所要读取的文件不存在,空指针,内存不足等等)中可以抛出任何类型的异常,所以我们的异常类可以不继承自标准异常,但是这样可能会导致程序混乱,尤其是当我们多人协同开发时。//2.这个例子,异常没有捕获的结果就是运行结果错的一塌糊涂,结果未知,未知的结果程序没有必要执行下去。//1.异常应该捕获,如果你捕获,可以,那么异常必须继续抛给上层函数,你不处理,不代表你的上层不处理。在自己的异常类中,可以添加自己的信息。" << endl;原创 2023-09-20 16:00:33 · 66 阅读 · 0 评论 -
c++多态
接口类只是一个功能声明,并不是功能实现,子类需要根据功能说 明定义功能实现。如果函数的调用,在编译阶段就可以确定函数的调用地址,并产生代码,就是静态多态(绝大数面向对象语言都不支持多继承,但是绝大数面向对象对象语言都支持接口的概念,抽象类:一个类如果有纯虚函数,那么这个类就是一个抽象类,抽象类不能实例化对象。子类和父类有同名的变量和函数,父类中同名的变量和函数会被隐藏。继承抽象类的子类也是一个抽象类,如果子类重写了虚函数,那么子类就不是抽象类。中没有接口的概念, 但是可以通过纯虚函数实现接口。原创 2023-09-17 10:26:39 · 356 阅读 · 2 评论 -
类和对象的基本概念
从这个案例我们应该可以体会到,属性和行为应该放在一起,一起表示一个具有属性和行为的对象。现实世界的事物所具有的共性就是每个事物都具有自身的属性,一些自身具有的行为,所以如果我。c++中结构体是可以存放函数的,也就是数据(属性)和行为是封装在一起的。类和结构体的区别在于 类对成员可以进行访问的权限控制,结构体不可以。语言中,行为和属性是分开的,那么万一调用错误,将会导致问题发生。保护的和私有的区别是 保护的子类可以访问 私有的子类不可访问。对变量的设置时的控制。类中的函数 可以直接访问类中的成员。原创 2023-09-08 08:41:32 · 81 阅读 · 0 评论 -
c++函数重载
我们现实生活中经常会碰到一些字在不同的场景下具有不同的意思,比如汉语中的多音字“重”。当我们说:“他好重啊,我都背不动”我们根据上下文意思,知道“重”在此时此地表示重量的意思。如果我们说“你怎么写了那么多重复的代码?维护性太差了!”这个地方我们知道,“重”表示重复的意思。同样一个字在不同的场景下具有不同的含义。那么在c++中也有一种类似的现象出现,同一个函数名在不同场景下可以具有不同的含义。在传统c语言中,函数名必须是唯一的,程序中不允许出现同名的函数。原创 2023-08-29 09:43:21 · 35 阅读 · 0 评论 -
c++类型转换
类型转换(cast)是将一种数据类型转换成另一种数据类型。例如,如果将一个整型值赋给一个浮点类型的变量,编译器会暗地里将其转换成浮点类型。转换是非常有用的,但是它也会带来一些问题,比如在转换指针时,我们很可能将其转换成一个比它更大的类型, 这可能会破坏其他的数据。应该小心类型转换,因为转换也就相当于对编译器说:忘记类型检查,把它看做其他的类型。一般情况下,尽量少的去使用类型转换,除非用来解决非常特殊的问题。标准c++提供了一个显示的转换的语法,来替代旧的C风格的类型转换。使用C。原创 2023-09-20 09:56:27 · 48 阅读 · 0 评论 -
c++模板
c++提供了函数模板所谓函数模板,实际上是建立一个通用函数,其函数类型和形参类型不具体 制定,用一个虚拟的类型来代表。这个通用函数就成为函数模板。凡是函数体相同的函数都可以用这个模板代替, 不必定义多个函数,只需在模板中定义一次即可。在调用函数时系统会根据实参的类型来取代模板中的虚拟类型, 从而实现不同函数的功能。c++提供两种模板机制函数模板和类模板类属类型参数化,又称参数模板总结:模板把函数或类要处理的数据类型参数化,表现为参数的多态性,成为类属。原创 2023-09-19 08:55:42 · 111 阅读 · 0 评论 -
c++继承
派生类继承基类,派生类拥有基类中全部成员变量和成员方法(除了构造和析构之外的成员方法),但是在派生 类中,继承的成员并不一定能直接访问,不同的继承方式会导致不同的访问权限。工程开发中真正意义上的多继承是几乎不被使用,因为多重继承带来的代码复杂性远多于其带来的便利,多重继 承对代码维护性上的影响是灾难性的,在设计方法上,任何多继承都可以用单继承代替。最重要的特征是代码重用,通过继承机制可以利用已有的数据类型来定义新的数据类型,新的类不仅拥有旧类 的成员,还拥有新定义的成员。Derived 派生于。原创 2023-09-16 09:27:41 · 275 阅读 · 0 评论 -
c++运算符重载
这样的限制有意义,否则,所有这些行为产生的运算符只会混淆而不是澄清寓语意。a++是先把a赋值到一个临时空间,再对a+1赋值给临时变量,等运算结束后才返回临时变量给a (参与运算的是自加之前的值)++a是先给a+1,直接对a赋值,不需要开辟临时空间(参与运算的是返回值的引用)定义重载的运算符就像定义函数,只是该函数的名字是 operator@,这里的@中所有的运算符都可以重载,但运算符重载的使用时相当受限制的。代表了被重载的运算符。将左移运算符的重载函数声明为类的友元函数 就可以访问类的成员。原创 2023-09-14 09:21:41 · 468 阅读 · 0 评论 -
c++的this指针
在c++中同一个类的不同对象,在内存中有不同的储存空间,但是成员函数在内存中只保存了一份,在调用函数处理成员数据时,this指针能保证该成员函数处理的是自己的成员数据。//p1的地址传给this指针 age赋值给了this指向的age name赋值给了this指向的name。这个const修饰的是指针 const type* const this 代表不能通过this指针去修改this指针指向对象的内容。类的成员函数默认编译器都加上了一个this指针,这个this指针指向调用该成员函数的对象。原创 2023-09-12 20:17:31 · 112 阅读 · 1 评论 -
c++成员变量和函数的储存
在c++中“数据”和“处理数据的操作(函数)”是分开存储的。类对象成员—静态成员变量不占用对象空间大小。类对象成员—普通成员函数不占用对象空间大小。类对象成员—静态成员函数不占用对象空间大小。类对象成员—普通成员变量占用对象空间大小。原创 2023-09-11 20:21:56 · 117 阅读 · 0 评论 -
explicit 关键字
或者除了第一个参数外其余参数都有默认值的多参构造。,禁止通过构造函数进行的隐式转换。的构造函数不能在隐式转换中使用。是针对单参数的构造函数。原创 2023-09-08 19:45:07 · 125 阅读 · 0 评论 -
对象的构造和析构
浅拷贝:同一类型的对象之间可以赋值,使得两个对象的成员变量的值相同,两个对象仍然是独立的两个对象,这种情况 被称为浅拷贝. 一般情况下,浅拷贝没有任何副作用,但是当类中有指针,并且指针指向动态分配的内存空间,析构函数做了动 态内存释放的处理,会导致内存问题。的使用完一个变量,没有及时清理,也会造成一定的安全问题。c++为了给我们提供这种问题的解决方案,构造函数和析构函数,这两个函数将会被编译器自动调用,完成对象初始化和对象清理工作。类中有多个对象时,构造的顺序是先构造里面的对象,再构造外面的对象。原创 2023-09-08 19:18:31 · 114 阅读 · 0 评论 -
c++默认参数和占位参数
c++中形参可以设置默认参数,设置时需要注意以下几点:如果有一个参数设置了默认参数,从这个参数往后的每一个参数都要设置默认参数函数的声明和定义出设置默认参数只能一处有实参传入则使用实参,实参没有传入使用默认参数。原创 2023-08-27 22:17:43 · 49 阅读 · 0 评论 -
c++内联函数
在c中我们经常把一些短并且执行频繁的计算写成宏了而不是函数,这样做的理由是为了执行效率,宏可以避免函数调用的开销,这些都由预处理来完成。但是在c++出现之后,使用预处理宏会出现两个问题:第一个在c中也会出现,宏看起来像一个函数调用,但是会有隐藏一些难以发现的错误。第二个问题是c++特有的,预处理器不允许访问类的成员,也就是说预处理器宏不能用作类类的成员函数。为了保持预处理宏的效率又增加安全性,而且还能像一般成员函数那样可以在类里访问自如,c++引入了内联函数(inline function)原创 2023-08-25 17:15:27 · 45 阅读 · 0 评论 -
c++中的引用
一、引用的概念引用(reference)就是C++对C语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。原类型名&别名 = 旧名int a = 10;//b就是a的别名 b和a有相同的地址b = 100;//引用一旦初始化之后不能改变引用的指向代码示例&在等号左边是起标识作用 在右边是求地址运算引用定义时必须初始化不能引用NULL函数传参中的引用:代码示例不能返回局部变量的引用 可以返回静态变量(static)的引用 静态变量不会被释放。原创 2023-08-24 10:56:00 · 39 阅读 · 0 评论 -
c++对c的扩展
一、冒号作用域::是一个作用域 如果::前面什么都没有加代表全局作用域。原创 2023-08-16 22:23:38 · 77 阅读 · 0 评论