自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 【基础概念】API和ABI

API(应用程序编程接口)和ABI(应用程序二进制接口)是软件开发中两个重要的概念。

2024-04-15 01:39:14 239

原创 【C++基础】智能指针详解

自定义删除器的主要目的是在智能指针释放资源时执行特定的清理操作,这些操作可以是任意类型的,不一定是释放动态分配的内存。例如,自定义删除器可以是一个函数对象、Lambda 函数或者函数指针,它可以执行以下任何操作:1)调用delete来释放动态分配的内存。2)调用free函数释放动态分配的内存(用于 C 风格的内存管理)。3)调用关闭文件句柄的函数,如fclose。4)执行其他资源的清理操作,如释放线程、关闭数据库连接等。

2024-04-14 22:38:46 868 1

原创 【设计模式】SOLID设计原则

类应该只有一个单一的职责,即一个类应该有且只有一个改变的理由。这意味着一个类应该只负责一个特定的功能或任务,而不是多个不相关的功能。这样做可以提高类的内聚性,并使得类更容易理解、修改和测试。软件实体(类、模块、函数等)应该对扩展开放,对修改封闭。这意味着在不修改现有代码的情况下,应该能够通过添加新的代码来扩展系统的功能。这样做可以使得系统更加稳定,减少修改现有代码可能带来的风险。子类型必须能够替换其基类型。换句话说,任何可以接受基类型的地方都可以接受子类型,而且不会引发意外的行为。

2024-04-14 17:50:19 1050

原创 【C++基础】chrono

chrono是 C++ 标准库中的一个头文件,提供了处理日期、时间、时钟等时间相关操作的功能。它在 C++11 标准中引入,提供了更方便、更强大的时间处理功能。1.1: 代表时间段,可以表示一段时间的长度,以不同的时间单位表示,例如秒、毫秒、微秒等。: 代表时间点,它是相对于某个时间点的持续时间。: 提供了当前的系统时间,可以用来获取当前时间点。: 与类似,但提供的时间点递增稳定,不受系统时间调整的影响。: 提供了最高精度的时钟,通常基于实现。

2024-04-14 13:50:55 394

原创 【C++基础】algorithm

C++ 的头文件提供了许多常用的算法,这些算法可以用于对容器中的元素进行排序、搜索、比较等操作。

2024-04-04 21:55:08 141

原创 【C++基础】std::map详解

当使用自定义对象作为std::map的键时,需要确保自定义对象可以进行比较。这通常涉及到重载比较运算符(例如operator<)以确保元素可以按照特定的顺序进行排序。Demp定义一个自定义对象的std::map// 自定义对象public:int id;// 重载比较运算符,以确保对象可以按照特定顺序进行排序// 创建一个存储自定义对象的 std::map// 添加自定义对象到 map// 遍历 map,并输出每个键值对return 0;

2024-04-04 21:48:02 916

原创 【C++基础】std::set详解

std::set默认是根据元素的大小进行排序的,采用的是严格弱序(Strict Weak Ordering)的比较方式。这意味着元素必须支持运算符,元素按照升序排列。可以通过提供自定义的比较函数或者函数对象来实现排序规则。需要两个步骤:1、定义比较函数或者函数对象比较函数:定义一个函数,接受两个参数,比较它们的大小,并返回true或false,表示它们的顺序关系。函数对象(Functor):定义一个类,重载operator(),使得对象可以像函数一样被调用,在其中实现比较逻辑。2、

2024-04-04 20:39:47 578

原创 【C++基础】std::vector详解

是 C++ 标准库中的一个容器,提供了动态数组的功能。它的底层实现通常是使用连续的内存块来存储元素,因此可以通过指针算术来访问元素,并且支持常数时间的随机访问,并支持在容器末尾高效地添加和删除元素。

2024-04-04 18:41:54 1094

原创 【版本控制】git使用指南

Git 是一个免费、开源的分布式版本控制系统,最初由 Linus Torvalds 于2005年创建。它旨在管理项目的源代码,并提供了跟踪更改、协作开发、版本控制、分支管理等功能。

2024-03-25 13:30:53 776

原创 【C++基础】std::string详解

std::string 是 C++ 标准库提供的用于处理字符串的类。它在 头文件中定义。std::string 提供了一种灵活、高效的字符串表示方式,相比于 C 语言中的字符串表示(使用字符数组或指针),std::string 更易于使用,更安全,并且提供了许多便捷的操作。

2024-03-24 17:34:48 1223

