C++标准库:STL以及输入输出库,IO库,Cmath库,时间库,智能指针库与并发库等简介

  • 标准库

C++ 标准库是 C++ 编程语言的核心部分,提供了丰富的功能和组件,包括容器、算法、迭代器、函数对象、智能指针、输入输出操作等。C++ 标准库主要包括以下几个组件:

  1. STL(Standard Template Library):STL 是 C++ 标准库的核心部分,包括容器、算法和迭代器。容器用于存储数据,如 vector、list、map 等;算法提供了各种通用算法,如排序、查找、遍历等;迭代器用于遍历容器中的元素。

  2. 输入输出库:C++ 标准库提供了输入输出流类,用于实现输入输出操作。包括iostreamfstreamstringstream等类,可以实现对文件、标准输入输出流的读写操作。

  3. 字符串处理库:C++ 标准库提供了丰富的字符串处理功能,包括string类、字符串流stringstream等,用于字符串的拼接、查找、替换等操作。

  4. 数学库:C++ 标准库提供了数学函数库<cmath>,包括各种数学函数如三角函数、指数函数、对数函数等。

  5. 时间库:C++ 标准库提供了时间处理功能,包括<chrono>头文件用于处理时间点和时间间隔,<ctime>头文件用于处理 C 风格的时间表示。

  6. 智能指针库:C++11 引入了智能指针,包括std::shared_ptrstd::unique_ptrstd::weak_ptr,用于管理动态内存的所有权和生命周期。

  7. 并发库:C++11 引入了并发编程的支持,包括线程库<thread>、互斥量<mutex>、条件变量<condition_variable>等,用于实现多线程编程。

  8. 其他库:除上述几个主要组件外,C++ 标准库还包括其他功能模块,如异常处理、随机数生成、正则表达式等。

C++ 标准库的设计目标是提供高效、通用、可移植的功能组件,减少重复性开发,提高程序员的生产效率。标准库的组件之间有很好的协作性,可以灵活组合使用,满足不同的编程需求。

  • STL

STL(Standard Template Library,标准模板库)是 C++ 标准库的核心部分,提供了丰富的通用数据结构和算法,用于实现各种常见的数据处理操作。STL 主要包括三个组件:容器(Containers)、算法(Algorithms)和迭代器(Iterators)。

容器(Containers):

STL 中的容器是用于存储数据的数据结构,提供了各种不同类型的容器,如动态数组、链表、栈、队列、集合、映射等。常见的 STL 容器包括:

  • 序列容器vector(动态数组)、list(双向链表)、deque(双端队列)、array(固定大小数组)等。
  • 关联容器set(集合)、map(映射)、multiset(多重集合)、multimap(多重映射)等。
  • 容器适配器stack(栈)、queue(队列)、priority_queue(优先队列)等。

算法(Algorithms):

STL 中的算法提供了各种通用算法,用于在容器中执行各种操作,如查找、排序、修改等。这些算法可以用于不同类型的容器,并且支持自定义函数对象来扩展功能。常见的 STL 算法包括:

  • 查找算法findfind_ifbinary_searchcount 等。
  • 排序算法sortstable_sortpartial_sort 等。
  • 修改算法copytransformreplacefill 等。
  • 数值算法accumulateinner_productpartial_sum 等。

迭代器(Iterators):

迭代器是 STL 的核心概念,用于遍历容器中的元素,并提供统一的访问接口。迭代器将算法和容器解耦,使得算法可以独立于容器进行操作。STL 提供了不同类型的迭代器,包括输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。

STL 的设计思想是将数据结构和算法分离,提供通用的组件,使得开发人员可以快速、简单地实现各种数据处理操作。STL 中的组件之间有很好的兼容性和可组合性,可以灵活地搭配使用,满足不同的编程需求。 STL 的广泛应用使得 C++ 成为一种强大的编程语言,适用于各种应用场景。

  • 输入输出库

