c++
文章平均质量分 93
庞小二
无
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++类型转换
但对于单参数的自定义类型来说,A a2 = 1这种代码的可读性不是很好,因此可以用explicit修饰单参数的构造函数,从而禁止单参数构造函数的隐式转换。C语言和C++都是强类型语言,如果赋值运算符左右两侧变量的类型不同,或形参与实参的类型不匹配,或返回值类型与接收返回值的变量类型不一致,那么就需要进行类型转换。其中,向上转型就是所说的切割/切片,是语法天然支持的,不需要进行转换,而向下转型是语法不支持的,需要进行强制类型转换。dynamic_cast用于将父类的指针(或引用)转换成子类的指针(或引用)原创 2025-07-03 13:35:04 · 1049 阅读 · 0 评论 -
C++智能指针
而如果连接结点时只进行一个连接操作,那么当node1和node2的生命周期结束时,就会有一个资源对应的引用计数被减为0,此时这个资源就会被释放,这个释放后另一个资源的引用计数也会被减为0,最终两个资源就都被释放了,这就是为什么只进行一个连接操作时这两个结点就都能够正确释放的原因。其次,shared_ptr中的引用计数count也不能定义成一个静态的成员变量,因为静态成员变量是所有类型对象共享的,这会导致管理相同资源的对象和管理不同资源的对象用到的都是同一个引用计数。原创 2025-07-03 11:50:09 · 852 阅读 · 0 评论 -
C++异常
实际中很多公司都会自定义自己的异常体系进行规范的异常管理。公司中的项目一般会进行模块划分,让不同的程序员或小组完成不同的模块,如果不对抛异常这件事进行规范,那么负责最外层捕获异常的程序员就非常难受了,因为他需要捕获大家抛出的各种类型的异常对象因此实际中都会定义一套继承的规范体系,先定义一个最基础的异常类,所有人抛出的异常对象都必须是继承于该异常类的派生类对象,因为异常语法规定可以用基类捕获抛出的派生类对象,因此最外层就只需捕获基类就行了。原创 2025-06-30 14:01:20 · 928 阅读 · 0 评论 -
C++11--线程库
因此可能当线程1刚将n的值加载到寄存器中就被切走了,也就是只完成了++操作的第一步,而线程2可能顺利完成了一次完整的++操作才被切走,而这时线程1继续用之前加载到寄存器中的值完成剩余的两步操作,最终就会导致两个线程分别对共享变量n进行了一次++操作,但最终n的值却只被++了一次。多线程最主要的问题是共享数据带来的问题(即线程安全)。线程函数的参数是以值拷贝的方式拷贝到线程栈空间中的,就算线程函数的参数为引用类型,在线程函数中修改后也不会影响到外部实参,因为其实际引用的是线程栈中的拷贝,而不是外部实参。原创 2025-06-23 17:13:46 · 943 阅读 · 0 评论 -
C++11--包装器
function是一种函数包装器,也叫做适配器。Ret:被包装的可调用对象的返回值类型Args…:被包装的可调用对象的形参类型public:class Pluspublic:int main()//1、包装函数指针(函数名)//2、包装仿函数(函数对象)//3、包装lambda表达式//4、类的静态成员函数//&可省略//5、类的非静态成员函数//&不可省略return 0;原创 2025-06-17 15:27:34 · 967 阅读 · 0 评论 -
C++11--Lambda表达式
现在要对若干商品分别按照价格和数量进行升序、降序排序。仿函数确实能够解决这里的问题,但可能仿函数的定义位置可能和使用仿函数的地方隔得比较远,这就要求仿函数的命名必须要通俗易懂,否则会降低代码的可读性这样一来,每次调用sort函数时只需要传入一个lambda表达式指明比较方式即可,阅读代码的人一看到lambda表达式就知道本次排序的比较方式是怎样的,大大提高代码的可读性。原创 2025-06-16 16:55:06 · 948 阅读 · 0 评论 -
C++11--可变模板参数
返回类型 函数名(Args… args)//函数体{}模板参数Args前面有省略号,代表它是一个可变模板参数,我们把带省略号的参数称为参数包,参数包里面可以包含0到N ( N ≥ 0 ) N(N\geq 0)N(N≥0)个模板参数,而args则是一个函数形参参数包模板参数包Args和函数形参参数包args的名字可以任意指定,并不是说必须叫做Args和argsint main()ShowList();return 0;//获取参数包中参数的个数。原创 2025-06-13 10:07:15 · 1277 阅读 · 0 评论 -
C++11--类的新功能
上述代码中用一个右值去构造s2对象,但由于Person类没有生成默认的移动构造函数,因此这里会调用Person的拷贝构造函数(拷贝构造既能接收左值也能接收右值),这时在Person的拷贝构造函数中就会调用string的拷贝构造函数对name成员进行深拷贝。如果要让Person类生成默认的移动构造函数,就必须将Person类中的拷贝构造、拷贝赋值和析构函数全部注释掉,这时用右值去构造s2对象时就会调用Person默认生成的移动构造函数。原创 2025-06-11 15:02:05 · 853 阅读 · 0 评论 -
C++11 -- 右值引用和移动语义
上述代码中的插入第一个元素时就会匹配到push_back的左值引用版本,在push_back函数内部就会调用string的拷贝构造函数进行深拷贝,而插入后面三个元素时由于传入的是右值,因此会匹配到push_back的右值引用版本,此时在push_back函数内部就会调用string的移动构造函数进行资源的转移。移动赋值是一个赋值运算符重载函数,该函数的参数是右值引用类型的,移动赋值也是将传入右值的资源窃取过来,占为己有,这样就避免了深拷贝,所以它叫移动赋值,就是窃取别人的资源来赋值给自己的意思。原创 2025-05-27 11:47:52 · 1043 阅读 · 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 · 893 阅读 · 0 评论 -
特殊类设计
单例模式是一种设计模式(Design Pattern),设计模式就是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式的目的就是为了可重用代码、让代码更容易被他人理解、保证代码可靠性程序的重用性单例模式指的就是一个类只能创建一个对象,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。原创 2025-05-15 14:37:25 · 798 阅读 · 0 评论 -
哈希应用--海量数据处理
海量数据处理是指基于海量数据的存储和处理,正因为数据量太大,所以导致要么无法在短时间内迅速处理,要么无法一次性装入内存对于时间问题,就可以采用位图、布隆过滤器等数据结构来解决对于空间问题,就可以采用哈希切割等方法,将大规模的数据转换成小规模的数据逐个击破。原创 2025-05-09 14:23:47 · 718 阅读 · 0 评论 -
布隆过滤器
所以布隆过滤器没有提供删除的接口,因为使用布隆过滤器本来就是要节省空间和提高效率的。首先,布隆过滤器可以实现为一个模板类,因为插入布隆过滤器的元素不仅仅是字符串,也可以是其他类型的数据,只有调用者能够提供对应的哈希函数将该类型的数据转换成整型即可,但一般情况下布隆过滤器都是用来处理字符串的,所以这里可以将模板参数K的缺省类型设置为string。此外,哈希函数的个数也需要权衡,哈希函数的个数越多布隆过滤器中比特位被设置为1的速度越快,并且布隆过滤器的效率越低,但如果哈希函数的个数太少,也会导致误判率变高。原创 2025-05-09 14:21:19 · 835 阅读 · 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 · 1020 阅读 · 0 评论 -
C++STL(九) :bitset的介绍与使用
假设面试官考了你一道题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中?将这一堆数进行排序,然后通过二分查找的方法判断该数是否在这一堆数中将这一堆数插入到unordered_set容器中,然后调用find函数判断该数是否在这一堆数中单从时间复杂度上来看,这两种方法都是可以,而且效率也不错,第一种方法的时间复杂度是O(NlogN),第二种方法的时间复杂度是O(N)原创 2025-04-27 19:56:02 · 1042 阅读 · 0 评论 -
C++STL(八) :unordered_set、unordered_map的模拟实现
data存放节点的值_next指向下个节点T _data;{}_table存放HashNode_n是哈希表的实际存储数量,用来计算负载因子//哈希结点类型public://...private://哈希表//哈希表中的有效元素个数。原创 2025-04-24 14:36:47 · 1175 阅读 · 0 评论 -
C++STL(七) :unordered_set、unordered_map的介绍及使用
唯一性类似set,所有元素唯一(不允许重复键值)插入重复元素时,操作会被忽略(可通过返回值判断是否成功)无序性元素顺序由哈希函数决定,遍历时无法预测顺序与set(基于红黑树的有序容器)形成对比哈希表实现底层通过哈希表存储元素,支持平均O(1)时间复杂度的插入、删除和查找操作最坏情况下(如哈希冲突严重)时间复杂度退化为O(n)动态调整哈希表的桶(bucket)数量会根据元素数量动态扩展/收缩,以平衡性能与内存占用方式一: 构造一个某类型的空容器//构造int类型的空容器。原创 2025-04-22 16:54:22 · 801 阅读 · 0 评论 -
c++ map与unordered_map的比较
在c++的STL库中,有map与unordered_map这两种名字十分相似的容器,但是他们的区别还是很大,下面我们从和进行逐一比较。原创 2025-04-18 14:07:53 · 393 阅读 · 0 评论 -
C++ 多态
必须通过基类的指针或者引用调用虚函数被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。原创 2025-04-18 14:06:58 · 1226 阅读 · 0 评论 -
C++ 继承
public继承protected继承private继承基类当中被不同访问限定符修饰的成员,以不同的继承方式继承到派生类当中后,该成员最终在派生类当中的访问方式将会发生变化public继承protected继承private继承基类的public成员派生类的public成员派生类的protected成员派生类的private成员基类的protected成员派生类的protected成员派生类的protected成员派生类的private成员基类的private成员。原创 2025-04-16 14:27:02 · 798 阅读 · 0 评论 -
C++ IO流
在 C++ 中,“流(Stream)” 是一种 抽象的数据传输机制,它通过统一的接口实现了程序与各种输入/输出设备(如键盘、屏幕、文件、内存等)之间的数据流动。流的核心思想是将数据的输入输出操作统一为连续的字节序列处理,提供类型安全和可扩展的操作方式C++ 标准库中的流主要分为三类:流与传统C函数的对比:C++标准库提供了4个全局流对象:注意事项:输入数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置(置1),程序继续空格和回车都可以作为数据之间的分隔符,所以多个数原创 2025-04-16 14:22:29 · 981 阅读 · 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 · 877 阅读 · 0 评论 -
C++模板进阶--非类型模板参数、模板特化以及模板分离编译
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链接起来形成单一的可执行文件的过程称为分离编译模式。原创 2025-04-14 12:33:38 · 959 阅读 · 0 评论 -
C++STL(六) :set与map的模拟实现
需要注意的是,反向迭代器只接收了一个模板参数,即正向迭代器的类型,也就是说,反向迭代器不知道结点的引用类型和结点的指针类型,因此我们需要在正向迭代器当中对这两个类型进行typedef,这样反向迭代器才能通过正向迭代器获取结点的引用类型和结点的指针类型。实现红黑树的正向迭代器时,一个结点的正向迭代器进行–操作后,应该根据红黑树中序遍历的序列找到当前结点的前一个结点。,用于获取T当中的键值Key,这样一来,当底层红黑树当中需要比较两个结点的键值时,就可以通过这个仿函数来获取T当中的键值了。原创 2025-04-03 14:47:26 · 1166 阅读 · 0 评论 -
C++STL(五) :priority_queue的模拟实现
优先级队列默认使用vector作为其底层存储数据的容器,在vector上又使用了堆算法将vector中的元素构造成堆的结构,因此priority_queue就是堆,所有需要用到堆的位置,都可以考虑使用priority_queue,默认情况下priority_queue是大堆使用vector作为底层容器,内部构造大堆结构使用vector作为底层容器,内部构造小堆结构不指定底层容器和内部需要构造的堆结构,此时默认使用vector作为底层容器,内部默认构造大堆结构。原创 2025-03-31 16:57:24 · 856 阅读 · 0 评论 -
C++STL(四):stack和queue的模拟实现
容器适配器:以某种已有的既定容器作为底层结构,在其基础上进一步地进行,使其可以满足某种特性STL六大组件中配接器中的stack,queue,priority_queue就是通过封装其他容器实现的。原创 2025-03-24 22:37:26 · 398 阅读 · 0 评论 -
C++STL(三) :list的模拟实现
1。原创 2025-03-23 21:59:37 · 1114 阅读 · 0 评论 -
C++STL(二)vector的模拟实现
start指向整个容器的首部_finish指向最后一个有效数据_endofstorage指向整个容器的尾部。原创 2025-03-21 15:59:12 · 799 阅读 · 0 评论 -
C++STL(一):string类的模拟实现
为了让string对象能够像内置类型一样使用>>运算符直接输入,我们需要先将对象的C字符串置空,然后从标准输入流读取字符,直到读取到’ ‘或是’\n’便停止读取。实现时于>>运算符的重载基本相同,只是当读取到’\n’的时候才停止读取字符。_str在开辟新空间之前需要先将原来的空间释放掉,并且在进行操作之前还需判断是否是自己给自己赋值。先根据源字符串调用构造函数构造一个tmp对象,然后再将tmp对象与拷贝对象的数据交换。先开辟空间,再将源对象的字符串拷贝给目标对象。相似,插入之前要先判断是否需要扩容。原创 2025-03-10 16:40:44 · 1020 阅读 · 0 评论
分享