C++之STL库简介

news2024/9/22 1:30:40

 

目录

一、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.coloradmin.cn/o/1361180.html

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

相关文章

怎么做表单二维码来获取用户数据?扫码填表的制作方法

​怎么用二维码来收集其他人的信息&#xff0c;比如用户反馈、信息采集、问卷调查等等&#xff0c;都是现在表单二维码的常见应用方式。那么如果我们想制作一个表单二维码用来采集其他人员的反馈信息&#xff0c;用二维码生成器来制作的步骤有哪些呢&#xff1f;下面来教大家在…

Redis高级特性和应用(慢查询、Pipeline、事务、Lua)

Redis的慢查询 许多存储系统(例如 MySQL)提供慢查询日志帮助开发和运维人员定位系统存在的慢操作。所谓慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过预设阀值,就将这条命令的相关信息(例如:发生时间,耗时,命令的详细信息)记录下来,Redis也提供了类似…

高压放大器输出接法及其注意事项

高压放大器应用场景非常广泛&#xff0c;非常适用于半导体高压驱动、TFT产业高压驱动、各种高压工程等应用&#xff1b;也很适用当作音频信号产生器或函数波形产生器的波形放大使用。使用场景广泛&#xff0c;放大器的输出接法也多种&#xff0c;对于不同的放大器也有对应的输出…

Linux vi/vim 教程

文章目录 【 1. vi/vim 的三种模式 】1.1 命令模式1.2 输入模式1.3 底线命令模式 【 2. 实例 】【 3. vim 的其他命令 】 所有的 Unix Like 系统都会内建 vi 文本编辑器&#xff0c;其他的文本编辑器则不一定会存在。目前我们使用比较多的是 vim 编辑器。vim 从 vi 发展出来&am…

Leetcode 剑指 Offer II 060. 前 K 个高频元素

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 给定一个整数数组 nums 和一个整数 k &#xff0c;请返回其中出现…

【Java集合篇】接上篇博文--为什么在JDK8中HashMap要转成红黑树

为什么在JDK8中HashMap要转成红黑树 ✔️为什么不继续使用链表✔️为什么是红黑树✔️红黑树的性能优势 ✔️ 拓展知识仓✔️为什么是链表长度达到8的时候转✔️为什么不在冲突的时候立刻转✔️关于为什么长度为8的时候转(源码注释解读)✔️为什么长度为6的时候转回来?✔️双向…

使用jmeter从0开始完成性能测试

使用JMeter从0开始完成性能测试 介绍 在软件开发过程中&#xff0c;性能测试是一项关键任务&#xff0c;它可以帮助我们评估系统在不同负载条件下的性能表现&#xff0c;发现潜在的性能瓶颈。JMeter是一款功能强大且易于使用的性能测试工具&#xff0c;它可以帮助我们完成各种…

iec104和iec61850

iec104和iec61850 IEC104 规约详细解读(一) 协议结构 IEC104 规约详细解读(二)交互流程以及协议解析 61850开发知识总结与分享【1】 Get the necesarry projects next to each other in the same directory; $ git clone https://github.com/robidev/iec61850_open_server.g…

NGUI基础-Widget

目录 Widget是什么 Widget组件包含的属性 Pivot Depth Size snap Aspect Free Based on Width Based on Height Widget是什么 在Unity UI系统中&#xff0c;"Widget"是指UI元素的基类&#xff0c;它为UI元素提供了位置、大小和锚点等基本属性。通过使用&qu…

VINS-MONO拓展2----更快地makeHessian矩阵

1. 目标 完成大作业T2 作业提示&#xff1a; 多线程方法主要包括以下几种(参考博客)&#xff1a; MPI(多主机多线程开发),OpenMP(为单主机多线程开发而设计)SSE(主要增强CPU浮点运算的能力)CUDAStream processing, 之前已经了解过std::thread和pthread&#xff0c;拓展1…

冠军团队!第二届百度搜索创新大赛AI方案