原创 【Linux基础】ubuntu虚拟机配置及原理

以我的电脑为例,可以看到有24个内核,32个逻辑处理器。

2024-03-23 14:06:52 829

原创 【Linux基础】dash和bash简介

Dash(Debian Almquist Shell)和 Bash(Bourne Again Shell)是 Unix/Linux 系统中的命令行 shell,用于执行命令、管理文件系统、编写脚本等任务的工具。

2024-03-23 01:32:49 1166

原创 【Linux基础】apt命令和软件管理包

aptapt是一个用于管理 Debian 和基于 Debian 的 Linux 发行版(如 Ubuntu)软件包的命令行工具。它是 Advanced Package Tool(高级软件包工具)的缩写。apt命令提供了一种简单而强大的方式来搜索、安装、升级和删除软件包,以及管理软件包仓库。

2024-03-23 01:00:29 316

原创 C++ 函数指针

C++ 函数指针

2024-01-27 01:40:59 335

原创 C++ 迭代器

STL提供了一系列通用的迭代器类型,包括输入迭代器(Input Iterator)、输出迭代器(Output Iterator)、前向迭代器(Forward Iterator)、双向迭代器(Bidirectional Iterator)和随机访问迭代器(Random Access Iterator)。不同的迭代器类型具有不同的功能和操作能力,可以适应不同类型的容器和算法的需求。迭代器可以被看作是一种指针,用于指向容器中的特定位置或元素,通过迭代器可以访问和操作容器中的数据。返回向量的起始位置的迭代器,

2023-05-16 11:53:35 1026

原创 C++ sort()函数

函数是用于对容器(如数组、向量、链表等)中的元素进行排序的标准库函数。函数还可以接受一个可调用对象(函数或函数对象)作为第三个参数,用于自定义排序的方式。通过自定义比较函数,您可以根据特定的排序准则对元素进行排序。函数是一个非常方便的用于排序容器元素的函数,可以轻松地对数组、向量等进行升序或降序排序,并且还可以通过自定义比较函数实现特定的排序准则。函数对容器中的元素进行原地排序,即不会创建新的容器,而是直接修改原容器中的元素顺序。函数的时间复杂度通常为O(NlogN),其中N是待排序元素的数量。

2023-05-16 11:51:41 2139

原创 C++11中的lambda表达式

C++11引入了lambda表达式,它是一种匿名函数的定义方式。lambda表达式允许我们在需要函数对象(函数作为参数或返回值)的地方,以一种更简洁的方式编写函数。lambda函数接受一个int参数。在上面的例子中,lambda表达式捕获了变量。通过调用lambda函数。,得到最终的结果18。

2023-05-14 23:22:54 169

原创 vector的emplace_back函数

函数的优势在于避免了构造临时对象和复制/移动操作的开销,因为它直接在向量内存中构造元素。类模板提供的一个方便的成员函数,可以直接在向量末尾就地构造新元素。它可以减少构造和移动元素的开销,并提高代码的性能和效率。接受的参数是用于构造新元素的实参列表,而不是一个已经构造的对象。它使用这些参数在向量的末尾就地构造一个新的元素。是 C++11 中引入的一个成员函数,用于在向量的末尾直接构造一个新元素,而无需显式创建临时对象。通过传递构造函数所需的参数,我们可以直接在向量中构造新元素,而不需要显式创建临时对象。

2023-05-14 17:26:09 3252

原创 C++ set的insert函数

是无序的,插入的元素在容器中的具体位置是不确定的,因为它是根据哈希函数计算得到的。如果插入成功且该元素在容器中之前不存在,则插入操作将被执行,返回一个。如果要插入的元素已经存在于容器中,则插入操作不会执行,返回的。是一个无序集合容器,它使用哈希表实现,并且不按特定的排序准则存储元素。函数有多个重载版本,但最常用的版本接受一个参数,即要插入的元素。的元素,则插入操作将成功。的元素,则插入操作将失败。容器中的元素是唯一的,不允许重复。,表示插入的元素是一个新元素。,表示插入的元素已经存在。

2023-05-14 08:31:04 2261

原创 C++ 迭代器iterator

在 C++ 中,迭代器(iterator)是一种通用的抽象概念,用于在容器(如std::liststd::map等)中遍历和访问元素。迭代器提供了一种统一的接口,使得不同类型的容器可以以相似的方式进行遍历和操作。大多数 C++ 容器都提供了迭代器,用于遍历容器中的元素。例如,和std::deque提供了随机访问迭代器,std::list提供了双向迭代器,std::set和std::map提供了双向迭代器。