C++ 标准库提供了丰富的输入输出流类,用于实现对不同数据源(如标准输入输出、文件、字符串等)的输入输出操作。输入输出流类主要包括iostreamfstreamstringstream等,每种类别都有特定的用途和功能。

1. iostream(标准输入输出流):

iostream是 C++ 标准库中用于控制台输入输出操作的流类。它包括了istream(输入流)和ostream(输出流)两个基类,以及iostream(输入输出流)类。常见的iostream类有:

  • cin:标准输入流,用于从控制台读取输入。
  • cout:标准输出流,用于向控制台输出数据。
  • cerr:标准错误流,用于向控制台输出错误信息。
  • clog:标准日志流,用于向控制台输出日志信息。
#include <iostream>int main() {int num;std::cout << "Enter a number: ";std::cin >> num;std::cout << "You entered: " << num << std::endl;return 0;
}

2. fstream(文件输入输出流):

fstream是 C++ 标准库中用于文件输入输出操作的流类。它包括了ifstream(文件输入流)、ofstream(文件输出流)和fstream(文件输入输出流)三个类,用于读取和写入文件数据。

#include <fstream>int main() {std::ofstream outFile("output.txt");if (outFile.is_open()) {outFile << "Hello, world!";outFile.close();}std::ifstream inFile("input.txt");if (inFile.is_open()) {std::string line;while (std::getline(inFile, line)) {std::cout << line << std::endl;}inFile.close();}return 0;
}

3. stringstream(字符串流):

stringstream是 C++ 标准库中用于字符串流操作的类,可以方便地将字符串作为流来处理。它可以用于将数据转换为字符串或将字符串解析为数据。

#include <sstream>
#include <iostream>int main() {std::stringstream ss;int num = 123;ss << "The number is: " << num;std::string result = ss.str();std::cout << result << std::endl;return 0;
}

以上是 C++ 标准库中输入输出流类的简要介绍,通过使用这些流类,可以实现对不同数据源的输入输出操作,包括控制台、文件和字符串等。这些流类提供了丰富的功能和灵活的接口,使得 C++ 编程更加方便和高效。

  • 字符串处理库

C++ 标准库提供了丰富的字符串处理功能,包括string类、字符串流stringstream等,用于字符串的拼接、查找、替换等操作。下面详细介绍字符串处理库的主要组件以及使用方法:

1. std::string 类:

std::string 是 C++ 标准库中用于表示和处理字符串的类,提供了各种方法来操作字符串数据。常见的操作包括:

  • 构造和赋值:可以通过构造函数、赋值运算符和字符串字面值来创建std::string对象。
  • 访问和修改:可以使用下标访问、at()方法和迭代器来访问和修改字符串中的字符。
  • 拼接:可以使用+运算符或append()方法来将字符串连接起来。
  • 查找和替换:可以使用find()rfind()replace()等方法来查找和替换子字符串。
  • 比较:可以使用==<等运算符来比较字符串是否相等或大小。
  • 转换:可以使用stoi()stof()等函数将字符串转换为数字或其他类型。
#include <iostream>
#include <string>int main() {std::string str1 = "Hello";std::string str2 = "World";std::string combined = str1 + " " + str2;std::cout << "Combined string: " << combined << std::endl;if (combined.find("World") != std::string::npos) {std::cout << "Found 'World' in the string." << std::endl;}combined.replace(6, 5, "C++");std::cout << "Replaced string: " << combined << std::endl;return 0;
}

2. std::stringstream 类:

std::stringstream 是 C++ 标准库中用于字符串流操作的类,可以方便地将字符串作为流来处理。它可以用于将数据转换为字符串或字符串解析为数据。

#include <iostream>
#include <sstream>int main() {int num = 123;std::stringstream ss;ss << "The number is: " << num;std::string result = ss.str();std::cout << result << std::endl;std::stringstream ss2("10 20 30");int a, b, c;ss2 >> a >> b >> c;std::cout << "Parsed numbers: " << a << ", " << b << ", " << c << std::endl;return 0;
}

