C++之STL库简介

 

目录

一、STL(Standard Template Library,标准模板库)

二、容器(Containers)

1.vector(动态数组)

2.list(双向链表)

3.deque(双端队列)

4.stack(栈)

5.queue(队列)

6.set(集合)

7.map(映射)

三、算法(Algorithms)

四、迭代器(Iterators)


一、STL(Standard Template Library,标准模板库)

是一组C++标准库的组合,其中包括多个容器类、算法和迭代器等。STL库的设计目标是提供一组通用的数据结构和算法,从而使C++程序员能够编写高效、可维护的代码。

STL库的核心组件包括以下三个部分:

  1. 容器(Containers):STL库提供了多个容器类,包括vector、list、deque、queue、stack、set、map等,这些容器类支持不同的数据结构和访问方式,可以满足各种不同的需求。

  2. 算法(Algorithms):STL库提供了大量的算法函数,包括查找、排序、变换、数值计算等,这些算法函数可以对容器中的元素进行操作,从而实现各种有用的功能。

  3. 迭代器(Iterators):STL库提供了多个迭代器类,包括input_iterator、output_iterator、forward_iterator、bidirectional_iterator、random_access_iterator等,这些迭代器类支持不同的遍历方式和访问方式,可以帮助程序员快速、方便地访问容器中的元素。

使用STL库,程序员可以通过简单的代码实现复杂的数据结构和算法。例如,使用vector容器和sort算法可以快速地对一组数据进行排序,而使用set容器和find算法可以快速地查找某个元素是否存在于一个集合中。在实际的软件开发中,STL库已经成为C++程序员必不可少的工具之一。

STL库的核心组件包括容器(Containers)、算法(Algorithms)和迭代器(Iterators)。下面将对每个组件进行详细介绍,并给出相应的案例。

二、容器(Containers)

STL库提供了多个容器类,用于存储和管理数据。常用的容器类包括:

以下是一个使用vector容器的示例,展示了如何存储一组整数并进行遍历:

  • vector:动态数组,支持随机访问。
  • list:双向链表,支持快速插入和删除。
  • deque:双端队列,支持头尾快速插入和删除。
  • stack:栈,后进先出。
  • queue:队列,先进先出。
  • set:集合,有序且不重复的元素集合。
  • map:映射,键值对的集合。
#include <iostream>
#include <vector>int main() {std::vector<int> numbers;  // 创建一个空的vector容器// 向容器中添加数据numbers.push_back(10);numbers.push_back(20);numbers.push_back(30);numbers.push_back(40);// 遍历容器中的数据并打印for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

下面对STL库中的容器进行详细介绍:

1.vector(动态数组)

vector是一个动态数组,支持随机访问,并且具有动态调整大小的能力。它在内存中以连续的块存储元素,可以通过下标直接访问元素。vector的插入和删除操作相对较慢,但是访问元素的速度很快。

2.list(双向链表)

list是一个双向链表,支持快速插入和删除操作。它的每个元素都包含一个前向指针和一个后向指针,这使得在任意位置进行插入和删除操作非常高效。然而,由于链表的特性,list不支持随机访问,只能通过迭代器进行遍历。

3.deque(双端队列)

deque是一个双端队列,可以在头部和尾部进行快速插入和删除操作。它内部使用多个缓冲区存储元素,支持动态调整大小。和vector一样,deque也支持随机访问。

4.stack(栈)

stack是一个后进先出(LIFO)的数据结构,它基于其他容器实现,如deque或list。栈只能在顶部进行插入和删除操作,不支持随机访问。常用的操作包括push(入栈)、pop(出栈)和top(获取栈顶元素)。

5.queue(队列)

queue是一个先进先出(FIFO)的数据结构,它也基于其他容器实现,如deque或list。队列只能在尾部进行插入操作,在头部进行删除操作,不支持随机访问。常用的操作包括push(入队)、pop(出队)和front(获取队头元素)。

6.set(集合)

set是一个集合,其中的元素按照某种特定的排序规则进行存储,并且不允许有重复元素。set内部使用红黑树实现,这使得插入、删除和查找操作的时间复杂度都是O(log n)。常用的操作包括insert(插入元素)、erase(删除元素)和find(查找元素)。

