
C++进阶
C++有效笔记
程序员萌芽
夜半荧屏映月华,
指尖飞舞写天涯。
代码千行凝智慧,
bug除尽见朝霞。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++的智能指针weak_ptr和普通指针的区别
两个share指针指向的资源中的share指针指向对方,这样析构的时候,两个指针的强引用计数都从2减到1,不为0,资源没有释放。用普通指针确实没有增加share指针的强引用计数,表面上看似解决了循环引用问题,实际上带来了普通指针的内存安全问题。我们之前说过weak_ptr可以用来解决share_ptr循环引用的问题,先来看看循环引用问题。改为weak指针,只引用不计数,不增加share指针中的强引用计数,可以正常释放资源。弱引用计数用于管理控制块,当强引用计数和弱引用计数均为0时释放控制块。原创 2025-04-03 11:51:46 · 253 阅读 · 0 评论 -
C++的优先队列priority_queue如何自定义排序
在C++中,是一个容器适配器,默认情况下它是一个最大堆,即队列顶部的元素是最大的,如果想自定义排序规则,可以通过提供一个自定义的比较函数或函数对象来实现。原创 2025-03-08 12:43:16 · 287 阅读 · 0 评论 -
线程之间的栈空间没有地址隔离
线程之间的栈空间没有地址隔离,这意味着线程可以访问到另一个线程的局部变量,通过地址原创 2025-02-25 16:25:03 · 238 阅读 · 0 评论 -
C++的std::sort函数自定义排序
对于数据类型是自定义的结构体或者是自定义的类,可以使用自定义函数排序或者lambda表达式自定义函数排序int age;// 按年龄升序排序// 使用自定义的比较函数排序return 0;lambda表达式int age;// 使用 Lambda 表达式按年龄升序排序// 按年龄升序排序});return 0;原创 2025-02-18 15:28:23 · 404 阅读 · 0 评论 -
C++二叉树那些事儿
二叉树一个节点有两个后驱节点,基本上二叉树的问题可以通过递归解决二叉搜索树左节点原创 2024-11-07 00:29:25 · 1118 阅读 · 0 评论 -
C++链表那些事儿
从一个数组里面取元素返回链表,如果数组是空返回空指针,不带头节点的,意味着第一个元素需要放到head指针里面去,然后从第二个元素开始放到链表尾,不断更新链表尾。访问链表,如果链表是空的直接返回,输出当前节点的值,更新当前节点。原创 2024-11-06 00:14:34 · 965 阅读 · 0 评论 -
share_ptr循环引用
此时这两个share指针的引用计数都是2,当node超过生命周期被析构时,node的引用计数变成1,不为0,那么node指向的类实例不会被析构,注意智能指针也是一个类,智能指针的析构和它指向的类实例的析构是两回事,程序中Node实例没有被析构导致p也不会析构。定义一个类,这个类有一个share指针变量,创建一个share指针指向这个类实例,然后将类实例的成员变量share指针也指向这个类实例。用weak指针解决循环引用问题,weak只引用资源不增加资源引用的计数。原创 2024-07-06 23:25:03 · 587 阅读 · 0 评论 -
C++手搓大整数类
char是8位的,short是16位的,int是32位的,最大的long long是64位的,也就是说基本的数据类型无法表示超过2的64次方-1的数。实现大整数有两种方法,一种是将大数当成字符来处理,手动计算加减乘除,另一种则是将大数分成多个小部分用基本类型存储处理。如今又到了找工作的时候了,面试手撕题少不了,听说这个手搓大整数也有过面试题,这里先搓一手,免得以后执手相看泪眼。我们这里实现第二种方法的。原创 2024-01-17 19:31:04 · 1273 阅读 · 1 评论 -
C++的std命名空间
std是标准库(Standard Library)的命名空间(namespace),标准库是C++语言提供的一组功能强大的函数、类和模板集合,它为开发者提供了各种常用的工具和功能,包括输入输出、容器、算法、字符串处理、文件操作等。命名空间(Namespace)是C++中一种用于解决命名冲突问题的机制,它能够将全局作用域划分为若干个不同的区域,每个区域内可以有相同名称的标识符,但它们之间彼此独立,不会发生冲突。要在代码中使用命名空间中的成员,我们可以通过命名空间名::成员名。但需要注意的是,过度使用。原创 2023-12-02 00:08:40 · 906 阅读 · 0 评论 -
C++的explicit和隐式转换
隐式转换是指在某些情况下,编译器会自动进行类型转换,将一种类型的值转换为另一种类型,以满足表达式的要求。这种转换是隐式进行的,不需要显式地调用转换函数或构造函数。但有时候我们希望禁止隐式类型转换,要求显式地调用构造函数进行类型转换,这就需要调用explicit来禁止隐式类型转换。上面这个转换是没有什么问题的,但是下面这个隐式转换就,怎么说,也是可以转换的。可以通过隐式调用带参构造函数进行转换,将基本类型转换为自定义类类型。explicit修饰使得该构造函数只能被显式调用,而不能被隐式调用。原创 2023-12-01 16:37:26 · 533 阅读 · 0 评论 -
C++ STL容器的push_back和emplace_back
在C++ STL(标准模板库)中,push_back和都是用于在容器尾部添加新元素的成员函数,但它们有一些重要的区别。push_back用于将一个已存在的元素副本添加到容器的尾部。这意味着它需要调用拷贝构造函数来创建一个元素的副本并将其添加到容器中。这对于已经存在的对象是非常有用的,但对于移动语义或避免额外的拷贝构造函数调用来说,可能不是最优的选择。原创 2023-11-28 20:02:49 · 639 阅读 · 0 评论 -
【C++11新特性】范围for循环
C++11引入了范围for循环,它是一种更简洁和易用的循环语法,用于遍历数组、容器类(例如。等)或支持迭代器的类型。原创 2023-11-28 19:48:43 · 586 阅读 · 0 评论 -
C++的const有什么用
关键字const在 C/C++ 中用于声明常量、防止函数修改参数或类成员变量,并增加程序的可读性和健壮性。关键字可以防止函数修改传入的参数的值。关键字来声明函数不会修改任何类成员变量。这种声明方式称为常量成员函数,它的定义和声明都需要加上。,它的值将被视为常量,即不能在程序执行过程中改变。声明方式为在变量类型前加上。可以提高代码的可维护性,并避免潜在的错误。在函数声明或定义时,可以将返回类型声明为。,表明函数返回的值是一个常量,不能被修改。在类中定义成员函数时,可以使用。在函数声明或定义时,使用。原创 2023-07-19 21:52:42 · 1628 阅读 · 0 评论 -
C++的虚函数与纯虚函数
C++的虚函数是一种特殊的成员函数,用于实现多态性。虚函数允许在基类中声明一个函数,在派生类中根据需要进行重写,并通过基类指针或引用来调用派生类对象的特定实现。派生类可以重写基类中的虚函数,以提供自己的实现。虚函数也可以被声明为纯虚函数,即没有默认实现的虚函数。虚函数使用动态绑定,即运行时将根据对象的实际类型选择正确的函数实现。通过将一个基类的指针或引用指向其派生类的对象,可以实现多态性。虚函数可以被继承,派生类可以选择是否重写虚函数。虚函数只能在类的成员函数中使用。静态成员函数不能是虚函数。原创 2023-07-19 21:38:37 · 1103 阅读 · 0 评论 -
【C++】transform
函数接受四个参数:两个表示输入范围的起始迭代器、一个表示输出范围的起始迭代器和一个可调用对象(即操作函数)。它遍历输入范围内的每个元素,将每个元素传递给操作函数进行处理,然后将结果写入到输出范围。是一个非常有用的算法函数,它能够将给定范围中的每个元素进行变换,并将变换后的结果存储到另一个范围中。是一个可调用对象(函数、函数对象或 Lambda 表达式),它将被应用于输入范围内的每个元素,并返回变换后的值。都会自动遍历输入范围内的每个元素,并将每个元素传递给操作函数进行变换,然后将结果写入到输出范围。原创 2023-07-10 20:16:22 · 1901 阅读 · 0 评论 -
【C++】for_each()
当给定一个容器范围,我们通常需要对其中的每个元素执行相同的操作。这样的操作可能包括打印元素、修改元素的值或应用一个自定义函数等等。函数时,我们可以选择使用函数对象、函数指针或 Lambda 表达式作为操作函数。是一个非常方便的算法函数,可用于对容器中的元素执行相同的操作。都会自动遍历容器范围内的每个元素,并将每个元素传递给操作函数进行处理。算法函数提供了一种方便的方式来对容器范围内的元素执行指定的操作。的函数对象,并重载了圆括号操作符,使其可以像函数一样调用。以下是一个简单示例,展示了如何使用。原创 2023-07-10 20:11:30 · 4584 阅读 · 0 评论 -
C++的模板特例化template<>
模板特例化可以为特定输入参数类型或值提供单独的实现,以便于我们对它们进行不同的处理。在C++中,我们可以通过类模板特例化和函数模板特例化来实现。在使用模板特例化时,需要注意避免出现模板的二义性,保证每种模板参数只有一种特例化版本。C++的模板特例化是指当我们定义了一个通用的模板类或模板函数时,如果特定输入参数类型或值需要进行不同的处理,我们可以为这些特定情况提供单独的实现,这就是模板特例化。这个模板类是一个通用的类,可以接受任何类型的T作为模板参数,并在print()函数中输出T的类型信息。原创 2023-06-12 13:52:21 · 997 阅读 · 0 评论 -
C++的Lambda函数
从C++11开始,C++也支持使用lambda表达式(匿名函数)。Lambda表达式是一种便捷的方式,可以定义一个函数对象,而无需使用显式的函数对象类型或函数指针语法。函数中,我们使用这个lambda表达式计算了两个整数的和,并输出结果。等STL算法中的函数。使用lambda表达式可以让代码更加简洁和紧凑。需要注意的是,lambda表达式也可以作为其他函数的参数,例如。关键字定义了一个lambda表达式,并将其赋值给变量。这个lambda表达式接受两个整数参数。在这个例子中,我们使用。原创 2023-06-07 22:59:01 · 601 阅读 · 0 评论