通过使用std::string类和std::stringstream类,可以方便地实现对字符串的各种操作,包括拼接、查找、替换、转换等。这些类提供了丰富的功能和灵活的接口,使得 C++ 字符串处理变得简单而高效。

  • 数学库

C++ 标准库提供了数学库 <cmath>,包含了各种数学函数,如三角函数、指数函数、对数函数、幂函数、取整函数等,用于数学计算和处理。下面是数学库常用函数的介绍以及使用方法:

1. 常用数学函数:

  • 三角函数sin()cos()tan()asin()acos()atan()
  • 指数函数exp()log()log10()pow()
  • 取整函数ceil()floor()round()
  • 绝对值函数abs()fabs()
  • 平方根函数sqrt()
  • 随机数函数rand()srand()

2. 使用方法示例:

#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>int main() {// 三角函数示例double angle = 45.0;double sine = sin(angle * M_PI / 180); // M_PI 是 π 的常量std::cout << "Sine of " << angle << " degrees: " << sine << std::endl;// 指数函数示例double base = 2.0;double exponent = 3.0;double power = pow(base, exponent);std::cout << base << " raised to the power of " << exponent << ": " << power << std::endl;// 随机数示例srand(time(0)); // 初始化随机数种子int randomNum = rand() % 100; // 生成 0 到 99 之间的随机数std::cout << "Random number: " << randomNum << std::endl;return 0;
}

通过包含 <cmath> 头文件,并使用其中提供的数学函数,可以在 C++ 程序中进行各种数学计算和处理。这些函数提供了丰富的数学功能,能够满足各种数学计算需求。在使用随机数函数时,需要注意初始化随机数种子,以确保每次运行程序时产生的随机数不同。

  • 时间库

C++ 标准库中的时间库主要包括 <chrono> 头文件,用于处理时间点(time points)和时间间隔(durations)。通过时间库,可以进行时间的计算、比较和转换,以及实现定时操作和时间相关的功能。下面是时间库的主要内容以及应用示例:

1. 时间点(time points):

  • std::chrono::time_point:表示特定时钟上的时间点,可以精确到纳秒级别。
  • 时钟类型:不同的时钟类型(std::chrono::system_clockstd::chrono::steady_clockstd::chrono::high_resolution_clock)提供不同的精度和稳定性。

2. 时间间隔(durations):

  • std::chrono::duration:表示时间的间隔,可以以不同的时间单位(秒、毫秒、微秒、纳秒等)表示。
  • std::chrono::duration_cast:用于时间间隔之间的单位转换。

3. 应用示例:

#include <iostream>
#include <chrono>
#include <thread>int main() {// 获取当前时间点auto start = std::chrono::high_resolution_clock::now();// 模拟耗时操作std::this_thread::sleep_for(std::chrono::seconds(2));// 获取耗时时长auto end = std::chrono::high_resolution_clock::now();auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(end - start);// 输出耗时时长std::cout << "Operation took " << duration.count() << " milliseconds." << std::endl;return 0;
}

在上面的示例中,我们使用 <chrono> 头文件中的时间库来测量一个耗时操作的执行时间。首先,我们获取操作开始时的时间点,然后使用 std::this_thread::sleep_for 模拟一个持续 2 秒的耗时操作。最后,我们获取操作结束的时间点,并计算出操作的耗时时长,以毫秒为单位输出到控制台。

时间库在实际应用中经常用于性能分析、定时操作、超时控制等场景。通过精确测量时间点和时间间隔,可以帮助开发人员优化程序性能、控制程序运行时间,并实现时间相关的功能需求。

  • 智能指针库

C++11 引入了智能指针(Smart Pointers)来管理动态分配的内存,避免内存泄漏和悬空指针等问题。智能指针是一种 RAII(资源获取即初始化)的技术,可以在指针生命周期结束时自动释放内存。C++ 标准库提供了三种主要的智能指针:std::unique_ptrstd::shared_ptr 和 std::weak_ptr。以下是每种智能指针的详细介绍及用法示例:

