![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 94
WoLannnnn
沉淀……
展开
-
C++智能指针
为什么需要智能指针?下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题#include <vector>void _MergeSort(int* a, int left, int right, int* tmp){ if (left >= right) return; int mid = left + ((right - left) >> 1); // [left, mid] // [mid+1,原创 2022-02-22 09:38:36 · 131 阅读 · 15 评论 -
C++11的新鲜事儿~
C++11简介在2003年C++标准委员会曾经提交了一份技术勘误表(简称TC1),使得C++03这个名字已经取代了C++98称为C++11之前的最新C++标准名称。不过由于TC1主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把两个标准合并称为C++98/03标准。从C++0x到C++11,C++标准10年磨一剑, 第二个真正意义上的标准珊珊来迟。相比于C++98/03,C++11则带来了数量可观的变化,其中包含了约140个新特性,以及对C++03标准中约600个缺陷的原创 2022-02-20 10:20:53 · 452 阅读 · 13 评论 -
哈希应用及海量数据面试题
文章目录哈希的应用位图位图概念位图的实现位图的应用位图的优缺点布隆过滤器布隆过滤器提出布隆过滤器概念布隆过滤器的插入布隆过滤器的查找布隆过滤器实现(主要针对string类型)布隆过滤器删除布隆过滤器优点布隆过滤器缺陷海量数据面试题哈希切割位图应用布隆过滤器哈希的应用位图位图概念面试题给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。遍历,时间复杂度O(N)排序(O(NlogN)),利用二分查找: logN用set/unorder原创 2022-02-10 10:53:52 · 434 阅读 · 20 评论 -
哈希及unordered系列实现
unordered_map/unordered_set底层结构unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构哈希概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序查找时间复杂度为O(N),平衡树中为树的高度,即O( log2N),搜索的效率取决于搜索过程中元素的比较次数。理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函数(hashFunc)使元原创 2022-02-09 11:25:52 · 604 阅读 · 8 评论 -
unordered_map系列关联式容器
unordered系列关联式容器在C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可达到O(log2N) ,即最差情况下需要比较红黑树的高度次,当树中的节点非常多时,查询效率也不理想。最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器与红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对unordered_map和unordered_set进行介绍,unordered_multi原创 2022-02-08 08:12:27 · 784 阅读 · 11 评论 -
AVL树的性质及插入实现
底层结构前面对map/multimap/set/multiset进行了简单的介绍,在其文档介绍中发现,这几个容器有个共同点是:其底层都是按照二叉搜索树来实现的,但是二叉搜索树有其自身的缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),因此map、set等关联式容器的底层结构是对二叉树进行了平衡处理,即采用平衡树来实现AVL 树AVL树的概念二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中原创 2022-02-07 09:24:53 · 316 阅读 · 17 评论 -
map和set等关联式容器的使用
原创 2022-02-05 09:01:19 · 241 阅读 · 15 评论 -
二叉搜索树
二叉搜索树概念二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树int a [] = {5,3,4,1,7,8,2,6,0,9};仔细观察这颗搜索二叉树,它的中序遍历实际上是构成一个升序的排序的,所以二叉搜索树也叫二叉排序树二叉搜索树操作二叉搜索树的查找二叉搜索树的插入插入的具体过程如下:树为空,则直原创 2022-02-03 14:50:57 · 2662 阅读 · 12 评论 -
C++多态
多态的概念概念多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态比如买票,不同的身份票价是不同的。多态分为静态的多态和动态的多态静态的多态就是函数重载,比如库提供的swap动态(运行时)的多态:a、派生类继承父类,完成虚函数的重写 b、基类的指针或者引用才能调用这个重写的虚函数基类的指针或引用指向基类对象,调用基类的虚函数基类的指针或引用指向派生类对象,调用派生类的虚函数效果:调用函数与对象有关,指向哪个对象就调用哪个虚函数多态的定义及实原创 2022-02-01 22:26:13 · 1624 阅读 · 6 评论 -
C++继承
继承的概念及定义继承的概念继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用class Person{public: void Print() { cout << "name:" << _name <&l原创 2022-01-31 14:42:34 · 799 阅读 · 14 评论 -
经典字符串匹配算法——KMP算法
KMP算法KMP算法是一种高效的字符串匹配算法,在传统暴力遍历匹配的基础上做了一定的优化。首先KMP算法的实现也是使用了回退思想,不过与暴力遍历不同,KMP的回退,是让子串进行匹配,而不是主串。KMP示例首先我们来看两个例子来理解KMP算法:例1:分别从str的i和sub的j位置处开始匹配:此时a与c不匹配,如果暴力遍历的话,是i回到到b,j也回到a,重新一轮匹配。而KMP算法,是将子串的j回到第二个a,str[i]与sub[j]重新开始匹配。原因很明显,第二个ab与第一个ab是相同的,因原创 2021-12-17 21:45:57 · 9261 阅读 · 42 评论 -
C++stack和queue及适配器的学习使用
文章目录stack的介绍和使用stack的介绍stack的使用stack的模拟实现queue的介绍和使用queue的介绍queue的使用queue的模拟实现priority_queue的介绍和使用priority_queue的介绍priority_queue的使用在OJ中的使用priority_queue的模拟实现容器适配器什么是适配器STL标准库中stack和queue的底层结构deque的简单介绍deque的原理介绍deque的缺陷为什么选择deque作为stack和queue的底层默认容器STL标准库原创 2021-11-26 20:49:13 · 506 阅读 · 28 评论 -
C++list
文章目录list的介绍及使用list的介绍list的使用list的构造list iterator的使用list capacitylist element accesslist sortlist modifierslist的迭代器失效list的模拟实现模拟实现list对模拟的list进行测试list的介绍及使用list的介绍list的文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的原创 2021-11-12 20:46:10 · 1372 阅读 · 16 评论 -
C++vector
文章目录vector的介绍及使用vector的介绍vector的使用vector的定义vector的遍历vector iterator 的使用vector 空间增长问题vector 增删查改vector 迭代器失效问题vector 在OJ中的使用vector深度剖析及模拟实现模拟实现vector使用memcpy拷贝问题对vector核心接口的测试vector的介绍及使用vector的介绍vector的文档介绍 vector是表示可变大小数组的序列容器。就像数组一样,vector也采用的连续存原创 2021-11-09 21:22:21 · 2070 阅读 · 7 评论 -
string的模拟实现
文章目录拷贝构造和赋值重载的传统写法vs现代写法传统写法现代写法:拷贝构造和赋值重载的交换拷贝构造和赋值重载的现代写法可以复用swap范围for“增”的操作(从尾部添加)“改”的实现:insert<<、>>及inline的重载总体实现:拷贝构造和赋值重载的传统写法vs现代写法传统写法//传统写法 //拷贝构造 string(const string& s1) { assert(s1._str); _size = _capacity =原创 2021-10-31 21:17:02 · 154 阅读 · 4 评论 -
string的使用
文章目录C语言中的字符串两个面试题标准库中的string类了解string类string类的常用接口说明1.string类对象的常见构造2.string类对象的容量操作size/clear/resize/capacityreserve3.string类对象的访问及遍历操作opetator[]迭代器(类似指针)范围for:4. string类对象的修改操作appendoperator+=c_strfindrfindsubstrinserterasegetlineC语言中的字符串C语言中,字符串是以’\0原创 2021-10-31 21:13:50 · 1067 阅读 · 2 评论 -
C++模板初阶
文章目录泛型编程函数模板函数模板概念函数模板格式函数模板的原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化泛型编程如何实现一个通用的交换函数呢?//交换int类型的数据 void Swap(int& left, int& right){ int temp = left; left = right; right = temp;}//交换double类型的数据void Swap(double& left, double&原创 2021-10-27 16:20:51 · 250 阅读 · 3 评论 -
C++内存管理
C/C++中程序内存区域划分:注:const变量不在代码段(常量区),属于自己的栈帧,或者如果是全局或静态的,就在数据段中(静态区)【说明】栈又叫堆栈,非静态局部变量/函数参数/返回值等等,栈是向下增长的。内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。用户可使用系统接口创建共享共享内存,做进程间通信。堆用于程序运行时动态内存分配,堆是可以向上增长的。但是也不一定,因为有可能下一次申请的是之前释放的数据段–存储全局数据和静态数据。代码段–可执行的代码/只读常量。我们原创 2021-10-24 23:12:01 · 2987 阅读 · 7 评论 -
C++类与对象(下)
再谈构造函数构造函数体赋值在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值class Date{public: Date(int year, int month, int day) { _year = year; _month = month; _day = day; } private:int _year;int _month;int _day;};虽然上述构造函数调原创 2021-10-18 21:34:42 · 255 阅读 · 2 评论 -
C++类与对象(中)
文章目录类的6个默认成员函数构造函数概念特性析构函数概念特性拷贝构造概念特征类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数。class Date {}; 构造函数概念对于以下的日期类:class Date{public: void SetDate(int year, int month, int day) { _year = year; _month = month原创 2021-10-18 21:28:26 · 171 阅读 · 6 评论 -
C++ 类与对象(上)
文章目录类的引入类的定义类的两种定义方式:类的访问限定符及封装访问限定符封装类的作用域类的实例化类对象模型如何计算类对象的大小类对象的存储方式猜测结构体内存对齐规则this指针this指针的引出this指针的特性类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。struct Student{ //在类里面定义函数 void SetStudentInfo(const char* name, const char* gender, int age) {原创 2021-10-09 22:12:49 · 393 阅读 · 9 评论 -
关于C++基础的一些“碎碎念”
命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。命名空间定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。//1. 普通的命名空间namespace N1 // N1为命名空间的名称{// 命名空间中的内容,既可原创 2021-09-28 10:13:01 · 1074 阅读 · 17 评论