7.map(映射)

map是一个键值对的集合,其中的每个元素由一个键和一个值组成。map中的元素按照键的排序规则进行存储,并且不允许有重复键。map也是基于红黑树实现的,常用的操作包括insert(插入键值对)、erase(删除键值对)和find(查找键值对)。

假设我们要编写一个程序,用于存储和管理学生信息,包括姓名、年龄和成绩等。为了实现这一功能,我们可以使用STL库中的容器类来存储学生对象,并且可以通过各种操作来管理这些学生信息。

具体实现如下:

#include <iostream>
#include <vector>
#include <algorithm>using namespace std;// 学生类
class Student {
public:string name;int age;double score;Student() {}Student(const string& n, int a, double s) : name(n), age(a), score(s) {}
};// 学生管理类
class StudentManager {
private:vector<Student> students;   // 学生列表public:// 添加学生void addStudent(const Student& s) {students.push_back(s);}// 删除学生void removeStudent(const string& name) {for (auto it = students.begin(); it != students.end(); ++it) {if (it->name == name) {students.erase(it);break;}}}// 修改学生信息void modifyStudent(const string& name, int age, double score) {for (auto& s : students) {if (s.name == name) {s.age = age;s.score = score;break;}}}// 查找学生信息Student* findStudent(const string& name) {for (auto& s : students) {if (s.name == name) {return &s;}}return nullptr;}// 按成绩排序void sortByScore() {sort(students.begin(), students.end(), [](const Student& lhs, const Student& rhs) {return lhs.score > rhs.score;});}// 显示所有学生信息void displayAllStudents() {for (auto& s : students) {cout << "Name: " << s.name << ", Age: " << s.age << ", Score: " << s.score << endl;}}
};int main() {StudentManager sm;// 添加学生sm.addStudent(Student("Tom", 18, 80.5));sm.addStudent(Student("Alice", 19, 90.0));sm.addStudent(Student("Bob", 20, 85.5));// 查找学生信息Student* s = sm.findStudent("Tom");if (s != nullptr) {cout << "Found student: " << s->name << ", Age: " << s->age << ", Score: " << s->score << endl;} else {cout << "Student not found." << endl;}// 修改学生信息sm.modifyStudent("Alice", 20, 95.0);// 删除学生sm.removeStudent("Bob");// 按成绩排序sm.sortByScore();// 显示所有学生信息sm.displayAllStudents();return 0;
}

三、算法(Algorithms)

STL库提供了大量的算法函数,用于对容器中的元素执行各种操作,如查找、排序、变换和数值计算等。常用的算法函数包括:

以下是一个使用sort算法对vector容器进行排序的示例:

  • find:在容器中查找指定元素。
  • sort:对容器中的元素进行排序。
  • transform:将容器中的元素按照某个规则进行转换。
  • accumulate:计算容器中元素的累加或累乘结果。
  • #include <iostream>
    #include <vector>
    #include <algorithm>int main() {std::vector<int> numbers = {5, 3, 8, 1, 2, 4};// 使用sort算法对容器进行排序std::sort(numbers.begin(), numbers.end());// 打印排序后的结果for (const auto& num : numbers) {std::cout << num << " ";}std::cout << std::endl;return 0;
    }
    

四、迭代器(Iterators)

  • 迭代器是STL库中用于遍历和访问容器元素的通用接口。迭代器提供了统一的方式来访问不同类型容器的元素,使算法能够独立于具体容器的实现。常用的迭代器类型包括:

    以下是一个使用迭代器遍历vector容器的示例:

    • iterator:可读写的迭代器。
    • const_iterator:只读的迭代器。
    • reverse_iterator:反向迭代器。
    • const_reverse_iterator:只读的反向迭代器。
#include <iostream>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用迭代器遍历容器并打印元素for (auto it = numbers.begin(); it != numbers.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl;return 0;
}

通过使用STL库,程序员可以方便地使用各种数据结构和算法,并减少重复编写代码的工作量。此外,STL库还提供了丰富的算法函数,让开发者能够快速高效地处理数据和实现各种功能。

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

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