1. std::unique_ptr

  • std::unique_ptr 用于独占拥有动态分配的对象,保证只有一个指针可以指向该对象。
  • 当 std::unique_ptr 离开作用域时,它所指向的对象会被自动释放。
  • 不能对同一个对象拥有多个 std::unique_ptr

用法示例

#include <memory>
#include <iostream>int main() {std::unique_ptr<int> uniquePtr(new int(42));std::cout << *uniquePtr << std::endl;// uniquePtr 离开作用域后,动态分配的内存会被自动释放return 0;
}

2. std::shared_ptr

  • std::shared_ptr 允许多个指针共享对同一个对象的拥有权,通过引用计数来管理对象的内存。
  • 当最后一个 std::shared_ptr 离开作用域时,对象的内存会被释放。
  • 可以通过 std::make_shared 来创建 std::shared_ptr

用法示例

#include <memory>
#include <iostream>int main() {std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);std::cout << *sharedPtr << std::endl;// 可以通过拷贝构造函数创建多个 sharedPtrauto sharedPtr2 = sharedPtr;// 最后一个 sharedPtr 离开作用域后,动态分配的内存会被自动释放return 0;
}

3. std::weak_ptr

  • std::weak_ptr 是 std::shared_ptr 的弱引用,不会增加引用计数,不影响对象的生命周期。
  • 通常用于解决 std::shared_ptr 循环引用问题。

用法示例

#include <memory>
#include <iostream>int main() {std::shared_ptr<int> sharedPtr = std::make_shared<int>(42);std::weak_ptr<int> weakPtr = sharedPtr;// 使用 lock() 方法获取 shared_ptr 对象if (auto shared = weakPtr.lock()) {std::cout << *shared << std::endl;} else {std::cout << "sharedPtr is expired" << std::endl;}return 0;
}

通过使用智能指针,可以避免手动管理动态内存分配的问题,有效地提高代码的可维护性和安全性。在选择使用哪种智能指针时,需要根据具体的需求和所有权关系来决定。

  • 并发库

C++ 标准库提供了一套并发库,包括 <thread><mutex><condition_variable> 等头文件,用于支持多线程编程和实现线程间的同步与通信。下面详细介绍并发库的主要组件以及使用方法:

1. <thread> 头文件:

  • std::thread 类用于创建和管理线程,可以执行指定的函数或函数对象。
  • std::this_thread::get_id() 可以获取当前线程的 ID。

用法示例

#include <iostream>
#include <thread>void threadFunction() {std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(threadFunction);std::cout << "Hello from main thread!" << std::endl;t.join(); // 等待线程 t 执行完毕return 0;
}

2. <mutex> 头文件:

  • std::mutex 类用于提供互斥锁,保护共享资源的访问,防止多个线程同时访问造成数据竞争。
  • std::lock_guard<std::mutex> 是一个 RAII 封装,用于自动管理互斥锁的上锁和解锁。

用法示例

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;void threadFunction() {std::lock_guard<std::mutex> lock(mtx);std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(threadFunction);{std::lock_guard<std::mutex> lock(mtx);std::cout << "Hello from main thread!" << std::endl;}t.join();return 0;
}

3. <condition_variable> 头文件:

  • std::condition_variable 类用于在多线程间进行条件变量的同步,配合互斥量使用。
  • wait()notify_one()notify_all() 用于条件变量的等待和唤醒操作。

用法示例

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void threadFunction() {std::unique_lock<std::mutex> lock(mtx);cv.wait(lock, [](){ return ready; });std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(threadFunction);{std::lock_guard<std::mutex> lock(mtx);ready = true;}cv.notify_one();t.join();return 0;
}

