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.mzph.cn/news/600780.shtml

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

相关文章

用友U8 Cloud smartweb2.RPC.d XXE漏洞复现

0x01 产品简介 用友U8 Cloud 提供企业级云ERP整体解决方案,全面支持多组织业务协同,实现企业互联网资源连接。 U8 Cloud 亦是亚太地区成长型企业最广泛采用的云解决方案。 0x02 漏洞概述 用友U8 Cloud smartweb2.RPC.d接口处存在 XXE漏洞,攻击者可通过该漏洞获取敏感文件…

软件工程:用例图相关知识和多实例分析

目录 一、用例图相关知识 1. 基本介绍 2. 常用符号 二、用例图实例分析 1. 新闻管理系统 2. 医院病房监护系统 3. 实验上机安排系统 4. 远程网络教学系统 一、用例图相关知识 1. 基本介绍 用例图&#xff08;use case diagram&#xff09;是用户与系统交互的最简表示…

L1-084:拯救外星人

你的外星人朋友不认得地球上的加减乘除符号&#xff0c;但是会算阶乘 —— 正整数 N 的阶乘记为 “N!”&#xff0c;是从 1 到 N 的连乘积。所以当他不知道“57”等于多少时&#xff0c;如果你告诉他等于“12!”&#xff0c;他就写出了“479001600”这个答案。 本题就请你写程序…

条款35:考虑virtual函数以外的其它选择

1.前言 假设我们在写一个3D游戏软件&#xff0c;打算为游戏内的人物设计一个继承体系。游戏内容属于暴力砍杀类型&#xff0c;游戏中的角色被伤害或其它因素导致健康状态下降的情况是一个常见属性。因此设计一个成员函数healthValue&#xff0c;它会返回一个整数&#xff0c;表…

2024年天津体育学院专升本专业考试考生入场及考前须知

天津体育学院2024年高职升本科招生专业考试考生考前须知 一、考生入场及考试要求 1.考生于1月6日笔试考试当天&#xff0c;根据考试时间提前30分钟到达天津体育学院新校区东门&#xff0c;凭专业考试准考证、有效身份证原件&#xff0c;经查验合格后方可允许进入学校。 2.笔…

Linux 中 EXPORT_SYMBOL宏详解

Linux 中 EXPORT_SYMBOL宏详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在今天的文章中&#xff0c;我们将深入研究C/C编程中一个关键的宏——EXPORT_SYMBOL&…

PLC分段传送带控制示例

一、为了节约用电&#xff0c;将长长的传送带进行分段&#xff0c;哪断上有物品&#xff0c;哪断才运行 二、每一断末尾都有传感器&#xff0c;传感器能感受到物体有没有到传送带的末尾 三、这个传感器是接近开关 四、控制流程 五、IO地址分配 六、按下启动按钮后&#xff0c;…

问题 C: 活动选择

题目描述 学校在最近几天有n个活动&#xff0c;这些活动都需要使用学校的大礼堂&#xff0c;在同一时间&#xff0c;礼堂只能被一个活动使。由于有些活动时间上有冲突&#xff0c;学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。    现在给出n个活动使用礼堂的起…

Apache网页优化

本章主要介绍如何对Apache网页进行优化 Apache 网页压缩Apache 网页缓存Apache 隐藏版本信息Apache 网页防盗链 目录 1、网页压缩与缓存 1.1、网页压缩 &#xff08;1&#xff09;gzip介绍 &#xff08;2&#xff09;HTTP压缩的过程 &#xff08;3&#xff09;Apache的…

免费的GPT4来了,你还不知道吗?

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

在Linux写自己的第一个程序“hello Linux”

01.nano指令 我们在Windows中有很多的编译环境&#xff0c;大家应该都很熟悉&#xff0c;但是在Linux中&#xff0c;我们怎么写代码呢&#xff1f; 这里&#xff0c;我介绍一个非常简单的指令->nano 这个指令就类似于我们Windows中的记事本&#xff0c;使用方法也很简单 …

网络连接 UDP2,UDP Connect, bind, send, recieve认知, -入门8

LWIP编程接口有RAW, NETCONN, SOCKET 2.UDP函数的理解 #define UDP_SERVER_PORT 8000 //PC side #define UDP_CLIENT_PORT 1234 // ctrl board side //PC IP address #define DEST_IP_ADDR0 192 #define DEST_IP_ADDR1 168 #define DEST_IP_ADDR2 3 #define DEST_IP_ADDR3 11…

SRS服务器RTMP2WebRTC外网拉流配置

将前端服务开放到外网&#xff0c;并且在外网使用WebRTC拉流&#xff0c;要求全部使用同一端口。 外网地址&#xff1a;10.172.59.42&#xff08;域名&#xff1a;test.com&#xff09;外网端口为33333内网SRS服务器地址&#xff1a;192.168.5.177&#xff0c;内网端口为10090…

算法训练day60|单调栈part0

参考&#xff1a;代码随想录 84.柱状图中最大的矩形 要求当前柱形的左右两边第一个比他小的位置 对于高度为5的柱子&#xff08;index为2&#xff09; mid 他的左边第一个比他小的柱子为1&#xff0c;index为1 left 他的右边第一个比他小的柱子高度为2&#xff0c;index为4…

待做事项提醒 项目

GitHub - kesin/taskover: Taskover is a simple planlist tools to manage your task easily. app-version - APP 版本管理系统 源码地址&#xff1a;https://github.com/xtTech/app-version/ 考试答题&#xff1a;https://gitee.com/beautiful-life/exam 追风考试系统 vu…

【sed学习】sed -i和sed -i -e有什么区别

前言&#xff1a; 项目脚本有句sed -i $aPRODUCT_PACKAGES rtk_mdnsd device.mk sed -i -e $a/vendor/bin/ipv4lld u:object_r:ipv4lld_exec:s0 sepolicy/file_contexts不太清楚sed -i和sed -i -e有什么区别&#xff0c;学习一下 sed -i 和 sed -i -e 是用于编辑文件中匹配模式…

GB∕T 33171-2016 城市交通运行状况评价规范

免登陆免积分下载地址 标准号&#xff1a;GB/T 33171-2016 中文标准名称&#xff1a;城市交通运行状况评价规范 英文标准名称&#xff1a;Specification for urban traffic performance evaluation 中国标准分类号&#xff08;CCS&#xff09;R85 国际标准分类号&#xff08;…

提前终止 Lambda forEach 的两种方法

在Java中&#xff0c;Lambda表达式提供了一种简便的方式来对集合进行迭代处理。然而&#xff0c;有时我们可能希望在特定条件下提前终止forEach的执行。这篇博客将介绍两种实现这一目标的方法。 方法一&#xff1a;使用异常 我们可以通过在Lambda表达式中抛出自定义异常的方式…

软件测试|SQL中的null值,该如何理解?

深入理解SQL中的Null值&#xff1a;处理缺失数据的重要概念 简介 Null值在SQL中是用于表示缺失或未知数据的特殊值。本文将深入探讨Null值的概念、处理方法和注意事项&#xff0c;以帮助读者更好地理解和处理SQL中的缺失数据。 在SQL数据库中&#xff0c;Null值是一种特殊的…

gitlab高级功能之Kubernetes Agent介绍

文章目录 1. 前置条件2. 简介3. GitLab Kubernetes Agent 的部署3.1 启用 Agent 服务端3.2 创建 Agent 配置和清单仓库 4. 安装agent4.1 连接k8s集群4.2 在集群中部署4.3 修改资源清淡&#xff0c;调整pod的副本数 5. 思考 1. 前置条件 gitlab 14.5 专业版k8s集群helm客户端工…