相关文章

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(7)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置&#xff08;6&#xff09; 2.2 HOST主桥 MPC8548处理器的拓扑结构如图2-2所示&#xff1a; OCeaN部件的拓扑结构如图2-3所示&#xff1a; 2.2.1 PCI设备配置空间的访问机制 为了…

大学生搜题软件,未来可期吗?

作为一家专注于软件开发的公司《智创有术》&#xff0c;我们致力于为客户提供创新、高效和可靠的解决方案。通过多年的经验和专业知识&#xff0c;我们已经在行业内建立了良好的声誉&#xff0c;并赢得了客户的信任和支持。 支持各种源码&#xff0c;网站搭建&#xff0c;APP&a…

如何撰写引人注目的博文

本文介绍了撰写博文和利用博客增加有机网站流量的艺术。本文将链接到我们博客上的一些最佳内容&#xff0c;以解决一些具体问题。 写什么 想知道如何创建博客吗&#xff1f;在撰写博文时&#xff0c;请始终牢记以下两个问题&#xff1a; 博客是为你的读者服务的&#xff0c;用…

2024年需要高度关注的六大网络安全威胁

创新技术&#xff08;如生成式人工智能、无代码应用程序、自动化和物联网&#xff09;的兴起和迅速采用&#xff0c;极大地改变了每个行业的全球网络安全和合规格局。 网络犯罪分子正在转向新的技术、工具和软件来发动攻击&#xff0c;造成更大的破坏。因此&#xff0c;《2023年…

如何在Android Glide中结合使用CenterCrop和自定义圆角变换(图片部分圆角矩形)

如何在Android Glide中结合使用CenterCrop和自定义圆角变换&#xff08;图片部分圆角矩形&#xff09; 在Android开发中&#xff0c;使用Glide加载图片时&#xff0c;我们经常需要对图片进行特定的处理&#xff0c;比如裁剪和圆角变换&#xff0c;特别是一些设计稿&#xff0c;…

基于R语言(SEM)结构方程模型教程

详情点击链接&#xff1a;基于R语言&#xff08;SEM&#xff09;结构方程模型教程 01、R/Rstudio (2)R语言基本操作&#xff0c;包括向量、矩阵、数据框及数据列表等生成和数据提取等 (3)R语言数据文件读取、整理&#xff08;清洗&#xff09;、结果存储等&#xff08;含tidve…

红队专题-Web安全/渗透测试-文件上传/下载/包含

文件上传/下载/包含 招募六边形战士队员利用目录穿越反弹SHELL实战测试2.2 提交报文修改检测3.2 文件内容检测绕过完整文件结构 检测 第四章&#xff1a;解析漏洞第一节 常见解析漏洞iis/nginx php fastcgi 取值错误 解析漏洞 &#xff08;配置错误&#xff09;nginx 文件名逻…

加密的手机号如何模糊查询?

1 一次加载到内存 实现这个功能&#xff0c;我们第一个想到的办法可能是&#xff1a;把个人隐私数据一次性加载到内存中缓存起来&#xff0c;然后在内存中先解密&#xff0c;然后在代码中实现模糊搜索的功能。 这样做的好处是&#xff1a;实现起来比较简单&#xff0c;成本非常…

vue3 鲜为人知的知识点

该篇文章是个人觉得在平常开发过程中没怎么注意到&#xff08;新增加&#xff09;的知识点&#xff0c;每个章节的内容在官网中不只文章提到的这些。 &#x1f495; 模板语法 ✔ 动态参数 <script setup> import { ref } from vueconst attributeName ref(msg) const …

Noisy DQN 跑 CartPole-v1

gym 0.26.1 CartPole-v1 NoisyNet DQN NoisyNet 就是把原来Linear里的w/b 换成 mu sigma * epsilon, 这是一种非常简单的方法&#xff0c;但是可以显著提升DQN的表现。 和之前最原始的DQN相比就是改了两个地方&#xff0c;一个是Linear改成了NoisyLinear,另外一个是在agent在t…

关于位运算

只出现一次的数字&#xff1a; 给你一个非空整数数组 nums&#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现一次的元素。 class Solution { public:int singleNumber(vector<int>& nums) {int j0;for(auto i:nums){j^i…

62.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏公告类的C++还原

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;游戏红字公告功能的逆向分析-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;0888e34878d9e7dd0acd08ef…