通过使用 <thread><mutex><condition_variable> 等并发库头文件,可以实现多线程编程,实现线程的创建、同步和通信等操作。合理地使用这些组件可以帮助我们编写高效、安全的多线程程序,避免数据竞争和死锁等问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/31593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

复分析——第6章—— Γ 函数和 ζ 函数(E.M. Stein R. Shakarchi)

第6章 Γ函数和Ζ函数(The Gamma and Zeta Functions) 毫不夸张地说&#xff0c;Γ函数和Ζ函数是数学中最重要的非初等函数之一。Γ函数在自然界中无处不在。它出现在大量计算中&#xff0c;并以分析中出现的大量恒等式为特征。对此的部分解释可能在于Γ函数的基本结构特性&…

游戏心理学Day21

玩家情绪与暴力攻击 情绪 情绪的分类 情绪是一种经常波动的东西&#xff0c;我们既体验过骄傲激动和开心&#xff0c;也体验过羞怯内疚和沮丧。我们的感受高度依赖于情境。研究者区分出至少三种途径来考察作为一种相对固定的人格特征的情绪&#xff0c;即为情感性&#xff0…

lock_wait_timeout

lock_wait_timeout 是 MySQL 中的一个重要参数&#xff0c;它用于控制当一个 MySQL 会话在等待锁时的等待时间。以下是关于 lock_wait_timeout 的详细解释&#xff1a; 定义与功能 定义&#xff1a;lock_wait_timeout 是一个会话或线程级别的参数&#xff0c;用于指定 MySQL …

python20 函数的定及调用

函数的定及调用 函数是将一段实现功能的完整代码&#xff0c;使用函数名称进行封装&#xff0c;通过函数名称进行调用。以此达到一次编写&#xff0c;多次调用的目的 用 def 关键字来声明 函数 格式&#xff1a; def 函数名(参数列表):函数体[:return 返回值是可选的&#xff0…

小白如何如何理解滑动窗口最大值问题python

文章目录 题目描述思路什么时候弹出元素什么时候加入元素 代码示例和解释 题目描述 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 举例&#xff1a; 输…

命令行脚本批量转换工具说明

O N C E &#xff0c; ONCE&#xff0c; ONCE&#xff0c;EACH&#xff0c;$0都是NimbleText的关键字 O N C E : 任何 在 ′ ONCE:任何在 ONCE:任何在′ONCE’关键字之后的文本将只输出一次&#xff0c;不管有多少行&#xff0c;到’$EACH’关键字或者到文件末尾为止。 E A C…

《沃趣 分手后霸道少爷宠爆我》盛大开机典礼

南京五聚文化传媒有限公司自豪地宣布&#xff0c;引人入胜的2024年度短剧巨作——《沃趣 分手后霸道少爷宠爆我》——今日正式开拍&#xff01;在星辰下的华丽舞台上&#xff0c;我们汇集了业界的精英力量&#xff0c;准备讲述一个关于爱、错位与重生的故事。 典礼精彩亮点 1.…

0621熟悉项目

1、store:全局状态管理器。共享给各组件的数据。 2、首页组件组成&#xff1a;layout组件下的index为入口。左侧菜单栏SidebarNew&#xff08;大概意思是遍历数组生成菜单&#xff09;&#xff0c;右侧菜单栏app-mai&#xff08;主体内容&#xff09; main-tags-view&#xff0…

数据治理工程师CDGA备考心得、时间安排、题库资源

1.写在前面 之前做一些数据质量控制、元数据、主数据相关工作&#xff0c;一直忙于工作&#xff0c;没有去往考证的方面想&#xff0c;去年年底心血来潮就决定考一考&#xff0c;证多不压身嘛&#xff08;也有部分学生向我咨询&#xff09;&#xff0c;资源在文章结尾&#xff…

逻辑学中的蕴涵式:SQL开发者必备知识

