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库还提供了丰富的算法函数,让开发者能够快速高效地处理数据和实现各种功能。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【十】【C语言\动态规划】376. 摆动序列、673. 最长递增子序列的个数、646. 最长数对链,三道题目深度解析

动态规划 动态规划就像是解决问题的一种策略&#xff0c;它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题&#xff0c;并将每个小问题的解保存起来。这样&#xff0c;当我们需要解决原始问题的时候&#xff0c;我们就可以直接利…

JS的防抖和节流

目录 防抖 搜索框带来的问题 实现的思路 案例 封装防抖函数 节流 滚动条加载带来的问题 实现的思路 案例 封装节流函数 防抖 搜索框带来的问题 需求&#xff1a;根据输入框内容来请求数据 <!DOCTYPE html> <html lang"en"> <head><…

基于ElementUI封装的下拉树选择可搜索单选多选清空功能

效果&#xff1a; 组件代码 /*** 树形下拉选择组件&#xff0c;下拉框展示树形结构&#xff0c;提供选择某节点功能&#xff0c;方便其他模块调用* author wy* date 2024-01-03 * 调用示例&#xff1a;* <tree-select * :height"400" // 下拉框中树形高度* …

mysql原理--事务

1.事务的起源 对于大部分程序员来说&#xff0c;他们的任务就是把现实世界的业务场景映射到数据库世界。比如银行为了存储人们的账户信息会建立一个 account 表&#xff1a; CREATE TABLE account (id INT NOT NULL AUTO_INCREMENT COMMENT 自增id,name VARCHAR(100) COMMENT …

JVM之内存模型、运行时的数据区域的划分、java的程序计数器作用等

JVM JVM内存模型运行时数据区域划分程序计数器&#xff08;Program Counter Register&#xff09; JVM内存模型 ​ 对于Java程序来说&#xff0c;在虚拟机自动内存管理机制下&#xff0c;不再需要像C/C程序开发程序员这样每一个new操作去写对应的delete/free操作&#xff0c;不…

大语言模型LLM微调技术:Prompt Tuning

1 预训练语言模型概述 1.1 预训练语言模型的发展历程 截止23年3月底&#xff0c;语言模型发展走过了三个阶段&#xff1a; 第一阶段 &#xff1a;设计一系列的自监督训练目标&#xff08;MLM、NSP等&#xff09;&#xff0c;设计新颖的模型架构&#xff08;Transformer&#…

在 docker 容器中配置双网卡,解决通讯的问题

目录 1. 查看当前网络信息 2. 创建自定义网络桥 3. 创建双网卡模式 4. 删除默认网卡 已经创建好了的 Docker 容器&#xff0c;要修改它的IP比较麻烦&#xff0c;网上找了几种不同的方法&#xff0c;经过试验都没有成功&#xff0c;下面通过配置双网上来解决 IP 的问题。…

vue3.x 的生命周期和钩子函数

什么是生命周期 Vue 是组件化编程&#xff0c;从一个组件诞生到消亡&#xff0c;会经历很多过程&#xff0c;这些过程就叫做生命周期。 你理解了什么是生命周期&#xff0c;你还了解一个概念“钩子函数”。 钩子函数&#xff1a; 伴随着生命周期&#xff0c;给用户使用的函数&…

TypeScript接口、对象

目录 1、TypeScript 接口 1.1、实例 1.2、联合类型和接口 1.3、接口和数组 1.4、接口和继承 1.5、单继承实例 1.6、多继承实例 2、TypeScript 对象 2.2、对象实例 2.3、TypeScript类型模板 2.4、鸭子类型&#xff08;Duck typing&#xff09; 1、TypeScript 接口 接口…

21.串的处理

题目 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);String str sc.nextLine();char[] c str.toCharArray();int n c.length;StringBuilder st new StringBuilder();int i 0;while(i<n)…

element-ui组件DatePicker日期选择器移动端兼容

element-ui组件DatePicker日期选择器移动端兼容 css /** 移动端展示 **/ media screen and (max-width: 500px) {.el-picker-panel__sidebar {width: 100%;}.el-picker-panel {width: 400px!important;}.el-picker-panel__content {width: 100%;}.el-picker-panel__body{marg…

git打tag以及拉取tag

场景&#xff1a;某次git代码发布后定版记录&#xff0c;将发版所在的commit时候代码打上tag记录&#xff0c;方便后期切换到对应tag代码位置。 查看所有tag名 git tag// 1.1.0 // 1.0.0查看tag和描述 git tag -l -n//1.0.0 云监管一期项目完结 //1.1.0 …

[Flutter]WebPlatform上运行遇到的问题总结

[Flutter]WebPlatform上运行遇到的问题总结 目录 [Flutter]WebPlatform上运行遇到的问题总结 写在开头 正文 Q1、file_version_info.dart Q2、不兼容判断 Q3、跨域问题 Q4、flutter clean &#xff0c;无法删除build文件夹 其他 写在结尾 写在开头 Flutter项目已能在…

初中数学:几何题的相关解题原则总结

一、多问类型的几何题 我们做题&#xff0c;应该都遇到过这类几何题目&#xff0c;就是&#xff0c;三个小问&#xff0c;每个小问对应一个几何图像&#xff0c;而且&#xff0c;渐渐复杂。这种题目&#xff0c;大多数有一个变化的条件&#xff0c;比如&#xff0c;动点、角度…

C语言的前置声明

前置声明主要用于类与类之间的循环引用&#xff0c;且只是针对类指针或者引用有效&#xff0c;对完整的类字段无效。如下代码所示&#xff1a; #include <iostream> using namespace std;class B; class C;class A { public:B *b;C c; ///< 错误写法C* c1; ///< 正…

mongodb基本命令操作

1.创建数据库 语法 use 数据库名字例如:创建hero数据库 use hero查询当前数据库 db如果想查询所有的数据库 show dbs发现并没有刚刚创建的数据库,如果要显示创建的数据库,需要向表中插入一条记录 db.hero.insert({name: "zs",age: 20,country: "china&quo…

【论文精读】A Survey on Large Language Model based Autonomous Agents

A Survey on Large Language Model based Autonomous Agents 前言Abstract1 Introduction2 LLM-based Autonomous Agent Construction2.1 Agent Architecture Design2.1.1 Profiling Module2.1.2 Memory ModuleMemory StructuresMemory FormatsMemory Operations 2.1.3 Plannin…

easyrecovery16 (硬盘数据恢复软件)免费版

EasyRecovery是由球著名数据厂商Kroll Ontrack出品的一款便捷实用&#xff0c;功能强大的硬盘数据恢复软件。它能够全面恢复删除丢失数据&#xff0c;支持包括文档、表格、图片、音视频等各种文件类型。支持恢复不同存储介质数据&#xff1a;硬盘、光盘、U盘/移动硬盘、数码相机…

Docker、Docker-compose安装

安装Docker 1.卸载旧版 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine2.配置Docker的yum库 首先…

微服务实战系列之API加密

前言 随着一阵阵凛冽寒风的呼啸&#xff0c;新的年轮不知不觉滚滚而来。故事随着2023的远去&#xff0c;尘封于案底&#xff1b;希望迎着新年&#xff0c;绽放于枝头。在2024新岁启航&#xff0c;扬帆破浪之时&#xff0c;让烦恼抛洒于九霄&#xff0c;让生机蓬勃于朝朝暮暮。 …