C++
文章平均质量分 94
暂停更新
暂停更新。
展开
-
C++STL详解(七)——priority_queue的使用和模拟实现
优先级队列默认使用vector作为底层的存储的容器,在vector上又使用了堆算法将vector中元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priorityda_queue。注意默认情况下priority_queue是大堆。方式一使用的是vector作为底层存储容器,内部为构造为大堆结构。//大堆 priority_queue < int , vector < int > , less < int >> q1;方式二。原创 2023-03-14 20:58:38 · 362 阅读 · 6 评论 -
C++ IO流
在C++中,我们可以使用stringstream来将整型变量的数据达转换为字符串形式.主要有两种使用方式:1.将数值数据格式转化为字符串.//方法一: int a = 10;string sa;s > sa;//从s中抽取前面插入的int类型的值,赋值给string类型 cout原创 2023-07-14 18:25:41 · 323 阅读 · 20 评论 -
C++ 类型转换
p的值修改后打印出来是一样的.但是,由于编译器会将const修饰的变量a加载到寄存器中,打印的时候编译器便会直接从寄存器读.所以,读取a时便还是以前的值,而。对于菱形继承来说,切片会产生偏移量,原本父类指针ptr1,ptr2应该都指子类bb,但是经过切片后,ptr1指向子类中的A1,ptr2指向子类中的A2.因为在Func函数中,形参为父类指针接收,可是,我们并不知道实参传的是指向父类的指针,还是指向子类的指针.无论采用c语言的强制转换,还是C++中的dynamic_cast强制转换.原创 2023-07-04 18:47:34 · 503 阅读 · 14 评论 -
C++ 特殊类设计
在C++98中,将该类的构造函数设置为私有,因为如果派生类继承了基类的私有成员,就意味着必须调用基类的构造函数对基类的私有成员初始化,但是基类的构造函数设置为私有,就意味派生类无法访问到基类的构造函数,所以该类被继承后也就无法创建出对象.一个程序中,多个单例,并且有先后创建初始化顺序要求时.饿汉模式无法控制,因为静态成员谁先初始化谁后初始化不能确定.比如,程序两个单例类A和B,假设要求A先创建初始化,B再创建初始化.所以,针对于单例对象,我们常用了内嵌类的形式,让程序结束时符合相关条件自动销毁.原创 2023-07-02 17:14:34 · 414 阅读 · 27 评论 -
C++11 -- lambda表达式
在C++11后,我们便可以通过lamada表达式来解决,lamada表达式实际上就是一个匿名函数,这样我们即可通过lamada表达式直接了解sort排序的比较方式,进而提高了代码的可读性.lambda表达式语法lamada表达式的书写格式:lamabda达式各部分说明[capture-list]: 捕捉列表,该列表总是出现在lambda表达式的开始位置,编译器会根据[]来判断接下来的代码是否为lambda表达式, 捕捉列表能够根据上下文中的变量让lambda表达式使用.(parameters):原创 2023-05-28 17:30:21 · 849 阅读 · 19 评论 -
C++11 -- 可变参数模板
以下就是一个基本可变参数的函数模板.//Args是一个模板参数包,args是一个函数形参参数包. //声明一个函数形参参数包Args...args,其中这个形参参数包中可以包含0到任意个模板参数. template < class . . . Args > void ShouList(Args . . . args) {注意上面的参数args前面有省略号,所以它就是一个可变模板参数,我们将带省略号的参数称为"参数包",它里面包含了0到N个(N>>0)个模板参数.原创 2023-05-25 23:37:55 · 1648 阅读 · 21 评论 -
C++11 -- 类的新功能
如果想要限制某些默认函数的生成,在C++98中,是将该函数设置成private,并且只声明补丁而已,这样他人调用时就会报错,在C++11中更简单了,只需要在函数声明处加上=delete即可,该语法指示编译器不再生成对应函数的默认版本.我们了解,如果当我们显示写了拷贝构造,编译器就不会默认生成移动构造,可是如果我们在移动构造声明处加上关键字default,编译器就可以默认生成了.例如: 当我们提供了拷贝构造,就不会生成移动构造了,那么我们可以使用default关键字指定移动构造生成.原创 2023-05-23 11:44:21 · 690 阅读 · 31 评论 -
C++11 -- 右值引用和移动语义
( 1 ) : 左值引用只能引用左值,不能引用右值.( 2 ): 但是const左值引用既可以引用左值,也可以引用右值.原创 2023-05-12 10:16:12 · 500 阅读 · 22 评论 -
C++11 -- 入门基础知识
在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于C++03(TC1)主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准珊珊来迟。原创 2023-05-06 16:04:42 · 447 阅读 · 34 评论 -
哈希的应用 -- 布隆过滤器与海量数据处理
我们可以将么一个字符串多映射几个位(调用不同的哈希算法让同一个字符串映射不同位置),理论而言,一个字符串映射的位越多,则误判效率越低,但是也不能映射太多位置,因为映射的位置数越多,消耗的空间就越大,进而会导致布隆过滤器的优势降低.2: 我们要保证删除该元素后不会影响到其他元素,所以我们可以在位图的每一个比特位中设置一个计数值,如果铀元素插入到对应的比特位,那么该比特位的计数器就++,在删除时,我们只需要将该元素对应比特位计数器–就行.原创 2023-05-01 00:07:59 · 1206 阅读 · 45 评论 -
C++STL详解(十一)-- 位图(bitset)
有一道面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?内存内查找: 面对40亿个无符号整数,我们可以使用搜索树和哈希表,时间复杂度也就为O(1),因为搜索树不仅存储数据,还要存储颜色,parent,child指针等,哈希表还要存储迭代器,size等内置成员,进而导致内存存不下.文件内查找:排序 + 二分查找,时间复杂度为0(1),但是数据太大,只能放在文件上,但是磁盘运行效率太低,不好支持二分查找).综合以上情况,我们可以采取位图解决。原创 2023-04-28 10:44:46 · 1800 阅读 · 25 评论 -
C++map/set与unordered系列的区别
1: 当我们处理数据数量较小的数据时,map/set与unordered系列在增删查改的效率差距不大.2: 但我们处理数据量较大的数据时,unordered系列在增删查改的效率比set/map的效率更高,性能更强.3: 除非我们需要在遍历容器时数据是有序的一般采用map/set,否则一般采用unordered系列容器.原创 2023-04-19 16:28:53 · 696 阅读 · 34 评论 -
C++STL详解(九)--使用红黑树封装实现set和map
如果我们用一棵KV模型的红黑树同时实现map和set,我们就需要控制map和set中的所传入红黑树中的模板参数,其中,封装过程中,为了与红黑树的模板参数区分,我们将红黑树中模板参数由V改成T.在插入中,结点中存储的类型T可能为Set容器中的key,也有可能是Map中的pair键值对,底层红黑树如何针对不同类型的容器进行比较呢?所以,当容器为set时,红黑树中的仿函数就实例化为set容器中的仿函数,当容器为map时,红黑树中的仿函数就实例化为map中的仿函数.正向迭代器还包括了==,!原创 2023-04-19 14:29:10 · 588 阅读 · 1 评论 -
C++多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为.在继承中要构成多态还有两个条件:1: 必须通过基类的指针或者引用调用虚函数.2: 被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写.原创 2023-04-12 15:50:13 · 115 阅读 · 2 评论 -
C++继承
1: 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序:员在保持原有类特性的基础上进行扩展,增加功能,这样产生的类,称为派生类。2: 继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承为是类设计层次的复用。public ://继承后父类的Person成员(成员函数+成员变量)都会成为子类的一部分,这里体现出Stuident复用Person的成员。is-a关系。原创 2023-03-20 11:26:21 · 471 阅读 · 3 评论 -
C++STL详解(六)——stack和queue
方式一:使用STL中默认的适配器定义栈。(默认为deque)方式二:使用特定的适配器定义栈定义方式一:使用STL中默认的适配器定义队列。(默认为deque)定义方式二:使用特定的适配器定义队列。原创 2023-03-11 20:11:01 · 951 阅读 · 3 评论 -
C++STL详解(五)——list的介绍与使用
1:list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2:与其他序列容器相比(array,vector,deque),list通常可以在任意位置进行插入,移除等效率更高。原创 2023-03-08 20:38:31 · 1329 阅读 · 8 评论 -
C++STL详解(四)—— vector模拟实现
在reserve过程中,拷贝旧数据也有可能发生自定义类型的浅拷贝,所以我们不能用memcpy函数进行拷贝,而应该采用赋值拷贝,此为深拷贝。原创 2023-03-02 15:48:34 · 439 阅读 · 0 评论 -
C++STL详解(三)——vector的介绍和使用
1: vector是表示可变大小数组的容器。2:vector就像数组一样,也采用的连续空间来存储元素,这也意味着vector可以采用下标对vector的元素进行访问。3:vector与普通数组不同的是,vector的大小是可以动态改变的。4:vector需要分配大小时,其做法是,分配一个新的数组,然后将全部元素移入到这个数组当中,并且释放原来的空间。原创 2023-02-28 18:21:38 · 1047 阅读 · 0 评论 -
C++STL详解(二)— string类模拟实现
const一般是针对某种场合的作用域变量进行修饰的,比如const修饰的对象,经过调用没有添加const修饰的函数的返回值而进行访问修改时,仍然可以被修改,因为const类修饰的是函数体内的this指针,它的作用范围只在函数体内的值不可被修改,而返回值的修改属于在外界的修改,并非在函数体内。简单来说,const在哪里修饰,在哪里生效都是有固定规则的。函数后面加从上const可以扩大该string类调用范围,让可读可修改的类和可读不可修改的类都能调用。原创 2022-11-02 11:21:36 · 604 阅读 · 11 评论 -
C++STL详解(一)—string类
以及循环内 i++,跳过后移过的’’ '时,程序会一直在第一个‘ ’插入20%,一直后移,导致程序崩溃。当我们用>>输入字符串时,当编译器读取空格或者’\n’时会结束当前输入。范围for的底层其实就是迭代器(类似指针遍历),它能自动迭代,自动判断结束,常用来遍历数组等数据结构。empty 检测字符串释放为空串,是返回true,否则返回false。resize 将有效字符的个数该成n个,多出的空间用字符c填充。原创 2022-10-16 16:36:15 · 506 阅读 · 5 评论 -
string和模板(初阶)
class 类模板名{// 类内成员声明};public :cout原创 2022-10-13 16:27:23 · 176 阅读 · 0 评论 -
类和对象(一)
类和对象(一)的知识点详细讲解原创 2022-09-27 22:32:50 · 293 阅读 · 0 评论 -
类与对象(二)
类和对象(二)详细讲解。原创 2022-09-30 11:53:52 · 372 阅读 · 0 评论 -
类和对象(三)
类和对象(三)原创 2022-10-03 16:47:51 · 392 阅读 · 0 评论 -
C++内存管理
C++内存管理原创 2022-10-06 20:36:38 · 802 阅读 · 1 评论