2023-05-11 14:08:13 1712

原创 C++ auto关键字

是 C++11 标准引入的特性,允许编译器根据初始化表达式自动推导变量的类型。这样可以避免在某些情况下手动指定复杂类型,让代码更简洁和易读。迭代器可以类比为指针,它们提供了访问和修改容器中元素的方法。方法返回容器中最后一个元素之后的迭代器。是一个关键字,用于在声明变量时自动推导变量的类型。关键字可以避免显式地写出这个较长的类型名。方法返回容器中第一个元素的迭代器,还有一种使用场景是遍历容器(如。,我们可以遍历容器中的所有元素。类型元素的迭代器,用于遍历。

2023-05-11 12:00:21 246

原创 unordered_set总结

是C++标准库中的一个容器,它可以存储不重复的元素集合。这个容器的特点是内部元素没有特定的顺序,因此查找、插入和删除操作的平均时间复杂度是O(1)。是基于哈希表实现的,所以在使用时需要提供一个哈希函数和相等函数。在的内部,数据通常存储在哈希表中。哈希表由桶组成,每个桶存储具有相同哈希值的元素。然而,这些实现细节是在类定义中隐藏的,用户不需要关心这些细节。您可以使用提供的成员函数来操作和查询容器的状态,例如插入、删除、查找元素,以及查询容器的大小、负载因子等。

2023-05-10 23:05:00 1133

原创 unordered_map总结

unordered_map是C++标准库中的一个关联容器,它允许通过键值对(key-value pairs)进行存储和查询。与std::map相比,unordered_map不会根据键自动排序,而是使用哈希表(hash table)进行存储,从而提供了平均时间复杂度为O(1)的快速查找、插入和删除操作。使用unordered_map时,需要包含头文件#include <unordered_map>。

2023-05-10 22:48:55 2365

原创 C++ 友元

友元(Friend)是C++中一种特殊的关键字,它被用于声明一个类的友元函数或友元类。友元允许一个函数或类访问另一个类的私有(private)和保护(protected)成员。在合适的场景下使用友元,可以提高代码的灵活性,但过度使用可能导致代码难以维护。有时,我们希望建立一个类,使其能够访问另一个类的私有和保护成员。友元函数不属于类的成员函数,但可以访问类的私有和保护成员。这样就能在类外部定义这个友元函数,使其能够访问类内部的私有和保护成员。这样,友元类中的所有成员函数都能够访问当前类的私有和保护成员。

2023-05-04 17:57:02 355

原创 C++ static

静态成员变量是类的所有对象共享的成员变量。静态成员变量只有一个实例,无论创建了多少个类的对象。静态成员变量的初始化必须在类定义之外进行。此外,静态成员变量可以通过类名直接访问,而不是通过对象访问。静态成员函数只能访问静态成员变量,不能访问类的非静态成员变量,因为非静态成员变量依赖于特定的对象实例。静态成员函数是一种特殊的成员函数,它不依赖于任何特定的对象实例。因此,静态成员函数没有。关键字有多种用途,可以用于修饰类成员变量、类成员函数和局部变量。静态成员函数可以通过类名直接调用,而不需要创建对象实例。

2023-05-03 23:51:42 45

原创 C++ 构造函数与析构函数

这可能会导致问题,例如,当一个对象被删除时,其析构函数可能会删除共享的内存,从而使另一个对象的指针变为悬挂指针。但是,如果类有指向动态分配内存的指针成员,或者包含需要特殊处理的资源(如文件句柄,网络连接等),那么通常需要提供自定义的拷贝构造函数以执行深拷贝。:当我们执行深拷贝时,不仅复制对象的所有非静态成员变量,还会为每个动态内存分配的指针成员创建新的内存复制,确保新对象获得的是原始对象数据的全新副本,而不是引用同一内存。在 C++ 中,构造函数是一种特殊的成员函数,它会在创建类的新对象时自动被调用。

2023-05-03 19:42:59 1127

原创 C++ this指针

这个关键字在类的非静态成员函数中使用,可以访问当前对象的成员。这在链式调用中特别有用,当一个成员函数需要返回调用它的对象时,可以返回。:在成员函数中,如果成员变量和函数的参数或局部变量有相同的名称,可以通过。指针被用作对调用对象的引用。指针被用来指向正在被构造或析构的对象。指针和另一个对象的地址,以确定它们是否是同一个对象。对象本身,这意味着你可以立即在结果上调用。的类,并在这个类的成员函数中调用。是一个指向当前对象的指针,因此。:在类的构造函数和析构函数中,在类的成员函数中,你可以使用。

2023-05-03 19:16:05 401

原创 C++ 面向对象程序设计

在面向对象的思想中,我们把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。当然,一个应用程序会包含多个对象,通过多个对象的相互配合即可实现应用程序所需的功能,这样当应用程序功能发生变动时,只需要修改个别对象就可以了,使代码更容易维护。面向对象的程序设计思想可以帮助我们创建结构良好的,可复用的代码,更好地描述和理解真实世界的问题。封装可以隐藏对象的内部表示,只通过对象的方法暴露必要的操作和功能。这使得新类可以复用和扩展已存在的类的代码,提高了代码的复用性,并能够表达类之间的"is-a"关系。

2023-05-03 16:10:24 3049

原创 C++ 强制类型转换

需要注意的是,使用 const_cast 去掉常量性质并修改数据可能导致未定义的行为。:这种类型转换允许进行任何指针或整型的转换。它可以将任何类型的指针转换为任何其他类型的指针,也可以将任何类型的指针转换。它可以用于基本数据类型之间的转换,也可以用于指向父类和子类之间的指针或引用的转换。向下转换(基类转换为派生类)没有动态类型检查,是不安全的。reinterpret_cast要转换的类型必须是指针类型、引用或算术类型。④用于类层次结构中基类和派生类之间指针或引用的转换。③把空指针转换成目标类型的指针。

2023-05-03 15:45:47 2160

原创 C++ extern “C“

所谓的改编就是在函数名字上附加一些额外的信息,例如参数类型和数量等,以便在链接时能够找到正确的函数。然而,C语言并不支持函数重载,因此在C语言中,函数名在编译后不会进行改编,还是原来的函数名。因此,如果你在C++中直接引用C语言的函数,由于名字改编的问题,链接器可能无法找到正确的函数。它告诉C++编译器,被声明的函数或变量是用C语言编写的,应该以C语言的方式进行链接,也就是说,不进行名字改编。中的所有函数和全局变量都会以C语言的方式链接,就可以在C++代码中正确引用了。都会以C语言的方式进行链接。

2023-05-03 11:50:54 128

原创 C++ new和delete

其中,Type 是任何有效的数据类型,如 int、float、char 等,也可以是类或结构体。此语句会在堆上为指定类型的变量分配足够的内存,并返回指向该内存的指针。如果内存分配成功,这个指针可以用于访问新分配的内存。如果内存分配失败(例如,因为堆空间不足),则。运算符会释放 pointer 指向的内存,并使 pointer 变为悬挂指针。)来管理动态内存,因为智能指针可以自动释放它们所拥有的内存,从而避免内存泄漏。否则,你的程序可能会出现内存泄漏。在堆上分配了内存,你必须记住使用。

