C++学习路程-7-C++标准库

news/2024/12/22 9:29:51/

C++标准库概述

C++标准库是C++语言的一部分,提供了一系列的类、函数和模板,旨在简化编程过程,提高代码的可读性和可维护性。它的主要组成部分包括输入/输出库、容器库、算法库、字符串处理库、时间和日期库、多线程库和文件输入输出库等。

1. 输入/输出库

定义

输入/输出库提供了处理数据输入和输出的功能,主要通过流(stream)来实现。流是数据的抽象表示,可以是输入流(读取数据)或输出流(写入数据)。

关键组件

  • std::cin:标准输入流,用于从键盘读取数据。
  • std::cout:标准输出流,用于输出数据到屏幕。
  • std::cerr:标准错误输出流,用于输出错误信息,通常不缓冲。
  • std::clog:标准日志输出流,用于输出日志信息,通常缓冲。

示例

cpp

#include <iostream> // 包含输入输出库int main() {int number; // 声明一个整数变量// 提示用户输入std::cout << "Enter a number: ";std::cin >> number; // 从标准输入获取用户输入// 输出用户输入的数字std::cout << "You entered: " << number << std::endl; return 0; // 返回0表示程序正常结束
}

2. 容器库

定义

容器是用于存储和管理数据的数据结构。C++标准库提供了多种容器,以满足不同的需求,主要分为序列容器和关联容器。

关键类型

2.1 序列容器

序列容器按特定顺序存储元素,支持随机访问或顺序访问。

  • std::vector:动态数组,支持快速随机访问。
  • std::deque:双端队列,支持在两端高效插入和删除。
  • std::list:双向链表,适合频繁插入和删除操作。
示例:std::vector

cpp

#include <vector> // 包含向量库
#include <iostream> // 包含输入输出库int main() {std::vector<int> numbers; // 创建一个整数类型的向量// 向向量添加元素numbers.push_back(10); // 向量末尾添加10numbers.push_back(20); // 向量末尾添加20numbers.push_back(30); // 向量末尾添加30// 遍历并输出向量中的每个元素std::cout << "Vector elements: ";for (size_t i = 0; i < numbers.size(); ++i) { // 使用索引遍历std::cout << numbers[i] << " "; // 输出元素}std::cout << std::endl; // 输出换行return 0; // 返回0表示程序正常结束
}

2.2 关联容器

关联容器存储键值对,自动排序,支持快速查找。

  • std::set:集合,存储唯一元素。
  • std::map:映射,存储键值对,按键自动排序。
示例:std::map

cpp

#include <map> // 包含映射库
#include <iostream> // 包含输入输出库int main() {std::map<std::string, int> ageMap; // 创建一个字符串到整数的映射// 向映射中添加键值对ageMap["Alice"] = 30; // Alice的年龄为30ageMap["Bob"] = 25; // Bob的年龄为25ageMap["Charlie"] = 35; // Charlie的年龄为35// 遍历并输出映射中的每个键值对std::cout << "Age map:" << std::endl;for (const auto& entry : ageMap) { // 使用范围for循环遍历std::cout << entry.first << " is " << entry.second << " years old." << std::endl; // 输出键值对}return 0; // 返回0表示程序正常结束
}

3. 算法库

定义

算法库包含了对容器中数据进行操作的算法,例如排序、查找和变换等。它们通常以模板的形式实现,可以作用于任何类型的容器。

关键算法

  • 排序std::sort - 对容器中的元素进行排序。
  • 查找std::find - 在容器中查找特定元素。
  • 变换std::transform - 对容器中每个元素执行操作。

示例:使用std::sort进行排序

cpp

#include <algorithm> // 包含算法库
#include <vector> // 包含向量库
#include <iostream> // 包含输入输出库int main() {std::vector<int> numbers = {4, 2, 3, 1}; // 初始化向量std::sort(numbers.begin(), numbers.end()); // 对向量进行排序// 输出排序后的元素std::cout << "Sorted numbers: ";for (const auto& num : numbers) { // 使用范围for循环遍历std::cout << num << " "; // 输出每个元素}std::cout << std::endl; // 输出换行return 0; // 返回0表示程序正常结束
}

