C++ 容器 <forward_list>
C++ 容器 C++ 标准库中的 是一种容器,它提供了一种单向链表的数据结构。与双向链表(std::list)不同,std::forward_list 只支持单向遍历。它适用于需要频繁进行前向遍历和插入、删除操作的场景。以下是对 std::forward_list 的详细说明:单向链表: std::forward_list 是单向链表,只能从前往后遍历,不能反向遍历。由于其单向链表的结构,插入和删除操作在已知位置的情况下非常高效(O(1) 复杂度)。 低内存开销: 与 std::list 相比,std::forward_list 只需要一个指向下一个节点的指针,节省了内存。 不支持随机访问: 不支持通过索引访问元素,不能使用 operator[] 或 at 方法,只能通过迭代器进行访问。 语法std::forward_list 是 C++ 标准库中的一个模板类,定义在 头文件中。它使用模板参数 T 来指定存储在列表中的元素类型。以下是 std::forward_list 的基本语法:#include std::forward_list...
C++ 实例
C++ 实例 C++ 实例 - 输出 “Hello, World!” C++ 实例 - 标准输入输出C++ 实例 - 输出换行C++ 实例 - 实现两个数相加C++ 实例 - 创建不同类型的变量C++ 实例 - 求商及余数C++ 实例 - 查看 int, float, double 和 char 变量大小C++ 实例 - 交换两个数C++ 实例 - 判断一个数是奇数还是偶数C++ 实例 - 判断元音/辅音C++ 实例 - 判断三个数中的最大数C++ 实例 - 求一元二次方程的根C++ 实例 - 计算自然数之和C++ 实例 - 判断闰年C++ 实例 - 求一个数的阶乘C++ 实例 - 创建各类三角形图案C++ 实例 - 求两数的最大公约数C++ 实例 - 求两数最小公倍数C++ 实例 - 实现一个简单的计算器猴子吃桃问题
C++ 存储类
C++ 存储类存储类定义 C++ 程序中变量/函数的范围(可见性)和生命周期。这些说明符放置在它们所修饰的类型之前。下面列出 C++ 程序中可用的存储类: auto:这是默认的存储类说明符,通常可以省略不写。auto 指定的变量具有自动存储期,即它们的生命周期仅限于定义它们的块(block)。auto 变量通常在栈上分配。register:用于建议编译器将变量存储在CPU寄存器中以提高访问速度。在 C++11 及以后的版本中,register 已经是一个废弃的特性,不再具有实际作用。static:用于定义具有静态存储期的变量或函数,它们的生命周期贯穿整个程序的运行期。在函数内部,static变量的值在函数调用之间保持不变。在文件内部或全局作用域,static变量具有内部链接,只能在定义它们的文件中访问。extern:用于声明具有外部链接的变量或函数,它们可以在多个文件之间共享。默认情况下,全局变量和函数具有 extern 存储类。在一个文件中使用extern声明另一个文件中定义的全局变量或函数,可以实现跨文件共享。mutable...
C++ 字符串
C++ 字符串 C++ 提供了以下两种类型的字符串表示形式: C 风格字符串C++ 引入的 string 类类型 C 风格字符串C 风格的字符串起源于 C 语言,并在 C++ 中继续得到支持。字符串实际上是使用 null 字符 \0 终止的一维字符数组。因此,一个以 null 结尾的字符串,包含了组成字符串的字符。下面的声明和初始化创建了一个 RUNOOB 字符串。由于在数组的末尾存储了空字符,所以字符数组的大小比单词 RUNOOB 的字符数多一个。 char site[7] = {‘R’, ‘U’, ‘N’, ‘O’, ‘O’, ‘B’, ‘\0’}; 依据数组初始化规则,您可以把上面的语句写成以下语句: char site[] = “RUNOOB”; 以下是 C/C++ 中定义的字符串的内存表示: 其实,您不需要把 null 字符放在字符串常量的末尾。C++ 编译器会在初始化数组时,自动把 \0 放在字符串的末尾。让我们尝试输出上面的字符串: 实例 #include using namespace std; int main (){char...
C++ 多线程库 <thread>
C++ 多线程库 C++11 引入了多线程支持,通过 库,开发者可以轻松地在程序中实现并行处理。本文将将介绍 库的基本概念、定义、语法以及如何使用它来创建和管理线程。线程是程序执行的最小单元,是操作系统能够进行运算调度的最小单位。在多线程程序中,多个线程可以并行执行,提高程序的执行效率。C++ 库概述 库是 C++ 标准库的一部分,提供了创建和管理线程的基本功能,它包括以下几个关键组件: std::thread:表示一个线程,可以创建、启动、等待和销毁线程。std::this_thread:提供了一些静态成员函数,用于操作当前线程。std::thread::id:线程的唯一标识符。 创建线程要创建一个线程,你需要实例化 std::thread 类,并传递一个可调用对象(函数、lambda 表达式或对象的成员函数)作为参数。实例#include #include void print_id(int id) { std::cout << “ID: “ << id << “, Thread ID: “ <<...
C++ 多线程
C++ 多线程线程是程序中的轻量级执行单元,允许程序同时执行多个任务。多线程是多任务处理的一种特殊形式,多任务处理允许让电脑同时运行两个或两个以上的程序。一般情况下,两种类型的多任务处理:基于进程和基于线程。 基于进程的多任务处理是程序的并发执行。基于线程的多任务处理是同一程序的片段的并发执行。C++ 多线程编程涉及在一个程序中创建和管理多个并发执行的线程。C++ 提供了强大的多线程支持,特别是在 C++11 标准及其之后,通过 标准库使得多线程编程变得更加简单和安全。概念说明线程 (Thread)线程是程序执行中的单一顺序控制流,多个线程可以在同一个进程中独立运行。线程共享进程的地址空间、文件描述符、堆和全局变量等资源,但每个线程有自己的栈、寄存器和程序计数器。并发 (Concurrency) 与并行 (Parallelism)并发:多个任务在时间片段内交替执行,表现出同时进行的效果。并行:多个任务在多个处理器或处理器核上同时执行。C++11...
C++ 多态
C++ 多态多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。在 C++ 中,多态(Polymorphism)是面向对象编程的重要特性之一。 C++ 多态允许使用基类指针或引用来调用子类的重写方法,从而使得同一接口可以表现不同的行为。多态使得代码更加灵活和通用,程序可以通过基类指针或引用来操作不同类型的对象,而不需要显式区分对象类型。这样可以使代码更具扩展性,在增加新的形状类时不需要修改主程序。以下是多态的几个关键点:虚函数(Virtual Functions): 在基类中声明一个函数为虚函数,使用关键字virtual。派生类可以重写(override)这个虚函数。调用虚函数时,会根据对象的实际类型来决定调用哪个版本的函数。 动态绑定(Dynamic Binding): 也称为晚期绑定(Late Binding),在运行时确定函数调用的具体实现。需要使用指向基类的指针或引用来调用虚函数,编译器在运行时根据对象的实际类型来决定调用哪个函数。 纯虚函数(Pure Virtual...
C++ 基本语法
C++ 基本语法 C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 对象 - 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。类 - 类可以定义为描述对象行为/状态的模板/蓝图。方法 - 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。即时变量 - 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 C++ 程序结构让我们看一段简单的代码,可以输出单词 Hello World。 实例 #include using namespace std; // main() 是程序开始执行的地方int main(){cout << “Hello World”; // 输出 Hello Worldreturn 0;} 接下来我们讲解一下上面这段程序: C++...
C++ 基本的输入输出
C++ 基本的输入输出 C++ 标准库提供了一组丰富的输入/输出功能,我们将在后续的章节进行介绍。本章将讨论 C++ 编程中最基本和最常见的 I/O 操作。C++ 的 I/O 发生在流中,流是字节序列。如果字节流是从设备(如键盘、磁盘驱动器、网络连接等)流向内存,这叫做输入操作。如果字节流是从内存流向设备(如显示屏、打印机、磁盘驱动器、网络连接等),这叫做输出操作。 I/O 库头文件下列的头文件在 C++ 编程中很重要。 头文件函数和描述该文件定义了 cin、cout、cerr 和 clog 对象,分别对应于标准输入流、标准输出流、非缓冲标准错误流和缓冲标准错误流。该文件通过所谓的参数化的流操纵器(比如 setw 和 setprecision),来声明对执行标准化 I/O 有用的服务。该文件为用户控制的文件处理声明服务。我们将在文件和流的相关章节讨论它的细节。 标准输出流(cout)预定义的对象 cout 是 iostream 类的一个实例。cout 对象”连接”到标准输出设备,通常是显示屏。cout 是与流插入运算符...
C++ 命名空间
C++ 命名空间假设这样一种情况,当一个班上有两个名叫 Zara 的学生时,为了明确区分它们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等等。同样的情况也出现在 C++ 应用程序中。例如,您可能会写一个名为 xyz() 的函数,在另一个可用的库中也存在一个相同的函数 xyz()。这样,编译器就无法判断您所使用的是哪一个 xyz() 函数。因此,引入了命名空间这个概念,专门用于解决上面的问题,它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上,命名空间就是定义了一个范围。我们举一个计算机系统中的例子,一个文件夹(目录)中可以包含多个文件夹,每个文件夹中不能有相同的文件名,但不同文件夹中的文件可以重名。 定义命名空间命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示: namespace namespace_name {// 代码声明} 为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称,如下所示: name::code; ...