2023-05-02 18:58:17 414

原创 C++引用

但是,需要注意的是,不能返回局部对象的引用或指针,因为局部对象在函数结束时会被销毁。在C++中,引用是一种特殊的类型,可以被理解为一个已存在变量的别名。同时,由于引用本身就是目标变量的一个别名,所以使用引用可以让代码更加直观易读。在这个例子中,swap函数接受两个整数的引用作为参数,并返回一个引用。函数直接修改了参数a和b的值,同时返回了a的引用。同样,当我们修改x的值时,通过ref看到的值也会改变。作为函数参数:当使用引用作为函数参数时,函数将直接修改传入的变量值,而不是复制一份。

2023-05-02 17:27:23 43

原创 C++函数重载

函数重载(Function Overloading)是C++中的一个重要特性,它允许我们创建多个同名函数,但是每个函数的参数列表(即参数的类型、顺序、数量)必须不同。这样,根据传递给函数的参数类型,编译器会选择对应的函数版本执行。函数并传递了不同类型的参数,编译器根据参数类型选择了正确的函数版本。参数列表必须不同(参数类型、参数数量、参数顺序至少有一项不同)。的函数,每个函数都接收不同类型的参数。函数重载是在编译时期确定,这称为静态联编。只有返回值类型不同不足以成为函数重载。

2023-05-02 16:42:01 37

原创 C++ 默认参数

