- 博客(285)
- 资源 (7)
- 问答 (1)
- 收藏
- 关注
原创 C++11 10-右值引用 rvalue reference
复制语义:创建资源的副本,适用于需要保留原始对象和副本的独立性的场景。移动语义:将资源从一个地方转移到另一个地方,适用于对象不再需要时,将其资源转移给另一个对象的场景。通过使用移动语义,可以避免不必要的资源复制,从而提高程序的性能和效率。
2024-10-17 07:00:00
1038
原创 C++11 11-委托构造函数 Delegating constructors
委托构造函数:在初始化列表中调用另一个构造函数,不能包含任何执行语句。普通构造函数:在函数体内包含初始化代码,可以包含执行语句。委托构造函数是 C++11 引入的特性,它允许程序员编写更简洁、更易于维护的代码,尤其是在处理具有多个构造函数的类时。通过使用委托构造函数,可以避免在多个构造函数中重复相同的初始化代码。委托构造函数的调用顺序是由你在类定义中指定的初始化列表决定的。这种机制允许你重用代码,减少重复的初始化代码,并保持代码的清晰和可维护性。
2024-10-17 07:00:00
1967
原创 C++11 08-强类型枚举 Strongly typed enumerations
/ 使用 enum class 定义强类型枚举RED,GREEN,BLUEreturn 0;在这个例子中,Color是一个强类型枚举,它的值不能隐式地转换为整数。C++11 引入的强类型枚举提供了更好的类型安全性,避免了枚举值与其他整数类型的隐式转换,使得代码更加可靠和易于维护。在新的 C++ 代码中,推荐使用强类型枚举来定义枚举类型。强类型枚举提供了更好的类型安全性和作用域控制,使得枚举值的使用更加明确和安全。
2024-10-16 07:00:00
1485
原创 C++11 09-初始化列表 initializer list
在 C++11 及更高版本中,使用初始化列表来初始化自定义类是一种推荐的做法,特别是对于类中包含常量成员或者需要高效初始化的场景。初始化列表确保成员变量按照声明的顺序进行初始化,并且可以在构造函数体内直接初始化成员变量。首先,定义你的类,并在构造函数中使用初始化列表来初始化成员变量。// 构造函数使用初始化列表return 0;
2024-10-16 07:00:00
1261
原创 C++11 06-正则表达式 regular expression
命名捕获组在正则表达式中通过?语法定义。其中name是你为捕获组指定的名称。
2024-10-15 07:00:00
1850
原创 C++11 07-新的容器 new containers
C++11 引入了几种新的容器,以满足更广泛的编程需求。这些新容器为 C++ 程序员提供了更多的选择和灵活性,使得可以更加方便地处理各种数据集合。
2024-10-15 07:00:00
484
原创 C++11 04-并发编程 Concurrent programming
在共享资源的同一作用域中定义一个std::mutex对象。定义一个互斥锁(std::mutex)和一个条件变量(),以及一个用于存储数据的队列。生产者函数将数据放入队列,并通知消费者数据已准备好。i < 5;++i) {// 通知一个等待的消费者消费者函数从队列中获取数据进行处理。});// 等待直到队列不为空。
2024-10-14 07:00:00
955
原创 C++11 05-智能指针 Smart pointer
在多线程环境中,智能指针的使用需要特别注意,因为它们管理的对象生命周期可能会跨越多个线程的执行。在多线程环境中,智能指针的使用需要特别注意,因为它们管理的对象生命周期可能会跨越多个线程的执行。例如,你可以创建一个线程安全的智能指针包装器,或者使用线程安全的容器来存储智能指针。在 C++ 中,使用智能指针管理的动态数组删除元素需要手动操作,因为智能指针本身并不提供数组元素的动态管理功能。总之,智能指针是 C++11 提供的一种强大的工具,可以帮助你管理动态分配的资源,并且在多线程环境中确保线程安全。
2024-10-14 07:00:00
1095
原创 C++11 02-Range-based for loop 范围基于的循环
虽然 C++ 不直接支持多维范围基于的循环,但通过上述方法,你可以有效地遍历多维数组或容器。选择哪种方法取决于你的具体需求和代码风格。
2024-10-13 07:00:00
942
原创 C++11 03-Lambda 表达式
Lambda 表达式在并发编程中提供了很多便利,但也需要谨慎使用,以避免潜在的问题。合理地设计线程任务,确保线程安全,并考虑性能和调试的需要,可以使 Lambda 表达式成为并发编程的有力工具。
2024-10-13 07:00:00
1060
原创 C++ STL源码剖析 16-unordered_set
点击直达——文章总目录在 C++ 标准模板库(STL)中, 是一种基于哈希表实现的容器,用于存储唯一的元素。它允许快速访问、插入和删除操作,而不需要维护元素的顺序。 的性能通常比 更好,尤其是在元素的查找和插入操作中。以下是 的一些主要特性:基本用法:自定义哈希函数和键比较函数:在这个例子中,我们定义了一个 结构,它将用作 的元素。我们还提供了自定义的哈希函数 和键比较函数 。注意: 是 C++ STL 中非常有用的容器之一,适用于需要快速访问元素的场景,特别是当元素的顺序不重要时。 和 都
2024-10-12 07:00:00
978
原创 C++11 01-Automatic type deduction 自动类型推导
它用于模板元编程中,可以保留表达式的结果类型,包括它的值类别(左值或右值)和 const/volatile 限定符。关键字,用于自动类型推导,它让编译器自动推断变量的类型。:C++11 允许在函数声明的末尾指定返回类型,这在模板编程中尤其有用,尤其是当返回类型依赖于模板参数时。编译器可以根据模板实例化时的实际参数类型自动推导出相应的类型。关键字的类型推导是在编译时进行的,这意味着返回类型完全由编译器根据表达式推导出来。,你可以编写更灵活、更简洁的代码,同时让编译器自动处理类型推导,减少出错的可能性。
2024-10-12 07:00:00
1572
原创 C++ STL源码剖析 14-myhashtable
在扩容时,可以创建一个新的哈希表,并将旧哈希表中的所有元素重新插入到这个临时哈希表中。:在迁移数据时,确保不会覆盖新哈希表中已有的元素。如果新旧哈希表的索引位置相同,则需要将旧哈希表中的元素追加到新哈希表的链表尾部。如果新旧哈希表的索引位置相同,则需要将旧哈希表中的元素追加到新哈希表的链表尾部。:在扩容过程中,多个线程可以协作,每个线程负责迁移一部分数据,通过原子操作和同步机制来协调各个线程的工作。:在将元素从旧哈希表迁移到新哈希表时,需要重新计算每个元素的哈希值,以确定它们在新哈希表中的位置。
2024-10-11 07:00:00
1232
原创 C++ STL源码剖析 15-unordered_map
点击直达——文章总目录在 C++ 标准模板库(STL)中, 是一种基于哈希表实现的关联容器,它存储了键值对(key-value pairs),并且允许通过键快速访问对应的值。 不保证元素的顺序,但其提供了平均时间复杂度为 O(1) 的插入、查找和删除操作。以下是 的一些主要特性:基本用法:自定义哈希函数和键比较函数:在这个例子中,我们定义了一个 结构,它将用作 的键。我们还提供了自定义的哈希函数 和键比较函数 。注意: 是 C++ STL 中非常有用的容器之一,适用于需要快速访问元素的场景。 是
2024-10-11 07:00:00
1664
原创 C++ STL源码剖析 12-map multimap
如果你想自定义元素的排序方式,可以在声明std::map或时提供一个比较函数。示例代码// 自定义比较函数// 降序排列// 插入键值对// 遍历mapreturn 0;通过使用std::map和,你可以有效地管理键值对的集合,无论是唯一的键还是允许重复的键。
2024-10-10 07:00:00
1098
原创 C++ STL源码剖析 13-hashtable
在 C++ 中,自定义一个基于哈希表的容器需要对哈希表的工作原理有深入的理解。首先,你需要定义一个哈希函数,它将键(key)映射到哈希表的一个桶(bucket)上。// 实现键到哈希值的映射定义一个函数来比较两个键是否相等。// 实现键的比较逻辑定义一个存储元素的桶结构,通常是一个链表来解决冲突。定义你的哈希表容器类,包括桶数组、哈希函数和键值比较函数。private:public:// 其他成员函数...
2024-10-10 07:00:00
1632
原创 C++ STL源码剖析 11-set multiset
如果你想自定义元素的排序方式,可以在声明std::set或时提供一个比较函数。示例代码// 自定义比较函数// 降序排列// 插入元素// 遍历set// 输出: 20 10 5return 0;通过使用std::set和,你可以有效地管理有序的元素集合,无论是唯一还是重复的元素。
2024-10-09 07:00:00
2283
原创 C++ STL源码剖析 8-iterator
在 C++ 标准模板库(STL)中,迭代器是一种抽象概念,用于提供对容器内元素的访问。迭代器可以视为指向容器中某个位置的指针,它封装了访问容器元素的方法。迭代器定义了对容器元素进行遍历、访问、插入和删除等操作的方式。T* data;return tmp;it!++it) {// 使用 *it 访问元素在这个示例中,我们定义了一个简单的容器,它包含一个简单的迭代器类。迭代器类提供了operator*operator->
2024-10-08 07:00:00
1869
原创 C++ STL源码剖析 9-STL设计之EBO优化 空基类优化
定义迭代器类别:指定你的迭代器是输入迭代器、输出迭代器、前向迭代器、双向迭代器还是随机访问迭代器。实现迭代器操作:至少实现operator*(解引用)、operator++(递增)、operator==和operator!(比较)。提供迭代器特质:使用来定义迭代器的特质,如value_typepointer和reference。public:// 迭代器类别private:T* data;避免虚继承。
2024-10-08 07:00:00
1418
原创 C++ STL源码剖析 6-typename
我们将创建一个名为Searcher的模板类,它包含一个静态模板方法search,用于在给定的容器中搜索特定值。// 通用搜索类模板public:// 搜索容器中的值if (it!// 返回找到元素的索引} else {return -1;// 如果未找到,返回-1// 输出: Index of 3 in vector: 2// 输出: Index of 3 in list: 2return 0;
2024-10-07 07:00:00
1336
原创 C++ STL源码剖析 7-traits
在C++中,Traits是一种模板编程技术,它允许我们为不同的数据类型提供统一的操作函数。Traits通常通过模板类和特化来实现,可以在编译时提供类型信息,从而实现类型安全的代码。Traits是一种特性萃取技术,它在泛型编程中被广泛使用。它通过模板类和特化来实现,允许我们为不同的数据类型提供统一的操作函数,如advance、swap、encode/decode等。Traits的实现通常依赖于枚举、typedef和模板的偏特化。// 定义一个通用的 Traits 模板// 默认实现,假设 T 不是特殊类型。
2024-10-07 07:00:00
1225
原创 C++ STL源码剖析 4-std::list
在C++标准模板库(STL)中,std::list是一个双向链表的容器。它允许在序列的任何位置高效地插入和删除元素。std::list提供了链表的灵活性和动态大小的特性,同时支持快速的插入和删除操作。以下是std::list模板类std::list是一个模板类,可以存储任何数据类型。双向链表:内部使用双向链表实现,每个元素都有一个前驱指针和一个后继指针。内存分配:动态分配内存以存储元素,可以在运行时动态增加和减少大小。迭代器:提供双向迭代器,支持正向和反向遍历。无随机访问:不支持像。
2024-10-06 07:00:00
1073
原创 C++ STL源码剖析 5-std::vector
在C++标准模板库(STL)中,是一个序列容器,它封装了动态大小数组的接口,提供了随机访问能力,以及在数组尾部高效地插入和删除元素的能力。以下是public:// 类型定义// 迭代器类型// 构造函数和析构函数// 析构函数~vector();// 赋值运算符// 迭代器// 容量// 修改器// 数据访问// 填充和复制// 容量和内存。
2024-10-06 07:00:00
1287
原创 C++ STL源码剖析 2-std::deque 双端队列
std::deque(double-ended queue,双端队列)是C++标准模板库(STL)中的一个序列容器,定义在头文件中。它支持在序列的前端和后端快速插入和删除元素。std::dequepublic:// 类型定义// 迭代器类型// 构造函数和析构函数~deque();// 赋值运算符// 迭代器// 容量// 修改器// 访问器。
2024-10-05 07:00:00
1321
原创 C++ STL源码剖析 3-std::queue std::stack
线程池中的线程可以循环使用,当任务到达时,线程池会分配空闲线程去执行任务,如果线程池满了,则任务会排队等待。注意,我们在队列中使用了一个特殊值(-1)作为结束信号,当生产者线程结束后,向队列中添加这个值,并通知所有等待的消费者线程。在这个示例中,我们创建了两个生产者线程和两个消费者线程。:尽量减少锁的争用时间,例如,可以在持有锁的代码块之外进行数据的加工和处理,只在实际需要修改共享资源时才持有锁。:对于生产者和消费者操作,使用不同的锁,这样可以在某些情况下同时允许生产者和消费者操作,增加并行度。
2024-10-05 07:00:00
1526
原创 C++ STL源码剖析 1-std::array
在C++11标准中,std::array是一个模板类,定义在头文件中。它提供了一个固定大小的数组,其大小在编译时确定,并且不允许动态改变。std::arraypublic:// 类型定义// 成员函数// 迭代器std::array的特点包括类型安全、固定大小、内存连续,以及提供了与类似的接口,如size()at()front()back()等。std::array的元素在内存中是连续存储的,这使得它可以高效地访问元素。
2024-10-04 00:11:20
1580
原创 操作系统的程序内存结构 ROM RAM Flash data bss text heap stack (memory_of_micro_chip)
点击直达——文章总目录在计算机系统中,RAM中用于存储程序和数据的区域通常被分为几个不同的段(segment)。这些段在程序的生命周期中扮演不同的角色,并且它们在内存中的布局和用途也有所不同。以下是对代码区(text段)、常量区、静态区(全局区)、堆区、栈区(包括数据段中的data段和bss段)的分析:代码区(text段):数据段(data段):bss段(Block Started by Symbol Segment):堆区(Heap):栈区(Stack):这些段的划分有助于操作系统和编译器有效地管理内存,
2024-10-04 00:09:37
1496
原创 C++ Practical-2 day12 读写文件综合题
以下是一个综合示例,展示了如何在 C++ 中创建一个文件,写入一些内容,然后读取并显示这些内容。这些方法提供了不同级别的文件操作控制,从底层系统调用到高级抽象,可以根据具体需求和平台特性选择合适的方法。在 C++ 中,进行更复杂的文件读写操作可以通过指定文件打开模式来实现。通过这些方法,你可以在 C++ 中有效地检查文件操作是否成功,并在失败时进行适当的错误处理。这些示例展示了如何在 C++ 中执行更复杂的文件操作,包括追加内容和以二进制模式读写文件。在 C++ 中,读写文件是一个常见的任务。
2024-10-03 07:00:00
1516
原创 C++ Practical-2 day10 异常捕获 异常处理 try exception
在C++中,自定义异常类通常是通过继承自类来实现的。自定义异常允许你为特定错误情况提供更多的上下文信息。继承:创建一个新类,继承自,并重写what()方法,该方法返回一个描述异常的字符串。提供构造函数:为你的异常类提供构造函数,允许设置错误消息和其他相关信息。抛出异常:在代码中使用throw关键字抛出你的自定义异常对象。捕获异常:使用try-catch块捕获并处理异常。// 自定义异常类private:public:// 重写 what() 方法// 一个可能抛出异常的函数try {
2024-10-02 07:00:00
1862
原创 C++ Practical-2 day11 继承与封装
Shape首先,我们定义一个名为Shape的抽象基类,它包含一个纯虚函数draw(),以及一个虚函数area()用于计算面积,它在基类中也有一个默认实现。public:// 纯虚函数,用于绘制图形// 虚函数,用于计算图形的面积return 0.0;// 默认实现,对于不关心面积的图形可以返回0// 虚析构函数,确保派生类的析构函数被正确调用接下来,我们定义一些具体的图形类,如CircleRectangle和Triangle,它们都继承自Shape类,并实现draw()函数和area()函数。
2024-10-02 07:00:00
908
原创 C++ Practical-2 day6 类模板之栈
点击直达——文章总目录在C++中,使用类模板来实现一个栈(Stack)是一种常见的做法,因为它可以提供类型安全和灵活性。下面是一个简单的栈类模板的实现:这个栈类模板实现了基本的栈操作,包括入栈(push)、出栈(pop)、获取栈顶元素(top)、检查栈是否为空(isEmpty)以及获取栈的大小(getSize)。它使用动态数组来存储元素,并在需要时自动扩容。请注意,这个实现是一个简单的示例,实际应用中可能需要更多的错误检查和优化。为栈类模板添加迭代器接口,首先需要定义一个迭代器类,该类能够遍历栈中的元素。
2024-09-30 07:00:00
1263
原创 C++ Practical-2 day7 类模板特化之数组
首先,定义一个包含虚函数的基类模板,这个基类模板将被用于后续的特化。public:// 纯虚函数virtual ~Base() {} // 虚析构函数以确保派生类对象的正确清理定义一个派生类模板,继承自基类模板,并实现基类中的虚函数。
2024-09-30 07:00:00
1886
原创 C++ Practical-2 day4 运算符重载之输入输出运算符重载
这使得你的类的对象可以像内置类型一样直接与输入输出流进行交互。通过重载输入输出运算符,你的类将更加易于使用,代码可读性也会提高。)可以让你自定义类的对象与标准输入输出流(如。类,你可以定义一个输入运算符,允许从。在C++中,重载输入输出运算符(
2024-09-29 07:00:00
557
原创 C++ Practical-2 day5 模板之函数模板
函数模板是C++中一种支持泛型编程的工具,它允许你编写与数据类型无关的函数。通过使用模板,你可以创建一个函数,它可以在编译时自动适应任何给定的数据类型。模板特化是为特定类型提供特定实现的方法。这在你需要为某些特定类型提供优化或特殊行为时非常有用。偏特化通常用于类模板,但也可以通过模板重载实现函数的偏特化。通过使用函数模板,你可以编写更加通用和灵活的代码。
2024-09-29 07:00:00
879
原创 C++ Practical-2 day1 重载函数调用运算符`()` 中括号
允许一个对象像函数一样被调用。这通常用于创建类似于函数的对象,或者让对象能够执行某些操作。通过重载函数调用运算符,你可以创建出非常灵活和强大的类,这些类的对象可以像函数一样被调用。:根据需要返回适当的类型,如果需要链式调用,则返回对象本身的引用。是一个成员函数,因此它可以直接访问对象的成员变量和成员函数。关键字,以表明这个成员函数不会修改对象的任何成员变量。:确保在调用过程中即使发生异常,对象也保持有效状态。运算符不会修改对象的状态,你应该在函数声明的末尾添加。,可以使对象的使用更加灵活和表达式更加简洁。
2024-09-28 07:00:00
1081
wesigj-ROS-Academy-for-Beginners-melodic.zip
2020-07-11
MobaXterm.7z
2021-05-04
ros_21_tutorials-master.zip
2020-07-11
Ubuntu18.04 melodic 本机的API服务器如何订阅ROS的话题数据
2021-04-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