4. 字符串处理库

定义

C++标准库中的字符串处理库主要通过std::string类来管理和操作字符串。std::string提供了动态大小的字符串,支持多种操作。

关键功能

  • 字符串拼接:使用 + 运算符。
  • 查找子串:find 方法查找子串。
  • 字符串比较:使用 compare 方法进行比较。

示例:使用std::string进行字符串操作

cpp

#include <string> // 包含字符串库
#include <iostream> // 包含输入输出库int main() {std::string greeting = "Hello"; // 创建字符串greeting += ", World!"; // 字符串拼接std::cout << greeting << std::endl; // 输出拼接后的字符串// 查找子串size_t position = greeting.find("World"); // 查找"World"的位置if (position != std::string::npos) { // 如果找到std::cout << "\"World\" found at position: " << position << std::endl; // 输出位置}return 0; // 返回0表示程序正常结束
}

5. 时间和日期库

定义

时间和日期库提供了处理时间和日期的功能,主要通过<chrono>头文件实现。它定义了时钟、时间段和时间点等概念。

关键组件

  • 时钟:用于获取当前时间点。
  • 时间段:表示时间的持续时间。
  • 时间点:表示某一特定的时间。

示例:使用<chrono>计算耗时

cpp

#include <chrono> // 包含时间库
#include <iostream> // 包含输入输出库
#include <thread> // 包含线程库int main() {auto start = std::chrono::high_resolution_clock::now(); // 获取开始时间// 模拟耗时操作std::this_thread::sleep_for(std::chrono::seconds(1)); // 暂停1秒auto end = std::chrono::high_resolution_clock::now(); // 获取结束时间std::chrono::duration<double> elapsed = end - start; // 计算耗时std::cout << "Elapsed time: " << elapsed.count() << " seconds" << std::endl; // 输出耗时return 0; // 返回0表示程序正常结束
}

6. 多线程库

定义

多线程库提供了对多线程编程的支持,允许程序并发执行多个任务。它通过<thread>头文件实现。

关键组件

  • std::thread:用于创建和管理线程。
  • std::mutex:用于实现互斥锁,确保线程安全。
  • std::condition_variable:用于线程间的条件同步。

示例:创建和使用线程

cpp

#include <iostream> // 包含输入输出库
#include <thread> // 包含线程库// 线程函数
void printMessage() {std::cout << "Hello from thread!" << std::endl; // 输出线程消息
}int main() {std::thread t(printMessage); // 创建新线程并执行printMessage函数t.join(); // 等待线程完成std::cout << "Thread has finished." << std::endl; // 输出线程结束消息return 0; // 返回0表示程序正常结束
}

7. 文件输入输出库

定义

文件输入输出库用于处理文件的读写操作,主要通过<fstream>头文件实现。

关键组件

  • std::ifstream:用于从文件读取数据。
  • std::ofstream:用于向文件写入数据。
  • std::fstream:用于同时读写文件。

示例:文件的读写操作

cpp

#include <fstream> // 包含文件输入输出库
#include <iostream> // 包含输入输出库int main() {std::ofstream outFile("example.txt"); // 创建文件输出流// 向文件写入数据outFile << "Hello, File!" << std::endl;outFile.close(); // 关闭文件输出流std::ifstream inFile("example.txt"); // 创建文件输入流std::string line; // 用于存储读取的行// 逐行读取数据while (std::getline(inFile, line)) { std::cout << line << std::endl; // 输出每行}inFile.close(); // 关闭文件输入流return 0; // 返回0表示程序正常结束
}

8. C++11及以后的新特性

定义

C++11及以后的标准引入了许多新特性,丰富了标准库的功能和便利性,使编程更为简洁和高效。

