
C++从入门到入土
文章平均质量分 94
C++的学习之路
无聊看看天T^T
事以密成,语以泄败
展开
-
C++的红黑树
每一次的调整都可能导致另一次红黑树性质的被破坏cur和parent均为红色是由“新增”或“向上调整”两种原因导致的,因此无论是这两种的哪一种,只有当cur和parent均不为红时才不需要继续调整(循环)红黑树是否调整取决于cur和parent是否均为红,怎么调整取决于叔叔u的情况 + cur是p的哪个孩子原创 2024-05-23 21:41:17 · 1002 阅读 · 0 评论 -
C++的AVL树
因为插入时该结点的bf肯定为0,但是该结点的插入可能会使它的祖先结点的bf产生变化,当某个祖先结点的bf变为2时就需要以该祖先结点为基础进行旋转,通过上述案例我们可以得知不论是RR左旋还是LL右旋,完成插入后和完成旋转后两个状态时,新插入结点的bf第一为0,所以在完成旋转后不需要对该值进行更新从宏观上来看它一直没变。插入新结点必然会导致其父结点的bf产生变化,并可能会导致它的爷爷结点甚至更向上的某个祖先结点的bf发生变化,当某个祖先结点的bf == 2或-2时需要以该祖先结点为基础进行旋转。原创 2024-05-21 09:21:53 · 1047 阅读 · 0 评论 -
C++中的类型转换操作符:static_cast && reinterpret_cast &&const_cast && dynamic_cast(重要)
(operator +类型名)原创 2024-07-01 16:11:47 · 937 阅读 · 0 评论 -
C++的特殊类设计 与 单例模式的两种实现方式(重要)
如果有定义的话虽然设置了private,但只是避免了外部直接调用,但类内部的其它成员函数还可以使用拷贝构造和赋值重载。原创 2024-06-23 22:55:37 · 955 阅读 · 0 评论 -
C++的RAII思想、智能指针类、shared_ptr的循环引用问题、定制删除器(重要)
C++11并没有类似boost库中提供的shared_array智能指针类用于管理和释放由[ ]创建的多个智能指针对象,所以在使用shared_ptr管理和释放由[ ]开辟的多个对象时,会因为delete与new的方式不匹配而报错。可以有多个指向相同资源的指针,资源管理依赖于引用计数,因此必须小心循环引用问题,避免资源无法释放。2、weak_ptr也有use_count接口,用于获取此时weak_ptr指向的资源的引用计数。的资源并增加引用计数,一些列操作导致int资源的引用计数不变,相当于什么都没干。原创 2024-06-20 23:36:07 · 779 阅读 · 0 评论 -
C++的异常捕获、异常安全、noexcpt关键字(重要)
3、找到匹配的catch子句并处理后,会继续执行catch子句后的非try...catch块中的内容。(异常是一种运行时错误,可以中断程序的正常流程,常见的异常包括除零错误、文件未找到、网络连接失败等)需要程序员自己去查找对应的错误,如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。如果异常未被捕获,它会向调用栈的上传递,直到找到一个处理器,如果找不到一个处理器就会使程序终止。,并将控制权转移到预定的异常处理逻辑中。太过强硬,如果发生内存错误,或者除0语法错误等就会直接终止程序。原创 2024-06-14 15:52:01 · 1690 阅读 · 0 评论 -
C++11的可变参数模板、emplace_back接口、C++17的折叠表达式(重要)
emplace_back是C++11提供的一个基于可变参数模板实现的新的成员函数原创 2024-06-12 14:13:02 · 418 阅读 · 0 评论 -
C++11:右值引用的移动语义、万能引用、完美转发与forward函数、default和delete关键字(重要)
左值指拥有明确内存地址的持久对象,可以通过取地址符获取其地址;右值指临时对象,无持久内存地址,不可通过取地址生命周期仅限于当前表达式,C++11时右值被细分为纯右值(就是传统意义上的右值)和将亡值表示一个资源即将被销毁但可以“转移”的对象,可使用move将一个对象标记为“将亡”,并允许其资源被“移动”(≠ 拷贝)到另一个对象,移动后原对象的数据不再保证有效。原创 2024-06-11 16:57:20 · 1349 阅读 · 0 评论 -
C++98和C++11的构造和初始化、initializer_list以及decltype关键字(一般)
存放不同类型的pair对象间可以进行拷贝构造,是因为pair的拷贝构造是一个函数模板(但也要保证有关联性可以进行隐式类型转换否则也可能会报错)并且不能同时出现两个非内置类型类型的隐式类型转换,否则也会报错,因为C++不允许非内置类型的“链式”隐式转换(比如转换第一个元素 const char* 到 const std::string后接着还要转换第二个元素 char* 到 std::string),如果真的想要需要手动强转为指定的自定义类型原创 2024-06-06 19:09:57 · 2477 阅读 · 0 评论 -
C++哈希的应用:位图 && 布隆过滤器 && 哈希切割(重要但尚未更新)
有四十个亿未排序的不重复的无符号整数,此时提供一个无符号整数如何快速判断某个无符号整数是否在这40个亿数中?遍历,时间复杂度为O(N)(先)排序 + 二分查找,时间复杂度为O(logN)(不如位图的原因是排好序后如果进行插入删除麻烦,尤其是很多数时在0下标插入,需要挪动大量的数据,删除同样也要挪动大量数据,即排完序后是很好找,但麻烦在插入和删除,因此对于需要快速判断元素是否存在,并且需要频繁进行插入和删除操作的情况,使用位图是一个更好的选择)位图。原创 2024-06-01 18:23:44 · 867 阅读 · 0 评论 -
C++的哈希 && 哈希表 && 哈希桶(重要但尚未更新)
C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可以达到log_2 N,即最差情况下要比较红黑树的高度次: 当树中的结点特别多且有序时,以红黑树为底层结构的多个关联式容器就显得有些不够用了,为此C++11中又提供了4个unordered系列的关联式容器unordered_map、unordered_set、unordered_multimap、unordered_multiset,它们与之前的map、set、multimap、multiset的使用方式基本类原创 2024-05-27 00:11:26 · 2448 阅读 · 0 评论 -
C++的仿函数、lmabda表达式、闭包类、function包装器、bind函数(重要)
在现代 C++ 中,Lambda 表达式通常更简洁,更直观。因此,很多时候 Lambda 是 std::bind 的更简便的替代品原创 2024-05-17 15:57:55 · 536 阅读 · 0 评论 -
C++的map和set(一般)
me_pair是一个函数模板,用于创建并返回一个pair类类型的对象,当我们调用makr_pair时编译器会自动识别我们传入的key和value的类型,并构建一个pair对象返回。插入一个新的键值对,value的类型在构造map对象时已经确定,且这里的value也是一个对象。set类类型的对象虽然一次仅能插入一个value,但在底层是以的形式存在的。(利用插入时如果key已经存在则返回的迭代器指向的是已经存在的key所在的位置的特性)(可以用来为一组数据排序)原创 2024-05-17 15:25:14 · 592 阅读 · 0 评论 -
C++的多态(重要)
B继承了A且对A中的虚函数func进行了重写,现在有一个B类对象b,A* a = &b,a虽然是A类的指针但实际使用的是B类的虚函数指针,因为&b得到的空间中只有一个指向B类虚表的虚函数指针,即使B中包含了A类的部分,也不会有机会调用到A类的虚函数表,所以a->func()时,会先通过b的虚函数表指针找到b的虚函数表中重写的func的地址,然后才会执行a->func(),调用的是重写后的func原创 2024-04-23 21:14:30 · 943 阅读 · 0 评论 -
C++的继承、基类和派生类的赋值转换、继承与友元、继承与静态成员、菱形继承和菱形虚拟继承、虚析构函数、继承与组合(重要)
是一种继承方式,用来解决菱形继承中数据冗余和二义性的问题。通过使用虚拟继承(以virtual 继承方式 派生类名的形式),可以确保在继承链中只保留一个基类实例,使得派生类可以共享基类的唯一副本,被虚拟继承的类叫做虚基类原创 2024-04-18 20:44:32 · 1068 阅读 · 0 评论 -
C++类和对象(六):初始化列表、转换构造函数、expilct关键字、类的静态成员函数(重要)
编译器只允许一次用户定义的隐式转换。例如 C c = "hello"; 需要 const char* → int → C 的两次转换时会报错原创 2024-03-10 23:54:52 · 507 阅读 · 0 评论 -
STL的list(一):双向迭代器、常见接口、vector和list的迭代器失效场景(重要)
vector的insert和erase都会导致迭代器失效list的insert不会导致迭代器失效,erase会导致迭代器失效insert导致失效的原因是开辟了新空间后,迭代器扔指向原空间erase导致失效的原因是销毁的空间不是连续的空间,迭代器找不到下一块小空间的位置。原创 2024-04-07 21:07:03 · 1123 阅读 · 0 评论 -
STL的string(一):扩容和缩容机制、c_ctr()、双向迭代器、常见接口(一般)
从字符串的pos开始向后复制len个字符,如果字符串太短或len的大小为string类中的npos,则复制到str的末尾。e size_t(nops是一个静态成员常量,具有size_t类型元素的最大可能值(2^32)- 1)迭代器(iterator)是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器。(不给len时默认从pos位置起拷贝至字符串末尾止)复制指针s指向的c字符串(包含\0的字符串)内元素的访问,不同的容器有不同的迭代器。(迭代器是一个行为像指针一样的类型)原创 2024-03-16 20:53:27 · 1340 阅读 · 0 评论 -
C和C++的内存分布、C++的内存管理、对new和delete的深层次分析、定位new、Windows提供的内存泄漏检测函数_CrtDumpMemoryLeaks函数(重要)
假设new了44个字节大小的空间,但实际上前四个字节用于存放对象的个数,p2指向的是第5个字节,当在delete中调用free去free p2时,不能将前面存放需要调用多少次析构函数的小块内存释放,会造成。,因为new[]的最底层是malloc,delete的最底层是free,尽管malloc了好几个int类型的对象,但只需要free掉p1这个指针即可free掉malloc开辟的连续空间;更加高效的管理和读取数据,堆区,因为这是我们可以直接操作的区域。仅分配原始内存,不调用构造函数,需手动初始化。原创 2024-03-12 23:40:38 · 285 阅读 · 0 评论 -
C++的类和对象(五):operator关键字、赋值重载、取地址运算符&重载 、const成员函数、<<和>>的重载(重要)
能写成(t1 == t2)是因为编译器帮我们做了一些处理,实际情况是operator==(t1,t2),如果类中的成员访问权限改为了private,此时类外的比较函数无法直接使用这些成员变量,故最好把比较函数写入类中,但是当我们将运算符重载函数原封不动的移入类中时,会发现系统提示函数的参数太多了,这是因为除了x和y两个参数外还有一个隐藏的this指针,所以还需要更改代码。用于处理const对象的调用,表明在该成员函数中不能对传入的this指针指向的对象中的的任何成员进行修改。(参考内置类型的连续赋值),原创 2024-03-10 15:16:41 · 1257 阅读 · 0 评论 -
C++的函数模板、类模板、显式实例化(重要)
因为未实例化的模板都是一个逻辑符号没有实际代码,同时需要注意的是类实例化发生在编译阶段,假设将A类的声明放在A.h、定义放在A.cpp、然后在B.cpp中要实力化一个A类对象(两个cpp文件均包含了头文件但并未互相包含),在编译阶段遇到B.cpp中的实例化请求时会去寻找A类的定义,但此时是编译阶段不是链接阶段,所以不能看到A.cpp中A类的定义,最终报错。原创 2024-03-14 17:45:36 · 775 阅读 · 0 评论 -
STL的stack和queue(一):适配器模式、双端队列deque、优先级队列(重要)
(实际是vector容器尾部)原创 2024-04-06 23:25:47 · 509 阅读 · 0 评论 -
C++的类和对象(七):友元、前置声明、内部类、匿名对象的多个使用场景(重要)
前置声明的核心作用是为编译器提供一种延迟类型定义检查的机制。当编译器遇到一个使用未定义类的场景时,前置声明会告知编译器“该类将在后续定义”,从而允许编译继续推进,即解决了循环依赖问题又优化了编译时间原创 2024-03-12 23:16:12 · 874 阅读 · 0 评论 -
C++的引用、指针与引用的关系、函数的传应用和传值返回、常引用、临时变量的有常性(重要)
有多级指针,但是没有多级引用,因为引用是变量的别名,编译后通常被实现为自动解引用的指针。但语言规范强制引用必须初始化且终身绑定单一对象,无法重新绑定或形成引用链。因此,int&&在C++中表示右值引用而非多级引用原创 2024-03-01 23:51:28 · 962 阅读 · 0 评论 -
C++的类和对象(二):隐藏的this指针、->运算符(重要)
(即this的类型为MyClass* const this,而*this得到的是原本this指向的MyClass类型的对象,返回类型为&,就是返回该对象的引用,然后该对象再去调用printX())(由以上内容可以推出类模板实例化后的类中的成员函数只会存在一份,实例化一个对象就是让该对象可以调用类中的成员函数,)计算类的大小时,有三个整型成员变量的类的大小是12字节,如果this指针存放在对象中类的大小应该是大于12的。(this指向对象的成员变量可以更改,比如this->_year = 2000之类的)原创 2024-03-04 23:46:58 · 1011 阅读 · 0 评论 -
C++的命名冲突、namespace、using关键字(重要)
未提前使用using声明可以公开访问的命名空间域中的变量或函数时,需要使用命名空间域::变量名或函数名的方式;提前使用using声明可以公开访问的命名空间域中的变量或函数时,之后使用时可以直接用变量名或函数名原创 2024-02-26 19:26:10 · 1792 阅读 · 0 评论 -
C语言宏的缺陷、C++的内联函数与inline关键字、内联函数的声明与定义分离、声明和定义不能分离的场景(重要)
内联函数不建议函数的声明和定义分离,否则出现链接错误(展开后没函数地址,链接器找不到)被内联函数在编译阶段不会被统计进符号表中如果将inline修饰的函数放入Stack.cpp文件中且包含.h文件,Stack.h文件中只有函数的声明,Test.cpp文件中只有函数的调用且包含.h文件,在编译后会出现如下情况使用static修饰的函数,则该函数只能被当前文件访问,无法被其他文件调用底层原理:编译阶段被static修饰的函数不会被统计进符号表中(其它的用不到)模板函数或类。原创 2024-03-03 01:23:06 · 1219 阅读 · 0 评论 -
C++的类和对象(一):类的定义与初始化、访问限定符、类实例化、Class和Struct的区别、增量构建(重要)
类体class:定义类的关键字classname:类的名字类体:类成员的集合,其中的变量称为类的属性或成员变量,函数称为类的方法或成员函数类的两种定义方式:1、类成员的声明和定义不分离public:double area() { // 直接内联实现2、 类成员的声明和定义分离(成员函数名前需要加类名::)(推荐)public:// 声明double Circle::area() { // 类外定义对于类模板,不建议进行声明和定义分离,模板的参数、特化以及分离编译。原创 2024-03-04 17:50:43 · 961 阅读 · 0 评论 -
STL的vector(一):常见接口、短字符串优化SSO、vector类的模拟实现(重要)
STL 的string类怎么啦?C++面试中string类的一种正确写法C++ STL string的Copy-On-Write技术C++的std::string的“读时也拷贝”技术!原创 2024-03-21 21:49:00 · 1154 阅读 · 0 评论 -
C++的函数重载、函数名修饰规则、从汇编指令的角度解析C语言的函数查找机制、函数签名 (重要)
(字符表会根据函数名告诉链接器该函数的地址)(如果当前项目中的所有文件都没有StackInit函数的定义,就会提示链接错误 ,这就是函数只声明不定义产生的常见链接错误)尝试连接两个.o文件,但因为Test.o文件只有StackInit函数的声明,所以链接器就会依据StackInit的函数名去字符表。(C语言不允许同名函数,因为C语言采用简单的符号表管理函数名称,没有名字修饰机制,无法区分同名但参数不同的函数)在同一个作用域内,可以定义多个同名但参数列表(参数的类型、参数的个数、参数类型的顺序)不同的函数。原创 2024-02-28 23:52:54 · 646 阅读 · 0 评论 -
STL的list(二):List类的模拟实现 && 迭代器模板(一般)
(比如当前实在A类中,调用A类中的非静态成员函数时使用的this的类型就是A*,说是非静态成员函数是因为静态成员函数没有this指针因为它是和类一体的,当然如果非静态成员函数的类型是const那么this的类型就是const A*)(只要类的成员函数或成员变量的访问权限允许,你可以直接使用类的名称来访问它的成员函数,比如A::Print(),同时记得要在同一命名空间下)对于const修饰的对象,普通迭代器会导致权限的放大,怎么办?,然后访问解引用后的对象的成员变量或成员函数,类似于。原创 2024-04-06 23:23:57 · 978 阅读 · 0 评论 -
STL的stack和queue(二):反向迭代器的实现(了解)
编写一个通用的反向迭代器类模板,传递不同容器的正向迭代器,编译器将自动生成这些容器的反向迭代器,减少代码的重复实现,简化编程。原创 2024-04-12 19:42:59 · 478 阅读 · 0 评论 -
C++11中的auto、RTTI、范围for、指针空值nullptr(重要)
在同一行声明多个变量时,变量类型必须相同,否则编译报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量// 该行代码会编译失败,因为c和d的初始化表达式类型不同。原创 2024-03-03 17:34:45 · 1562 阅读 · 0 评论 -
STL的string(三):string的模拟实现、输入输出流、get和geline函数(重要)
象,所以这里要先调用自定义的c_str函数返回一个有C语言风格的字符串,同样的官方提供的string 类型可以直接通过原创 2024-03-20 09:18:56 · 1863 阅读 · 0 评论 -
C++的类与对象(三):构造和析构、缺省值、类对象的销毁顺序、拷贝构造(重要)
且成员变量的初始化顺序由它们在类中声明的顺序决定,而不是由构造函数初始化列表的顺序决定。原创 2024-03-06 19:39:41 · 1179 阅读 · 0 评论 -
模板参数、constexpr关键字、编译时确定、运行时确定、按需实例化、模板的特化、函数模板特化、模板的分离编译(重要)
模板的优点:复用了代码,节省资源,更快的迭代开发,C++的标准模板库也因此而生增强代码灵活性模板的缺点:模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息十分混乱,不易定位原创 2024-04-13 21:19:26 · 1028 阅读 · 0 评论