
c++
文章平均质量分 92
李boyang
无
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++11--类的新功能
上述代码中用一个右值去构造s2对象,但由于Person类没有生成默认的移动构造函数,因此这里会调用Person的拷贝构造函数(拷贝构造既能接收左值也能接收右值),这时在Person的拷贝构造函数中就会调用string的拷贝构造函数对name成员进行深拷贝。如果要让Person类生成默认的移动构造函数,就必须将Person类中的拷贝构造、拷贝赋值和析构函数全部注释掉,这时用右值去构造s2对象时就会调用Person默认生成的移动构造函数。原创 2025-06-11 15:02:05 · 523 阅读 · 0 评论 -
C++11 -- 右值引用和移动语义
上述代码中的插入第一个元素时就会匹配到push_back的左值引用版本,在push_back函数内部就会调用string的拷贝构造函数进行深拷贝,而插入后面三个元素时由于传入的是右值,因此会匹配到push_back的右值引用版本,此时在push_back函数内部就会调用string的移动构造函数进行资源的转移。移动赋值是一个赋值运算符重载函数,该函数的参数是右值引用类型的,移动赋值也是将传入右值的资源窃取过来,占为己有,这样就避免了深拷贝,所以它叫移动赋值,就是窃取别人的资源来赋值给自己的意思。原创 2025-05-27 11:47:52 · 989 阅读 · 0 评论 -
C++11入门
在2003年C++标准委员会提交了一份技术勘误表(简称TC1),使得C++03这个名字取代了C++98成为C++11之前的最新C++标准名称但由于C++03主要是对C++98标准中的漏洞进行修复,语言的核心部分则没有改动,因此人们习惯性的把这两个标准合并称为C++98/03标准从C++0x到C++11,C++标准10年磨一剑,第二个真正意义上的标准姗姗来迟。原创 2025-05-20 10:19:32 · 807 阅读 · 0 评论 -
特殊类设计
单例模式是一种设计模式(Design Pattern),设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的目的就是为了可重用代码、让代码更容易被他人理解、保证代码可靠性程序的重用性单例模式指的就是一个类只能创建一个对象,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。原创 2025-05-15 14:37:25 · 744 阅读 · 0 评论 -
哈希应用--海量数据处理
海量数据处理是指基于海量数据的存储和处理,正因为数据量太大,所以导致要么无法在短时间内迅速处理,要么无法一次性装入内存对于时间问题,就可以采用位图、布隆过滤器等数据结构来解决对于空间问题,就可以采用哈希切割等方法,将大规模的数据转换成小规模的数据逐个击破。原创 2025-05-09 14:23:47 · 661 阅读 · 0 评论 -
布隆过滤器
所以布隆过滤器没有提供删除的接口,因为使用布隆过滤器本来就是要节省空间和提高效率的。首先,布隆过滤器可以实现为一个模板类,因为插入布隆过滤器的元素不仅仅是字符串,也可以是其他类型的数据,只有调用者能够提供对应的哈希函数将该类型的数据转换成整型即可,但一般情况下布隆过滤器都是用来处理字符串的,所以这里可以将模板参数K的缺省类型设置为string。此外,哈希函数的个数也需要权衡,哈希函数的个数越多布隆过滤器中比特位被设置为1的速度越快,并且布隆过滤器的效率越低,但如果哈希函数的个数太少,也会导致误判率变高。原创 2025-05-09 14:21:19 · 759 阅读 · 0 评论 -
C++STL(十) :bitset的模拟实现
我们只需遍历每一个整数,若这些整数全部都为0,则说明位图中没有位被设置过。一个整型有32个比特位,因此N个位的位图就需要用到N/32个整型,但是实际我们所需的整型个数是N/32+1,因为所给非类型模板参数N的值可能并不是32的整数倍。位图中是否全部位都没有被设置,实际上就是位图中有位被设置的反面,因此none成员函数直接调用any成员函数,然后将返回值取反后再进行返回。获取位图中被设置的位的个数,也就是统计位图中1的个数,我们只需要依次统计每个整数二进制中1的个数,然后将其相加即可得到位图中1的个数。原创 2025-05-07 09:33:01 · 885 阅读 · 0 评论 -
C++STL(九) :bitset的介绍与使用
假设面试官考了你一道题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?将这一堆数进行排序,然后通过二分查找的方法判断该数是否在这一堆数中将这一堆数插入到unordered_set容器中,然后调用find函数判断该数是否在这一堆数中单从时间复杂度上来看,这两种方法都是可以,而且效率也不错,第一种方法的时间复杂度是O(NlogN),第二种方法的时间复杂度是O(N)原创 2025-04-27 19:56:02 · 924 阅读 · 0 评论 -
C++STL(八) :unordered_set、unordered_map的模拟实现
data存放节点的值_next指向下个节点T _data;{}_table存放HashNode_n是哈希表的实际存储数量,用来计算负载因子//哈希结点类型public://...private://哈希表//哈希表中的有效元素个数。原创 2025-04-24 14:36:47 · 1125 阅读 · 0 评论 -
C++STL(七) :unordered_set、unordered_map的介绍及使用
唯一性类似set,所有元素唯一(不允许重复键值)插入重复元素时,操作会被忽略(可通过返回值判断是否成功)无序性元素顺序由哈希函数决定,遍历时无法预测顺序与set(基于红黑树的有序容器)形成对比哈希表实现底层通过哈希表存储元素,支持平均O(1)时间复杂度的插入、删除和查找操作最坏情况下(如哈希冲突严重)时间复杂度退化为O(n)动态调整哈希表的桶(bucket)数量会根据元素数量动态扩展/收缩,以平衡性能与内存占用方式一: 构造一个某类型的空容器//构造int类型的空容器。原创 2025-04-22 16:54:22 · 616 阅读 · 0 评论 -
c++ map与unordered_map的比较
在c++的STL库中,有map与unordered_map这两种名字十分相似的容器,但是他们的区别还是很大,下面我们从和进行逐一比较。原创 2025-04-18 14:07:53 · 320 阅读 · 0 评论 -
C++ 多态
必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。原创 2025-04-18 14:06:58 · 1175 阅读 · 0 评论 -
C++ 继承
public继承protected继承private继承基类当中被不同访问限定符修饰的成员,以不同的继承方式继承到派生类当中后,该成员最终在派生类当中的访问方式将会发生变化public继承protected继承private继承基类的public成员派生类的public成员派生类的protected成员派生类的private成员基类的protected成员派生类的protected成员派生类的protected成员派生类的private成员基类的private成员。原创 2025-04-16 14:27:02 · 731 阅读 · 0 评论 -
C++ IO流
在 C++ 中,“流(Stream)” 是一种 抽象的数据传输机制,它通过统一的接口实现了程序与各种输入/输出设备(如键盘、屏幕、文件、内存等)之间的数据流动。流的核心思想是将数据的输入输出操作统一为连续的字节序列处理,提供类型安全和可扩展的操作方式C++ 标准库中的流主要分为三类:流与传统C函数的对比:C++标准库提供了4个全局流对象:注意事项:输入数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置(置1),程序继续空格和回车都可以作为数据之间的分隔符,所以多个数原创 2025-04-16 14:22:29 · 887 阅读 · 0 评论 -
C++模板---函数模板与类模板
因为在编译期间,编译器根据实参推演模板参数的实际类型时,根据实参a将T推演为int,根据实参b将T推演为double,但是模板参数列表中只有一个T,编译器无法确定此处应该将T确定为int还是double.此时,我们有两种处理方式,第一种就是我们在传参时将b强制转换为int类型,第二种就是使用下面说到的显示实例化。比如,当用int类型使用函数模板时,编译器通过对实参类型的推演,将T确定为int类型,然后产生一份专门处理int类型的代码,对于double类型也是如此。是编译器产生特定具体类型函数的模具。原创 2025-04-14 12:35:12 · 772 阅读 · 0 评论 -
C++模板进阶--非类型模板参数、模板特化以及模板分离编译
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。原创 2025-04-14 12:33:38 · 908 阅读 · 0 评论 -
C++STL(六) :set与map的模拟实现
需要注意的是,反向迭代器只接收了一个模板参数,即正向迭代器的类型,也就是说,反向迭代器不知道结点的引用类型和结点的指针类型,因此我们需要在正向迭代器当中对这两个类型进行typedef,这样反向迭代器才能通过正向迭代器获取结点的引用类型和结点的指针类型。实现红黑树的正向迭代器时,一个结点的正向迭代器进行–操作后,应该根据红黑树中序遍历的序列找到当前结点的前一个结点。,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。原创 2025-04-03 14:47:26 · 1109 阅读 · 0 评论 -
C++STL(五) :priority_queue的模拟实现
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue,默认情况下priority_queue是大堆使用vector作为底层容器,内部构造大堆结构使用vector作为底层容器,内部构造小堆结构不指定底层容器和内部需要构造的堆结构,此时默认使用vector作为底层容器,内部默认构造大堆结构。原创 2025-03-31 16:57:24 · 815 阅读 · 0 评论 -
C++STL(四):stack和queue的模拟实现
容器适配器:以某种已有的既定容器作为底层结构,在其基础上进一步地进行,使其可以满足某种特性STL六大组件中配接器中的stack,queue,priority_queue就是通过封装其他容器实现的。原创 2025-03-24 22:37:26 · 377 阅读 · 0 评论 -
C++STL(三) :list的模拟实现
1。原创 2025-03-23 21:59:37 · 1069 阅读 · 0 评论 -
C++STL(二)vector的模拟实现
start指向整个容器的首部_finish指向最后一个有效数据_endofstorage指向整个容器的尾部。原创 2025-03-21 15:59:12 · 758 阅读 · 0 评论 -
C++STL(一):string类的模拟实现
为了让string对象能够像内置类型一样使用>>运算符直接输入,我们需要先将对象的C字符串置空,然后从标准输入流读取字符,直到读取到’ ‘或是’\n’便停止读取。实现时于>>运算符的重载基本相同,只是当读取到’\n’的时候才停止读取字符。_str在开辟新空间之前需要先将原来的空间释放掉,并且在进行操作之前还需判断是否是自己给自己赋值。先根据源字符串调用构造函数构造一个tmp对象,然后再将tmp对象与拷贝对象的数据交换。先开辟空间,再将源对象的字符串拷贝给目标对象。相似,插入之前要先判断是否需要扩容。原创 2025-03-10 16:40:44 · 989 阅读 · 0 评论