Datawhale干货 作者&#xff1a;李柯辰&#xff0c;Datawhale成员 写在前面 大家好&#xff0c;我们是2023年第二届百度搜索创新大赛 赛道三——AI应用设计赛道的冠军团队——“肝到凌晨”&#xff0c;很高兴能与大家分享我们这次比赛的经验&#xff0c;同时也希望以后有机会可…

【机器学习:欧氏距离 】机器学习中欧氏距离的理解和应用

【机器学习&#xff1a;欧氏距离 】机器学习中欧氏距离的理解和应用 距离公式二维更高的维度点以外的物体属性欧几里得距离的平方概括历史 在数学中&#xff0c;欧氏距离’是指欧氏空间中任意两点之间的直线距离。这种距离可以通过应用勾股定理来计算&#xff0c;利用两点的笛卡…

【userfaultfd 条件竞争】starCTF2019 - hackme

前言 呜呜呜&#xff0c;这题不难&#xff0c;但是差不多一个多月没碰我的女朋友 kernel pwn 了&#xff0c;对我的 root 宝宝也是非常想念&#xff0c;可惜这题没有找到我的 root 宝宝&#xff0c;就偷了她的 flag。 哎有点生疏了&#xff0c;这题没看出来堆溢出&#xff0c…

【漏洞复现】ActiveMQ反序列化漏洞(CVE-2015-5254)

Nx01 产品简介 Apache ActiveMQ是Apache软件基金会所研发的开放源代码消息中间件。ActiveMQ是消息队列服务&#xff0c;是面向消息中间件&#xff08;MOM&#xff09;的最终实现&#xff0c;它为企业消息传递提供高可用、出色性能、可扩展、稳定和安全保障。 Nx02 漏洞描述 Re…

漫谈大模型的[幻觉]问题

# 如何解决大模型的幻觉问题&#xff1f;# &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;漫谈LLMs带来的AIGC浪潮​​​​​​​ &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质…

C#中的值和引用笔记

文章目录 1. 简单介绍2. 如何判断值类型和引用类型3. 语句块4. 变量的生命周期5. 结构体中的值和引用6. 数组中的存储规则7. 结构体继承接口 1. 简单介绍 2. 如何判断值类型和引用类型 在代码中直接转到内部F12 如string类型 值类型int 3. 语句块 4. 变量的生命周期 5. 结构…

CMake入门教程全导航

&#x1f608;「CSDN主页」&#xff1a;传送门 &#x1f608;「Bilibil首页」&#xff1a;传送门 &#x1f608;「动动你的小手」&#xff1a;点赞&#x1f44d;收藏⭐️评论&#x1f4dd; 文章目录 1.CMake简介2.编程小鱼酱的课程导览2.1拥有这个专栏&#xff0c;您将获得什么…

Linux部署Yearning并结合内网穿透工具实现公网访问本地web管理界面

文章目录 前言1. Linux 部署Yearning2. 本地访问Yearning3. Linux 安装cpolar4. 配置Yearning公网访问地址5. 公网远程访问Yearning管理界面6. 固定Yearning公网地址 前言 Yearning 简单, 高效的MYSQL 审计平台 一款MYSQL SQL语句/查询审计工具&#xff0c;为DBA与开发人员使用…

20 太空漫游

效果演示 实现了一个太空漫游的动画效果&#xff0c;其中包括火箭、星星和月亮。当鼠标悬停在卡片上时&#xff0c;太阳和星星会变成黄色&#xff0c;火箭会变成飞机&#xff0c;月亮会变成小型的月亮。整个效果非常炫酷&#xff0c;可以让人想起科幻电影中的太空漫游。 Code &…

[JavaWeb玩耍日记] 数据库

mysql版本&#xff1a;5.7.24 使用Navicat for MySQL辅助学习(2015年版)&#xff0c;这个在粘贴本博客的块引用内容时会有额外的不可见内容导致sql运行出问题&#xff0c;不过有影响的地方笔者已排除 目录 一.数据库创建 二.使用数据库与创建表 三.表内列的数据类型 四.修…