在C++中,默认参数允许您为函数参数指定默认值。当调用这个函数时,如果没有为带有默认值的参数提供值,那么该参数将自动设置为其默认值。换句话说,在参数列表中,具有默认值的参数应该位于没有默认值的参数之后。默认参数在编译时求值,而不是运行时。因此,不能将运行时计算的值(如函数返回值、变量等)用作默认参数。如果函数在头文件(.h)中声明,在源文件(.cpp)中定义,那么应该在头文件中指定默认参数。当函数重载与默认参数一起使用时,可能会导致歧义。但是,如果在调用时提供两个参数,例如。,则会使用提供的值覆盖默认值。

2023-05-02 15:31:08 254

原创 C++ 自增运算符++重载

然后,后缀++返回当前值,然后再增加val的值。所以,(num++).value()仍然输出6,但之后num.value()将输出7,因为val的值在后缀++调用之后增加了。②在C++中,后缀自增运算符和前缀自增运算符有相同的名称(operator++),但是他们的行为却不同。当你在代码中使用后缀自增运算符时,编译器会自动传递一个0作为这个int参数,但是这个值在运算符函数体中并不会被使用。在C++中,前缀和后缀的++运算符具有不同的行为,并且可以被分别重载。:首先增加值,然后返回增加后的值。

2023-05-02 15:10:26 258

原创 C++ operator

当你重载一元运算符时,你通常只需要一个参数(实际上,这个参数在非静态成员函数中通常被省略,因为它是通过 this 指针隐式传递的)。运算符重载允许你改变已有运算符(如 +、-、*、/ 等)的行为,或者为自定义类型(如类或结构体)定义新的运算符行为。赋值运算符(=)是一个特殊的运算符,它通常用于控制对象之间的赋值行为。总的来说,运算符重载时参数的数量取决于运算符是一元的还是二元的,以及你是否将运算符重载为类的成员函数。在C++中,运算符重载时参数的数量取决于你正在重载的运算符是一元运算符还是二元运算符。

2023-05-02 01:28:28 502

原创 C++初始化列表

这是因为在初始化列表中,数据成员是直接初始化的,而不是先默认初始化然后再赋值。2、const 和引用成员:如果一个类有 const 或引用类型的数据成员,那么这些成员只能在初始化列表中初始化,不能在构造函数主体中赋值。3、对象成员:如果一个类有对象类型的数据成员,并且这些对象没有默认构造函数(即无参数的构造函数),那么这些对象成员必须在初始化列表中初始化。在这个例子中,MyClass 的构造函数有一个初始化列表 : a(a), b(b), c(c),它初始化了三个数据成员 a、b 和 c。

2023-05-02 01:08:48 153

原创 C++ cin和cout

例如,如果你向 cout 输出一个整数、一个浮点数或一个字符串,cout 会自动将它们转换为适当的文本表示形式。值得注意的是,虽然 cout 可以处理许多类型的数据,但对于自定义类型(如类或结构体),你可能需要提供自定义的输出运算符重载,以便正确地显示数据。在这个例子中,std::getline 会读取用户输入的一整行,包括空格,但不包括换行符,并将其存储在 line 字符串中。cin 和 cout 是C++中的两个预定义对象,它们分别代表标准输入流和标准输出流,是iostream库中的重要部分。

2023-05-02 01:07:22 826

原创 C++枚举类型

在这个例子中,Color是一个枚举类型,它有三个枚举器:RED、GREEN和BLUE。默认情况下,第一个枚举器的值为0,然后每个后续的枚举器的值都比前一个大1。所以在这个例子中,RED的值为0,GREEN的值为1,BLUE的值为2。在C++中,枚举是一种用户定义的类型,它由一组命名的整数常量组成,这些常量被称为枚举器。在C++11及更高版本中,你还可以使用enum class来定义枚举类型,这样可以提供更强的类型安全和作用域控制。在这个例子中,RED的值为1,GREEN的值为2,BLUE的值为3。

2023-05-02 00:27:12 228

原创 C++ const关键字

注意:在使用const时,要注意其位置和周围的语境,因为const的位置决定了其具体的含义。在C++中,const关键字用于声明一个常量,也就是说,声明后,其值不能被改变。:你也可以使用const来声明一个常量引用,这意味着你不能通过这个引用来改变其引用的值。:你可以使用const来声明一个常量,其值在声明时需要初始化,并且之后不能被改变。:你可以声明一个指向常量的指针,这意味着你不能通过这个指针来改变其指向的值。在这个例子中,你不能改变ptr的指向,但是可以通过ptr来改变x的值。,后者表示指针常量。

2023-05-01 17:58:45 134

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除