逻辑学中的蕴涵式&#xff1a;SQL开发者必备知识 在逻辑学中&#xff0c;蕴涵式&#xff08;Implication&#xff09;是一种常见的逻辑关系&#xff0c;用于描述两个命题之间的条件关系。在SQL开发中&#xff0c;理解蕴涵式的概念和真值规则对编写复杂查询语句非常有帮助。本文…

onnx转openvino模型(2022版本和2024版本)

网上很多方法都是用openvino自带的mo_onnx.py来转的&#xff0c;但个人下载的2022和2024版都没见到这些文件。所以使用不了 &#xff08;1&#xff09;2022版openvino&#xff1a;python需要安装对应版本的openvino库(以2022.3.0为例&#xff09; pip install openvino2022.3…

软件测试——稳定性测试:adb Monkey

Monkey 1. Monkey1.1 Monkey 是什么1.2 Monkey 测试场景1.3 Monkey 特点1.4 Monkey 在哪里1.5 测试准备事项1.6 Monkey 参数列表 2. 基本命令3. 常用参数4. 事件类型5. 调试参数6. 日志管理7. 日志错误定位8. Monkey测试可以发现的问题 1. Monkey 1.1 Monkey 是什么 Monkey是一…

MySQL笔记——事务

事务 **控制事务****并发事务问题**事务隔离级别 学习黑马MySQL课程&#xff0c;记录笔记&#xff0c;用于复习。 控制事务 方式一&#xff1a; #查看和设置事务提交方式 select autocommit ; set autocommit 0 ; #提交事务 commmit; #回滚事务 rollback;方式二&#xff1a;…

electron自定义标题栏的最大化,最小化,关闭窗口

渲染组件代码&#xff1a; <template><div class"window-btn"><i class"minimize" click"minimize"><img src"../assets/img/最小化.svg" alt"最小化" /></i><i v-if"!isMaximized&…

react 0至1 案例

/*** 导航 Tab 的渲染和操作** 1. 渲染导航 Tab 和高亮* 2. 评论列表排序* 最热 > 喜欢数量降序* 最新 > 创建时间降序* 1.点击记录当前type* 2.通过记录type和当前list中的type 匹配*/ import ./App.scss import avatar from ./images/bozai.png import {useState} …

【408考点之数据结构】队列:定义、特点、基本操作与应用

队列&#xff1a;定义、特点、基本操作与应用 队列的定义 队列&#xff08;Queue&#xff09;是一种特殊的线性表&#xff0c;仅允许在一端进行插入操作&#xff08;称为队尾&#xff0c;Rear&#xff09;&#xff0c;在另一端进行删除操作&#xff08;称为队头&#xff0c;F…

Springboot开发之 Excel 处理工具(二)-- Easyexcel

一、Easyexcel 简介 EasyExcel是一个基于Java的Excel处理工具库&#xff0c;它的核心设计理念是快速、简洁&#xff0c;并且能够有效解决处理大文件时的内存溢出问题。使用EasyExcel&#xff0c;开发者可以在几乎不需要考虑性能和内存消耗的情况下&#xff0c;轻松实现Excel文…

第六节 LLava模型数据处理源码解读(input_ids/labels/attention_mask/image,下篇)

文章目录 前言一、数据格式标签二、LazySupervisedDataset的__gettitem__函数源码解读1、source获取2、图像数据处理1、对话内容source获取(存在图像条件)2、对话内容source获取(不存在图像条件)3、对话文本数据加工4、data_dict进一加工5、data_dict的image元素添加6、返回…

肾虚学习实验第T1周:实现mnist手写数字识别

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 目录 一、前言 作为一名研究牲&#xff0…

全面讲解,使用Python搭建自己的后端服务(FastAPI),并提供API接口

全面讲解,使用Python搭建自己的后端服务(FastAPI),并提供API接口 开始工作推荐的项目结构详细步骤配置 Uvicorn 以在 `0.0.0.0` 上运行配置日志记录查看日志完整的项目结构其它解释为什么要对 `start.sh` 赋予执行权限背景为什么要创建 `start.sh` 脚本?为什么要对 `start…