关键新特性

  • 智能指针std::unique_ptrstd::shared_ptr,用于自动管理动态内存,避免内存泄漏。

  • Lambda表达式:可用于简化函数对象的定义,方便创建内联函数。

    示例

    cpp

    auto lambda = [](int x) { return x * x; }; // 定义一个Lambda表达式
    std::cout << lambda(5); // 输出25
    
  • 范围for循环:简化对容器的遍历。

    示例

    cpp

    std::vector<int> vec = {1, 2, 3, 4};
    for (const auto& item : vec) { // 使用范围for循环遍历std::cout << item << " "; // 输出每个元素
    }
    
  • 线程库:提供了对多线程编程的支持,允许更好地利用多核处理器。

总结

C++标准库为程序员提供了丰富的工具和功能,使得开发过程更加高效和便捷。通过掌握这些组件,可以提高代码的可读性和可维护性,编写出更高效的程序。


http://www.ppmy.cn/news/1557159.html

相关文章

使用ioredis在Node.js中操作Redis数据结构的详细指南

使用ioredis在Node.js中操作Redis数据结构的详细指南 一. 使用ioredis操作Redis数据结构的详细知识点讲解 在Node.js中&#xff0c;ioredis是一个强大且易于使用的Redis客户端库&#xff0c;它提供了对Redis数据库的直接操作。本文将通过一系列代码示例&#xff0c;详细解释如…

Flutter 多个弹窗关闭指定弹窗

前言 大家都知道Flutter的页面是堆栈式管理&#xff0c;通常关闭页面是最后进入的最先关闭&#xff0c;通过pop进行一个退栈操作。 但是我碰到一个问题&#xff0c;有时需要在同一页面上显示多个弹窗。如果此时需要关闭指定的某一个弹窗&#xff0c;那退栈操作明显不合适了&a…

网络安全防范

实践内容 学习总结 PDR&#xff0c;$$P^2$$DR安全模型。 防火墙&#xff08;Firewall&#xff09;&#xff1a; 网络访问控制机制&#xff0c;布置在网际间通信的唯一通道上。 不足&#xff1a;无法防护内部威胁&#xff0c;无法阻止非网络传播形式的病毒&#xff0c;安全策略…

GitHub企业版:AWS CodeCommit迁移的最佳路径与技术优势

此前&#xff0c;亚马逊网路服务&#xff08;AWS&#xff09;宣布&#xff0c;自2024年7月25日起&#xff0c;AWS CodeCommit不再接受新客户。虽然现有客户可以继续使用该服务&#xff0c;且其安全性、可用性和性能将得到维护&#xff0c;但AWS将不再推出新功能或接受新用户。 …

MySQL 8.0 新特性详解

MySQL 8.0 引入了许多重要的功能和改进&#xff0c;这些特性显著提升了数据库的性能、可用性和开发体验。以下是 MySQL 8.0 的主要新特性及其详细解析&#xff1a; 降序索引支持 MySQL 8.0 支持降序索引&#xff0c;而之前版本即使语法支持&#xff0c;实际仍为升序。通过降序…

RabbitMQ镜像队列机制

RabbitMQ镜像队列机制 机制原理实现原理注意事项 集群结构注意事项 镜像结构普通队列结构镜像队列结构 组播GMGM的作用实现原理实现过程 加入新节点注意事项 节点宕机的影响 配置镜像队列注意事项定义参数参数含义注意事项 命令配置命令格式参数释义 查看要进行镜像的队列设置策…

FastAPI vs Go 性能对比分析

FastAPI vs Go 性能对比分析 总体结论 FastAPI 虽然性能优秀&#xff0c;但整体上仍无法完全达到 Go 的性能水平。 详细对比 优势 FastAPI 开发效率高Python生态系统丰富自动API文档生成类型检查和验证异步支持好 Go 原生性能更强内存占用更低并发处理能力强编译型语言的优…

postmam 请求报 Bad Request This combination of host and port requires TLS.解决办法

方案1&#xff1a;如果是postman请求&#xff1a;setting中把ssl证书验证关闭 方案2&#xff1a;查看请求地址&#xff0c;将http改为https 方案3&#xff1a;端口缓存问题&#xff0c;清除端口缓存