![](https://img-blog.csdnimg.cn/c0acb6062d404e10bd230438a6065020.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++
文章平均质量分 96
C++笔记
a篇博客就溜
这个作者很懒,什么都没留下…
展开
-
<C++> 特殊类设计
这样即使在类内调用了拷贝构造函数,编译器也能在链接时检查出来 (符号表的合并与重定位失败);原创 2023-09-29 10:40:34 · 49 阅读 · 0 评论 -
<C++> 异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。//父类接口public:{}protected:int ErrId;//异常消息//子类进行继承//定义一个内存错误public:{}str += "]";return str;private://定义一个链接错误。原创 2023-09-21 18:23:07 · 27 阅读 · 0 评论 -
C++11常用小知识
C++11标准为C++编程语言的第三个官方标准,正式名叫ISO/IEC 14882:2011 - Information technology – Programming languages – C++。在正式标准发布前,原名C++0x。它将取代C++标准第二版ISO/IEC 14882:2003 - Programming languages – C++11 成为C++语言新标准。原创 2023-09-20 14:38:49 · 45 阅读 · 0 评论 -
C++11——右值引用、移动语义、完美转发、新的类功能
左值准确来说是:一个表示数据的表达式(如变量名或解引用的指针),且可以获取他的地址(取地址),可以对它进行赋值;它可以在赋值符号的左边或者右边。右值准确来说是:一个表示数据的表达式(如字面常量、函数的返回值、表达式的返回值),且不可以获取他的地址(取地址);它只能在赋值符号的右边。右值也是通常不可以改变的值。int main()// 以下的p、b、c、*p都是左值int a = 1;// a是左值,1作为普通字面量是右值// 以下几个都是常见的右值10;x + y;fmin(x, y);原创 2023-09-15 23:35:42 · 73 阅读 · 0 评论 -
<C++> 哈希的应用 —— 布隆过滤器
位图有使用起来,节省空间,并且效率高的优点。位图的缺点,只能处理整形。假如起昵称时要看一个字符串有没有被占用,用一个bit位标识。哈希解决冲突时,可以把后续同样位置冲突的元素的挂起来,形成链表。但是现在,如果要用位图存储字符串,bit位存不了指针,挂不起来,处理不了哈希冲突。如果用哈希存储又会浪费空间。布隆过滤器是一种紧凑的、巧妙的概率型数据结构,能够高效插入查询,来判断一个元素在或不在,用多个哈希函数,把一个数据映射到位图中,不仅能提高查询效率,还能节省空间。布隆过滤器的核心在于通过添加哈希函数来。原创 2023-08-30 01:55:29 · 127 阅读 · 0 评论 -
<C++> 位图
位图是一种十分特殊的数据结构,其主要依靠0和1表征状态,结合哈希的映射思想,即保证了速度,又保证了空间位图速度极快O(1)节省空间 使用粒度最细的比特位位图只能映射整型对于浮点符、字符串等数据无法做到很好的映射位图快速查找某个数据是否在一个集合中排序 + 去重求两个集合的交集、并集等操作系统中磁盘块标记。原创 2023-08-28 00:18:44 · 284 阅读 · 0 评论 -
<C++> 哈希表的完善及unordered_封装
当然,这个函数对于 const 迭代器对象 没有影响,毕竟这玩意不能被修改。在迭代器类中提供一个十分巧妙的函数,它对于 普通迭代器对象 来说,当传入的是 普通迭代器时,相当于。为了满足 不同 的需求,需要对 哈希表 的模板进行调整,让其既能适应。的错误,但如果我们不借此根治问题,后续没有出现赋值语句时,一样会报错。迭代器 的问题,两者差别很大,编译器无法自行转换。,这是不行的,为了让其能成功访问,我们可以把。迭代器,但哈希表中的迭代器相关函数返回的是。,只能向前走,不能回头,因此我们的。原创 2023-08-24 16:00:04 · 95 阅读 · 0 评论 -
<C++> 哈希及其模拟实现
如下场景,要插入22,通过哈希函数hashfunc(22) = 22%10=2计算出的地址为2,2的位置已经有数据2了,现在发生了冲突:当哈希表中存储的数据量 与 哈希表的容量 比值(负载因子)过大时,扩大哈希表的容量,并重新进行映射线性探测:因为有负载因子的存在,所以哈希表是一定有剩余空间的,当发生哈希冲突时,从冲突位置向后探测,直到找到可用位置,直到寻找到下一个空位置为止。负载因子= 存储的有效数据个数/空间的大小负载因子越大,冲突的概率越高,增删查改效率越低。原创 2023-08-22 05:37:13 · 245 阅读 · 0 评论 -
<C++> 红黑树封装map/set
修改为那么节点定义就修改为T _data;//节点的值,_data里面存的是K就传K,存的是pair就传pair{}原创 2023-08-18 00:19:02 · 86 阅读 · 0 评论 -
<C++> 红黑树
红黑树也是三叉链结构,不过它没有平衡因子,取而代之的是颜色红黑树的节点定义如下:(这里是通过枚举定义的颜色)RED,BLACK,, _kv(kv), _col(RED)// 推荐初始化为红{}原创 2023-08-12 21:36:50 · 48 阅读 · 0 评论 -
<C++> AVLTree
由于要实现AVL树的增删改查,所以定义AVL树的节点,就需要定义parent,否则插入节点时,不知道要链接到树里面哪个节点下面。int _bf;原创 2023-08-08 01:22:31 · 50 阅读 · 0 评论 -
<C++> map、set详解
sort要排序,必须支持整数比较大小,传的是迭代器,迭代器指向的数据必须要能比较大小,v里面存的是pair,需要重载pair的比较大小。sort的第3个参数是compare,要传对象,用实际对象推compare的类型,可以用仿函数比较,给sort的第3个参数传个匿名对象。(1)与map/multimap不同,map/multimap中存储的是真正的键值对<key, value>,set中只放value,但在底层实际存放的是由<value, value>构成的键值对。原创 2023-08-05 09:03:31 · 203 阅读 · 0 评论 -
<C++> 多态
多态是函数调用的多种形态,使我们调用函数更加灵活。多态分为两种:静态多态和动态多态。原创 2023-06-16 12:39:40 · 54 阅读 · 0 评论 -
<C++> 继承
继承机制是面向对象程序设计使代码可以复用的最重要的手段,该机制自动地为一个类提供来自另一个类的操作和数据结构。只需要在新类中定义已有的类中没有的成分来建立一个新类。继承是类设计层次的复用。继承包括成员变量和成员函数。如下所示,Perosn类的成员变量有_name, _age,成员函数有Print()。原创 2023-06-03 21:36:28 · 41 阅读 · 0 评论 -
<C++> 模板
class 类模板名//类内成员定义//限定了VDataType的类型只能为int型public://构造函数vector(), _size(0){}//析构函数~vector()//读写第pos个位置的元素//求数组大小//插入节点if (_a)_a = tmp;++_size;但是现在如果想借助这一份代码,让链表v1存int型数据,让另一个链表v2存double型数据,该怎样实现呢?原创 2023-05-29 12:47:18 · 45 阅读 · 0 评论 -
<C++> 反向迭代器
反向迭代器的适配只用于双向迭代器,对于实现的单向迭代器是不能通过适配构造一个反向迭代器的,为什么要说反向迭代器适配器呢?因为我们只需要实现一个反向迭代器模板就可以用所有的双向迭代器的正向实现其反向迭代器。原创 2023-05-24 21:01:30 · 308 阅读 · 0 评论 -
<C++> STL容器适配器之stack&queue&deque&priority_queue模拟实现
(1)priority_queue即优先级队列,是一种容器适配器,最大元素放在第一个。(2)底层用堆实现,默认是大堆,因为默认大的优先级高,可随时插入元素,可快速查找最大元素,即优先级队列中第一个元素。(3)优先级队列元素从特定容器的“尾部”弹出,其称为优先队列的顶部。(4)底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。容器应该可以通过随机访问迭代器访问,并支持以下操作:empty( ):检测容器是否为空size( ):返回容器中有效元素个数。原创 2023-05-22 15:51:33 · 128 阅读 · 0 评论 -
<C++>list及其模拟实现
对于T&,类模板实例化出两个类,一个是T&类,一个是const T&类,同理,T*也一样。由于节点的指针原生行为不满足迭代器定义,在这里,迭代器通过类来封装节点的指针重载运算符,如operator*、operator->、operator++等。(2)string和vector的元素在空间上是连续分布的,迭代器++就能指向下一个元素,但list的迭代器不行,它的每个元素在空间上都不连续,要访问下一个节点必须找到当前节点的next,因此list的迭代器必须重写。可在任意位置插入删除元素,插入删除元素效率高。原创 2023-05-08 13:32:09 · 174 阅读 · 0 评论 -
<C++> 内存管理
(1)C++如果为内置类型申请空间,malloc和new没有区别(2) C++如果为自定义类型申请空间,区别很大:①new和是开空间+初始化,delete是析构清理+释放空间②malloc仅仅是开空间,free仅仅是释放空间建议:C++中,无论是内置类型,还是自定义类型的申请释放,尽量使用new和delete。原创 2023-04-03 16:53:49 · 42 阅读 · 0 评论 -
<C++> 编译器优化问题
上面代码首先调用了test1函数构造了aa对象,然后使用值返回用aa对象拷贝构造了一个临时对象,然后调用拷贝构造函数构造出来了a1对象,所以一共调用了一次构造两次拷贝构造。如果对象比较大就会拷贝这个对象一次,然后再用拷贝出来的临时对象作为返回值,所以临时对象一定不在test栈帧中,一般是在需要接受test返回值的栈帧之中,临时对象具有常属性,只读不可修改。编译器的优化行为一般发生在一个表达式中,如果产生了一个临时对象,然后又用这个临时对象去构造一个对象,可能优化成直接去构造这个对象,就不会产生临时对象了。原创 2023-04-01 15:43:18 · 144 阅读 · 0 评论 -
初始化列表+匿名对象+static成员
/生命周期在main函数内A aa2(aa1);//生命周期在main函数内A(3);//构造匿名对象,生命周期只在这一行return 0;F10调试:当执行完A(3)还没执行return 0时,aa1和aa2的生命周期还没有结束,不会调用析构函数,此时打印的析构函数只能是匿名对象A(3)的析构函数:所以A(3)这一行执行完就调析构函数了。原创 2023-04-01 12:19:30 · 72 阅读 · 0 评论 -
<C++>类和对象
C中我们学过struct(结构体)自定义类型。c++为了兼容c语言,在这里我们也可以使用struct来定义类。和c不同的是,c++中的struct可以在内部放置函数,除此以外两者定义出的类还有其他的的区别。C++兼容C结构体的语法,C++把结构体升级成了类,在C++中更喜欢用class代替struct。定义类的格式class 类名//或者struct 类名//类体:成员变量--属性 成员函数---功能// 一定要注意后面的分号。原创 2023-03-14 13:17:53 · 30 阅读 · 0 评论