
c++
c++常见知识点整理
Liuuuu408
这个作者很懒,什么都没留下…
展开
-
快速幂算法
函数pow_mod计算 (x^y \mod \text{mod}) 的值,其中 (x) 是基数,(y) 是指数,(\text{mod}) 是模数。它使用的是“快速幂”算法,这是一种高效计算大整数幂的方法,并在每一步计算中都取模以防止溢出。这个算法的时间复杂度是 (O(\log y))。原创 2024-07-30 09:07:05 · 230 阅读 · 0 评论 -
stringstream的使用
是一个强大的工具,用于在内存中处理字符串数据。它提供了灵活的格式化和解析功能,适合在需要频繁进行字符串操作的应用场景中使用。相比传统的C风格字符串操作,提供了更安全和更便捷的接口,有助于提高代码的可读性和维护性。原创 2024-06-18 13:37:06 · 1599 阅读 · 0 评论 -
c++ bitset使用方法
是C++中用于处理二进制位的标准库类,它允许你以一种直观的方式操作二进制位。原创 2024-01-25 09:20:21 · 706 阅读 · 0 评论 -
mian函数中exit(0)是什么意思
在实际应用中,程序员可以根据需要选择适当的返回值。这些返回值可以在调用程序中进行解释,以了解程序的执行状态。例如,在Unix/Linux系统中,可以通过在终端中运行。是用于正常退出程序的方式。这行代码的含义是让程序在此处结束执行,并返回操作系统。通常表示程序成功执行,而非零值通常用于表示程序在执行过程中发生了错误。是一种正常退出程序的方式,通常用于表示程序成功执行。命令查看最近运行的程序的退出状态。原创 2024-01-20 21:43:41 · 1013 阅读 · 0 评论 -
什么是RAII?
当FileHandler对象的生命周期结束(如函数返回时),其析构函数会被调用,文件会被自动关闭。这种方法不仅代码清晰,而且能有效避免资源泄漏,特别是在遇到异常情况时。在C++中,RAII通常通过类的构造函数进行资源获取,通过析构函数进行资源释放来实现。当对象创建时,其构造函数会获取必要的资源,当对象超出作用域时,其析构函数会被自动调用,释放资源。它是一种编程习惯,通常用于C++等语言,用于管理资源,如内存、文件句柄、网络连接等。资源在对象初始化时获取,在对象销毁时自动释放。原创 2024-01-12 10:05:16 · 505 阅读 · 0 评论 -
nth_element
将第 n(由迭代器指定)小的元素移动到正确的位置,并保证该元素左侧的所有元素都不大于它,右侧的所有元素都不小于它。是 C++ 标准库中的一个算法,用于对指定范围的元素进行部分排序。这个算法在给定范围内的元素中,它的效率在处理大型数据集时比完全排序要高,因为它只关心排在中间位置的元素。这个函数还可以自己指定谓词, 即排序规则, 用来找第n大的元素(逆向思维也可以)这个函数的时间复杂度为 O(N),其中 N 是。处的元素是整个范围中的第。中的元素重新排列,使得。处的元素为整个范围中第。原创 2023-12-29 09:08:58 · 2323 阅读 · 1 评论 -
c++线程同步之条件变量
wait_until()函数和wait_for()的功能是一样的,它是指定让线程阻塞到某一个时间点,假设阻塞的线程没有被其他线程唤醒,当到达指定的时间点之后,线程就会自动解除阻塞,继续向下执行。wait_for()函数和wait()的功能是一样的,只不过多了一个阻塞时长,假设阻塞的线程没有被其他线程唤醒,当阻塞时长用完之后,线程就会自动解除阻塞,继续向下执行。)的功能是一样的,只不过多了一个阻塞时长,假设阻塞的线程没有被其他线程唤醒,当阻塞时长用完之后,线程就会自动解除阻塞,继续向下执行。原创 2023-12-13 11:13:38 · 1018 阅读 · 0 评论 -
c++互斥锁
这是因为线程在运行的时候需要先得到CPU时间片,时间片用完之后需要放弃已获得的CPU资源,就这样线程频繁地在就绪态和运行态之间切换,更复杂一点还可以在就绪态、运行态、挂起态之间切换,这样就会导致线程的执行顺序并不是有序的,而是随机的混乱的,就如同下图中的这个例子一样,理想很丰满现实却很残酷。 在上面的例子中,通过一个while循环不停的去获取超时互斥锁的所有权,如果得不到就阻塞1秒钟,1秒之后如果还是得不到阻塞50毫秒,然后再次继续尝试,直到获得互斥锁的所有权,跳出循环体。原创 2023-12-12 16:07:21 · 1036 阅读 · 0 评论 -
call_once
比如:要初始化某个对象,而这个对象只能被初始化一次,就可以使用std::call_once()来保证函数在多线程环境下只能被调用一次。通过输出的结果可以看到,虽然运行的三个线程中都执行了任务函数do_something()但是call_once()中指定的回调函数只被执行了一次,我们的目的也达到了。是 C++ 标准库提供的一个函数,用于保证一个函数只会被调用一次,即使在多线程环境下也能确保线程安全。主要用于执行只需要执行一次的初始化操作。原创 2023-12-11 20:38:11 · 1046 阅读 · 0 评论 -
原码、补码、反码、移码区别及转换
总的来说,原码、反码、补码是计算机内部常用的有符号整数表示方式,其中补码是最常用的表示方法,因为它能够简化数值运算,并且能够正确表示负数、零和正数。- 补码的加减法运算可以简化为普通的二进制加法运算,且不会出现反码溢出的问题,同时也可以正确表示正零和负零。- 原码是最简单直观的表示方法,最高位表示符号位(0表示正数,1表示负数),其余位表示数值的绝对值。- 负数的补码表示方式在数值位取反的基础上再加1,正数的补码与原码相同。- 负数的反码表示方式保留了原码的符号位,但数值位取反。- 正数的反码与原码相同。原创 2023-06-08 16:33:14 · 3710 阅读 · 1 评论 -
c++递增运算符重载
上述示例中,`MyClass`类定义了一个私有成员变量`value`,并重载了前缀递增运算符`operator++()`和后缀递增运算符`operator++(int)`。在`main()`函数中,我们创建了一个`MyClass`对象`obj`,并演示了如何使用前缀和后缀递增运算符来递增对象的值。要重载递增运算符,你需要在类中定义一个名为"operator++"的成员函数。根据你想要的前缀递增或后缀递增,你可以重载两个版本的递增运算符:"operator++()"和"operator++(int)"。原创 2023-05-23 15:32:50 · 252 阅读 · 1 评论 -
虚析构函数的使用
安全的派生类销毁:如果一个类被用作基类,而且有可能通过基类指针或引用删除派生类对象时,应该将基类的析构函数声明为虚函数,以确保派生类对象的析构函数被正确地调用。如果基类的析构函数不是虚函数,删除派生类对象时将只调用基类的析构函数,而不会调用派生类的析构函数。多态的析构:当使用基类指针或引用删除(delete)一个指向派生类对象的指针时,如果基类的析构函数是虚函数,则会调用派生类的析构函数,从而确保正确地销毁对象的所有资源。这是因为在运行时,通过动态绑定选择要调用的析构函数版本。原创 2023-06-16 10:23:08 · 135 阅读 · 1 评论 -
非标准语法;请使用&来创建指向成员的指针
出现这种错误时有一种可能是在调用函数时,没在最后加上括号,导致出错。找了半天没发现错误,于是尝试把 .h 中的声明删掉,问题解决。这里介绍另一种原因。原创 2023-05-31 21:01:38 · 1804 阅读 · 1 评论 -
c++引用做函数参数和指针做函数参数的区别
如果不需要修改传递的对象,并且对象不能为空,可以使用引用。- 指针在声明时可以不进行初始化,或者可以使用`nullptr`进行初始化。对指针的修改不会自动反映到原始对象上,需要通过解引用操作符`*`来访问和修改指针指向的对象。- 使用指针作为函数参数时,需要在函数内部进行空指针检查,以确保指针是有效的,以避免访问空指针而导致程序崩溃。在函数参数中使用指针时,可以将指针设置为`nullptr`或空指针。- 使用引用作为函数参数时,不需要进行空指针检查,因为引用必须在初始化时指向有效的对象。原创 2023-05-23 14:54:22 · 1534 阅读 · 4 评论 -
对象含有与成员函数不兼容的类型限定符
结果在this哪里就出现了图1的错误,然后将length() 函数也设为常函数,就没问题了,应该就是两个函数一个是常函数,一个不是常函数导致的,自己使用常函数不够熟练,偶尔用。两个函数如果都不是常函数的话也没问题。原创 2023-06-09 15:45:19 · 474 阅读 · 0 评论 -
this != &other 这个是什么意思
&other` 的目的是确保赋值操作不会自我赋值。如果 `this`(当前对象)的地址与 `&other`(另一个对象)的地址相同,那么它们是同一个对象,即自我赋值。在这种情况下,赋值操作不需要执行任何操作,直接返回当前对象的引用 `*this`。自我赋值是指将一个对象赋值给自身,例如 `str1 = str1`。可以理解为 `this` 是一个指向当前对象的指针,而 `&other` 是指向另一个对象的指针。= &other` 是一个指针比较操作,用于检查当前对象的地址是否与另一个对象的地址不同。原创 2023-06-09 12:17:10 · 437 阅读 · 0 评论 -
C++报错:引发了异常: 读取访问权限冲突。
比如这种情况,需要同时创建三个对象,需要用到的指针参数可能重复,每个新创建的对象都需要对指针进行初始化,否则就会出现报错。其中前两台电脑的零件部分即为初始化过程,第三台电脑直接在创建电脑过程进行了初始化,效果是一样的。在测试函数中,需要重复使用指针,但未进行指针初始化处理,就容易出现这种报错情况。原创 2023-04-19 10:54:45 · 2609 阅读 · 1 评论 -
find_if源码分析
find_if的三个参数:前两个为要搜索的区间的起始迭代器和末尾迭代器,begin与end;第三个参数为仿函数,仿函数中包括了你自己设置的条件。从起始开始遍历一直到end的位置,直到找到符合条件的第一个值,然后break,返回这个值对应的迭代器,如果没找到,返回end迭代器。原创 2023-05-11 15:19:00 · 90 阅读 · 1 评论 -
c++里double与float的区别
由于`double`提供了更高的精度,所以在大多数情况下,当需要更高的数值精度时,程序员会选择使用`double`类型。然而,`double`类型需要更多的存储空间,而且在某些嵌入式系统或移动设备中可能会受到限制。总的来说,选择使用`float`还是`double`取决于你的应用需求。如果你需要更高的精度并且内存空间足够,那么使用`double`是一个不错的选择。如果你在嵌入式系统或移动设备中工作,并且需要节省内存空间,那么可以考虑使用`float`。它们主要的区别在于精度和存储空间。原创 2023-10-26 22:44:13 · 1759 阅读 · 0 评论 -
检索与索引的区别
索引是指将大量的信息或数据进行组织和结构化,以便于后续的检索操作。在信息检索系统中,索引通常是一个用于存储和管理文档或数据的结构,其中包含关键词、术语、摘要或其他描述性信息。检索是指根据用户的需求,从索引或存储系统中获取相关的信息或数据。检索过程通常是通过用户提供的查询来执行的,查询可以包含关键词、短语、问题等形式。简而言之,索引是信息的结构化存储和组织方式,而检索是根据用户需求从索引中获取相关信息的过程。索引是为了提高检索效率和准确性而创建的,而检索是用户与信息之间的交互过程。原创 2023-07-03 15:17:44 · 1545 阅读 · 1 评论 -
类成员的快速初始化
可以看出,在类内部对三个值初始化为 1 2 3. 但在test01中通过初始化列表的方式重新对三个变量赋值,将之前的值进行了覆盖。首先是在定义类的时候可以在类内部直接对非静态成员变量进行初始化(这一点其实都知道),静态成员仍然是类内声明,类外初始化。这里可以看到,初始化的时候使用大括号的话,等号加不加都可以。c++11中允许在变量初始化的时候使用等号和大括号。s1初始化的时候使用了小括号,这是错误的。原创 2023-10-12 16:42:13 · 78 阅读 · 1 评论 -
定义指向矩阵的指针的两种方法
需要注意的是,矩阵的行数通常在指针类型中不作为一部分,因为指针无法自动推断矩阵的行数。因此,指针只包含对矩阵中某一行的引用,需要手动提供矩阵的列数信息。来表示指向矩阵的指针需要手动进行内存管理,包括内存分配和释放。确保在不再需要矩阵时释放相应的内存,以避免内存泄漏。意思是ptr是指向整数数组的指针,每组有4个元素,它被初始化为matrix,即指向矩阵的第一行。进行访问的时候,ptr[i][j] 就是第i行第j列的元素。数组来存储矩阵的行指针,然后对于每一行,再分配一个。第二种方法语法:还是3行4列。原创 2023-06-22 21:40:23 · 671 阅读 · 1 评论 -
什么是argc参数和argv参数?
(argument count)是一个整数,表示传递给程序的命令行参数的数量(包括程序本身)。它至少为1,因为第一个参数始终是程序的名称。(argument vector)是一个指向字符串数组的指针,每个字符串表示一个命令行参数。以下是一个简单的C语言示例,演示如何使用。可以遍历和访问每个命令行参数的值。是两个用于传递命令行参数的参数。,以此类推,表示其他命令行参数。可以获取命令行参数的数量,而使用。是程序的名称,后续元素。函数的参数列表中包含了。原创 2023-07-14 13:14:18 · 10613 阅读 · 6 评论 -
数值类型和字符串之间的转换
这主要体现在int和string之间的转换,这个用的也比较多,力扣上刷题也经常会用到。在这里我介绍下所有的二者互相转换的函数。原创 2023-10-26 22:38:33 · 474 阅读 · 0 评论 -
c++异常处理中的cerr和what()函数是什么
std::cerr 是C++标准库中的。它是一个预定义的 std::ostream 对象,用于。(所以我们用cerr的时候,看上去效果和cout一样)与 std::cout 类似,std::cerr 也是一个输出流对象,你可以使用它的 << 操作符来将数据输出到标准错误流。在这个例子中,如果 x 大于10,错误消息将会被输出到标准错误流 std::cerr,而不是标准输出流 std::cout。这是一个惯例,。原创 2023-10-30 19:03:53 · 1901 阅读 · 0 评论 -
位常量性(bitwise constness)与逻辑常量性(logical constness)
总结: "Bitwise constness" 强调在 const 成员函数中不能修改任何成员变量的值,而 "logical constness" 强调在 const 成员函数中不能修改外部可见的逻辑状态,但可以修改成员变量的值。2. Logical Constness(逻辑常量性): Logical constness 表示在 const 成员函数中不会修改外部可见的逻辑状态,但可能会修改成员变量的值,只要这些修改对外部不可见。是一个 const 成员函数,它计算矩形的面积。原创 2023-07-04 11:22:17 · 493 阅读 · 0 评论 -
C/C++中指针与数字相加减的运算的含义
当一个指针与一个整数相加时,编译器会将整数乘以指针所指向的数据类型的大小(字节大小),然后将结果与指针的地址相加,从而得到新的指针。类似地,当一个指针与一个整数相减时,编译器会进行相同的计算,但是结果会减去指针的地址,得到新的指针。进行加法和减法运算,将其移动到数组的其他位置,以及移动回起点。通过指针的算术运算,我们可以在数组中灵活地访问不同位置的元素。这是由于指针的算术运算是根据指针所指向的数据类型进行的,而。在 C/C++ 中,指向数组起点的指针可以和。类型的数字在指针运算中被视为偏移量。原创 2023-07-30 10:05:21 · 697 阅读 · 1 评论 -
c++异常处理机制
public:// 抛出自定义异常// 处理正常情况int main()try {// 可能引发异常的代码return 0;在这个示例中,process 函数可能引发 MyException 异常,而 main 函数使用 try 块包围了可能引发异常的代码。如果 process 函数引发了 MyException 异常,它将被第一个 catch 块捕获并处理,输出异常信息。原创 2023-10-30 16:16:19 · 103 阅读 · 0 评论 -
什么是POD类型
在现代C++中,更推荐使用这样的类型特性检查工具,而不是手动检查是否为POD类型。这些工具更准确,同时也更易读。float y;这里,将在编译时检查MyPODType是否为 trivial 和 standard layout 类型。单独使用的话, 返回值是布尔类型class A {};原创 2023-11-27 15:42:15 · 1399 阅读 · 0 评论 -
空指针和野指针
在C和C++中,可以将指针初始化为NULL(在C中)或nullptr(在C++中),以表示它是一个空指针。例如:原创 2023-11-06 17:11:21 · 150 阅读 · 0 评论 -
移动语义和完美转发
完美转发是 C++11 引入的一个重要特性,它允许在模板中精确地保持函数参数的值类别(左值还是右值),并将它们传递到其他函数。完美转发通常用于实现泛型代码,特别是在编写通用函数模板时非常有用。完美转发的核心在于使用通用引用(Universal Reference)和引用折叠。通用引用的语法是T&&,其中T是模板参数。引用折叠是指在模板类型推导或类型声明的过程中,两个引用(无论是左值引用还是右值引用)可能折叠成一个引用。// 用于演示的一个简单处理函数// 完美转发函数模板。原创 2023-11-20 15:17:42 · 231 阅读 · 0 评论