
c++基础知识
文章平均质量分 76
U_p_
记录学习历程 。 https://github.com/Jim1314520
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
define ,typedef和using的区别
`typedef` | 关键字 | 为已有类型定义别名 | 是 | 是 | 否 | 是 || `using` | 关键字 | 为类型或命名空间定义别名 | 是 | 是 | 是 | 是 |`using` 是 C++ 中的关键字,**可以用于命名空间、类型别名以及继承**。原创 2025-07-19 10:00:00 · 656 阅读 · 0 评论 -
匿名函数作递归函数引用
方法核心思想优点缺点适用场景按引用捕获包装器✅ 通用,C++11即可用✅ 调用语法自然f(5)⚠️必须按引用捕获❌ 有轻微性能开销兼容旧标准 (C++11) 或需要将 Lambda 存入容器的场合。泛型 Lambda将自身作为参数传递✅ 高性能,无额外开销✅ C++14即可用❌ 调用和递归语法稍显繁琐f(f, 5)性能敏感,且使用 C++14/17/20 的现代 C++ 项目。(当前主流推荐)语言层面直接支持自引用✅ 语法最简洁、最优雅✅ 高性能。原创 2025-07-11 21:00:00 · 928 阅读 · 0 评论 -
【无标题】
想象一下,你想要对一个vector容器进行排序,但排序的规则比较特殊,不是简单的升序或降序。定义一个独立的全局函数或静态成员函数// 某种复杂的比较逻辑这种方式的问题是,可能只在这里用一次,却污染了全局或类的命名空间。它与使用它的代码(std::sort)在物理上是分离的,降低了代码的内聚性。定义一个函数对象(Functor)这种方式将函数和其状态封装在了一起,比全局函数要好。但问题是,为了一个简单的、只用一次的比较逻辑,就需要定义一个完整的struct或class。原创 2025-07-10 21:45:00 · 798 阅读 · 0 评论 -
类模板的语法
类模板(class template)是 “类型的模板”——它将一个或多个类型参数或非类型参数抽象出来,让一个“通用的类框架”能在编译期被实例化成针对不同类型或不同值的具体类。通用代码复用静态多态在容器/工具类实现中最常见。原创 2025-07-09 20:00:00 · 313 阅读 · 0 评论 -
智能指针的注意事项
项目是否共享控制块❌ 否,各管各的✅ 是,共享引用计数是否多次delete❌ 可能✅ 不会是否会悬空指针✅ 有风险❌ 安全是否符合shared_ptr用法❌ 错误用法✅ 正确用法。原创 2025-06-27 15:18:58 · 226 阅读 · 0 评论 -
指针常量和常量指针
const 修饰谁,谁不能变。代码谁不能变*p,值不能变p,地址不能变两个都不能变。原创 2025-06-24 15:28:45 · 149 阅读 · 0 评论 -
c++读写锁
读写锁,顾名思义,是一种将“读”和“写”两种操作区分开来对待的同步原语。它允许多个线程同时进行读操作,但只允许一个线程进行写操作。为了更好地理解,我们可以将其与标准的互斥锁 (std::mutex互斥锁 (std::mutex:非常“霸道”。无论线程是想读还是想写,只要一个线程锁定了资源,其他任何线程都必须等待,不管它们想做什么。这就像一个只有一个座位的房间,一次只能进去一个人。读写锁 (:更加“智能”和高效。它遵循以下规则:读-读共享。原创 2025-06-19 22:00:34 · 416 阅读 · 0 评论 -
左值引用和右值引用
指的是有确定存储位置(地址)的对象,通常可以出现在赋值语句左侧。例如:变量名、解引用指针得到的对象、数组元素等都属于左值。一般指临时对象或字面常量,通常没有固定的存储地址,只能出现在赋值语句右侧。例如:字面量(42"hello")、表达式求值产生的临时结果(a + b、函数返回的非引用类型)等都属于右值。T&T&含义:引用一个,必须绑定到一个具有名字且可寻址的对象上。作用:可以通过引用直接操作原对象,不产生拷贝;常用于函数参数(接收可修改的实参)或延长临时对象的生命周期(使用const T&T&&原创 2025-06-03 21:39:04 · 1204 阅读 · 0 评论 -
socket通信中的accept函数
m_sockfd参数输入 / 输出作用m_sockfd输入哪个监听 socket 来 acceptaddr输出客户端地址将被写到这里addr_len输入 + 输出告诉系统结构体多大、系统写入实际使用大小。原创 2025-05-16 10:19:38 · 527 阅读 · 0 评论 -
queue容器的成员函数
std::queue是一个容器适配器,底层默认使用std::deque。原创 2025-05-15 14:27:40 · 259 阅读 · 0 评论 -
mutable的作用
(若对象本身是常量)。原创 2025-05-15 14:15:15 · 418 阅读 · 0 评论 -
rsize和reserve的不同
函数改变size()改变capacity()构造元素常用用途reserve(n)❌ 否✅ 是❌ 否优化性能、减少扩容次数resize(n)✅ 是✅ 可能✅ 是设置真实元素个数。原创 2025-05-09 09:21:05 · 304 阅读 · 0 评论 -
在c++中static用在全局和局部有什么区别
在 C++ 中,static关键字的作用会根据其使用的上下文(全局作用域、局部作用域等)有所不同。原创 2025-05-08 16:36:18 · 899 阅读 · 0 评论 -
c++初始化结构列表
初始化列表不是赋值!必须用它来初始化 const、引用、无默认构造的成员和基类!成员初始化顺序由声明顺序决定,不是你列表里写的顺序!原创 2025-05-06 11:25:13 · 214 阅读 · 0 评论 -
静态成员变量和静态成员函数
public:// 仅声明:告诉编译器有这个变量count = 10;// ✅ 可以访问// 这一句是“定义 + 初始化”如果你没有这一句定义,即使你在foo()里使用countclass A {// ✅ 这不是定义类的静态成员变量,而是定义函数内的静态局部变量这里x是foo()里的局部变量,跟类成员无关。而A::x仍然必须类外定义。需求写法是否合法声明静态成员变量(类内)✅定义静态成员变量(分配内存)✅ 必须静态函数中访问静态变量x = 10;(类作用域内)✅。原创 2025-05-05 10:30:00 · 194 阅读 · 0 评论 -
new的几种形式
C++ 中new不只是“分配内存”,它是类型感知的对象创建机制,支持构造、析构、对齐和自定义行为,远比malloc灵活强大。原创 2025-05-02 15:07:53 · 282 阅读 · 0 评论 -
new和malloc的区别
new= 分配内存 + 构造对象 + 类型安全 + 异常语义;malloc= 只要一块原始字节,剩下的你自己负责。掌握两者差异,才能在系统编程与高性能场景中游刃有余。是的,你理解得基本正确操作newdeletemallocfree内存分配自动完成手动构造函数调用自动(带参数或默认)❌ 不会;需手动析构函数调用自动❌ 不会;需手动对象->~类名()安全性 / 易错性高,配合 RAII 可防泄漏容易出错,忘构造或析构都会导致 UB 或泄漏malloc。原创 2025-05-02 15:07:11 · 615 阅读 · 0 评论 -
C++中const与constexpr的区别
**特性** | **编译时** | **运行时** || **对象构造** | 运行时构造 | 允许编译时构造(需 constexpr 构造函数) || **初始化时机** | 编译时或运行时 | 必须编译时 |原创 2025-04-17 14:58:43 · 826 阅读 · 0 评论 -
在main函数中编写匿名函数
/ 定义一个 Lambda 表达式(匿名函数)" << endl;// 调用它sayHello();// 输出:Hello from Lambda!return 0;用法类型示例最简单带参数带返回类型捕获外部变量值捕获引用立即执行}(3, 4);原创 2025-04-01 15:19:22 · 204 阅读 · 0 评论 -
char int string 的互相转换
stringintC++string或char[])和int),它们的存储方式和操作方式不同。原创 2025-03-06 16:44:11 · 493 阅读 · 0 评论 -
智能指针的初步探索
return a;返回类型int*: 该函数返回一个指向整数的指针。new操作符在堆(动态内存)上分配一个整数空间,并初始化为10。返回一个指向该整数的指针。int* a: 声明一个指针a,指向新分配的整数。return a;: 返回指针a,使得调用者可以访问该动态分配的整数。这段代码通过动态内存分配演示了指针的使用和内存管理的重要性。动态内存分配: 使用new在堆上分配内存。指针操作: 使用指针访问和操作动态分配的内存。内存释放: 使用delete释放分配的内存,防止内存泄漏。原创 2025-01-16 09:43:27 · 782 阅读 · 0 评论 -
类型之间的转换
std::stoi和(int)在功能和用途上有显著的区别,主要体现在和上。原创 2025-01-14 16:56:02 · 1079 阅读 · 0 评论 -
getling,find, substr,repalce的用法
为什么使用getline?getline能够读取包含空格的完整句子,而cin只能读取以空白字符为分隔符的单词。为什么需要清除换行符?cin >>操作后,换行符\n可能残留在输入缓冲区中。如果不清除,getline会读取这个换行符,导致跳过输入。如何清除换行符?使用,可以清除缓冲区中的多余字符(如换行符)。find:用于查找字符串中字符或子字符串的索引位置。substr:用于提取字符串的子串。replace:用于替换字符串中的某部分内容。这三个函数结合,可以高效地实现字符串的查找、提取和替换功能。原创 2025-01-14 16:24:36 · 814 阅读 · 0 评论 -
int ,long long ,unsigned int\long long 的表示范围
int是基本整数类型,通常占用4字节(32位)内存(在现代主流系统中)。有符号的int使用补码(Two's Complement)表示法,因此它的范围是:正数:包括零。负数:最小值由最高位(符号位)决定。long long是比int更大的整数类型,占用8字节(64位)内存。它也可以是有符号或无符号类型。原创 2025-01-14 14:46:16 · 2095 阅读 · 0 评论 -
c++中的友元
打破封装:友元关系允许特定的函数或类访问类的私有成员和保护成员,这有时在实际开发中是必须的,例如操作符重载、复杂的类间协作等场景。提升功能:通过友元函数或友元类,某些外部函数或类可以访问类的私有成员,执行一些通常只有类的成员函数才能执行的操作。控制访问范围:友元关系是受限制的,不是所有函数或类都可以访问类的私有成员,只有被声明为友元的特定函数或类才有权限。友元函数:允许外部函数访问类的私有成员。友元类:允许另一个类的成员访问类的私有成员。友元成员函数:允许另一个类的成员函数访问类的私有成员。原创 2025-01-10 14:59:36 · 861 阅读 · 0 评论 -
next_permutation 和 std::prev_permutation
这个函数将给定的容器排列到下一个字典序的排列。如果当前排列已经是最大的字典序排列,则返回false,并且容器会被重排为最小的字典序排列。原型这个函数将给定的容器排列到上一个字典序的排列。如果当前排列已经是最小的字典序排列,则返回false,并且容器会被重排为最大的字典序排列。原型和函数是从C++98标准开始就引入的。它们通过字典序生成排列,适用于任何容器类型(如std::array)的排列操作。这两个函数广泛应用于需要全排列或组合生成的场景,例如算法、数学问题、游戏设计等。原创 2025-01-09 10:45:00 · 351 阅读 · 0 评论 -
lower_bound 和 upper_bound
假设有一组自定义结构体,需要按某个字段排序并查找,可以通过提供自定义比较函数来使用和。int age;// 比较函数,根据年龄排序// 按年龄排序(假设已排序)// 查找第一个不小于30岁的人员});if (lb!// 查找第一个大于30岁的人员});if (ub!return 0;输出和是在有序序列中执行高效查找的强大工具。理解它们的工作原理和正确使用方式,可以大大提升代码的性能和可读性。原创 2025-01-09 12:00:00 · 874 阅读 · 0 评论 -
strcpy和memcpy的区别
strcpymemcpystrcpychar*<cstring>\0'\0'memcpy<cstring>strcpysrc\0memcpysrcnum\0'\0'\0'\0''\0''\0'strcpy适用于复制字符串(字符数组)。它会自动处理字符串结束符\0。memcpy适用于复制任意类型的内存块,比如结构体、字节数组等。它不会处理\0,只是按字节数复制。原创 2025-01-08 17:27:15 · 782 阅读 · 0 评论 -
setfill, fill 和 memset 的用法
是 C 标准库中的一个函数,用于快速初始化一段内存。它可以将某个值填充到指定的内存区域,通常用于清零或设置某种固定值。是 C++ 标准库中的一个函数,用于快速填充容器或数组的某个范围的元素为指定值。是 C++ 标准库中的算法函数,用于填充数组或容器的某个范围内的元素为指定值。一起使用时,可以指定一个固定宽度,当输出的内容不足该宽度时,用填充字符补齐。针对容器/数组填充。在现代 C++ 中,可以使用更安全、更高效的方式代替。设置输出时用来填充指定宽度的空白字符。的所有元素(包括起点但不包括终点)设置为。原创 2025-01-08 17:03:46 · 1180 阅读 · 0 评论 -
this指针
是用构造函数初始化对象p,并将30作为参数传递给构造函数。通常在表达式中用来创建临时对象,尤其是在赋值操作符中。原创 2025-01-07 16:14:43 · 917 阅读 · 0 评论 -
类对象作为类成员
对于包含多个成员变量(特别是对象类型成员)的类,使用初始化列表是最佳实践。初始化列表能够提高效率,避免多余的构造和赋值操作。通过初始化列表可以确保成员变量按照正确的顺序初始化,并且对于const或引用类型成员,初始化列表是唯一可行的方式。原创 2025-01-07 14:53:20 · 679 阅读 · 0 评论 -
707. 设计链表 链表的知识复习
默认构造函数:不带任何参数,创建一个val为0next为nullptr的节点。带一个参数的构造函数:只传入一个val参数,next默认为nullptr。常用于创建值已知但不关心next的节点。带两个参数的构造函数:同时传入val和next,用于创建值已知并且与其他节点连接的节点。这三种构造函数提供了不同的初始化方式,使得你可以灵活地创建和管理链表节点,特别是在处理链表时。是的,虚拟头节点(dummy head)会作为链表中的第一个节点,但它的作用并不是作为链表数据的 "实际头节点"。原创 2024-12-16 21:51:15 · 1249 阅读 · 0 评论 -
c++基础知识
在 C++ 中, 这种写法是错误的,原因是 数组引用 的语法不正确。让我来详细解释一下:在这里,你尝试使用 来声明 参数,意图是通过引用传递数组。但是,这种写法是不合法的。数组本身不能作为引用类型,因为数组类型的引用是有特殊语法要求的。如果你希望通过引用修改数组的内容,可以使用以下几种方式:通过指针传递数组(常见做法): 数组在函数传递时本质上是作为指针传递的。你传入数组时,实际上是传递了数组的首地址(即指向数组第一个元素的指针)。因此,使用指针参数是处理数组的标准做法。 在这种情况下, 是原创 2024-12-11 13:45:00 · 1367 阅读 · 0 评论