58.C++ STL标准模板库 STL概述 STL三大组件

这篇具有很好参考价值的文章主要介绍了58.C++ STL标准模板库 STL概述 STL三大组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、初识STL

1.1 STL概述

        长久以来,软件界⼀直希望建⽴⼀种可重复利⽤的东⻄,以及⼀种得以制造出”可重复运⽤的东⻄”的⽅法,让程序员的⼼⾎不⽌于随时间的迁移,⼈事异动⽽烟消云散,从函(functions),类别(classes),函数库(functionlibraries),类别库(class libraries)、各种组件,从模块化设计,到⾯向对象(object oriented ),为的就是复⽤性的提升。
        复⽤性必须建⽴在某种标准之上。但是在许多环境下,就连软件开发最基本的数据结构(data structures) 和算法(algorithm)都未能有⼀套标准。⼤量程序员被迫从事⼤量复的⼯作,竟然是为了完成前⼈已经完成⽽⾃⼰⼿上并未拥有的程序代码,这不仅是⼈⼒资源的浪费,也是挫折与痛苦的来源。
        为了建⽴数据结构和算法的⼀套标准,并且降低他们之间的耦合关系,以提升各⾃的独⽴性、弹性、交互操作性(相互合作性,interoperability),诞⽣了STL。

1.2 STL的基本概念 

        STL(Standard Template Library)是C++标准库中的一个重要部分,它提供了一组通用的模板类和函数,用于实现常见的数据结构和算法。STL旨在提供高效、可重用、通用的编程工具,以简化C++程序的开发。

1.3 STL六⼤组件简介 

        STL被分为六大组件,分别是:容器、算法、迭代器、仿函数、适配器(配接器)、空间配置器 ,每个组件解决了特定的编程问题。以下是这六个组件的简介:

  1. 容器(Containers): 容器是用于存储和组织数据的数据结构。STL提供了多种容器,包括向量(vector)、链表(list)、双向链表(deque)、映射(map)、集合(set)等。容器的不同特点适用于不同的问题,例如,向量适合随机访问,链表适合插入和删除操作。

  2. 算法(Algorithms): 算法是应用于容器的操作集合。STL提供了一系列通用的算法,如排序、查找、交换、合并等。这些算法适用于不同类型的容器,从而实现代码的重用。

  3. 迭代器(Iterators): 迭代器用于遍历容器中的元素。它提供了类似指针的操作,允许访问容器中的元素。迭代器分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,根据容器的特点选择不同的迭代器。

  4. 函数对象(Function Objects): 函数对象是可调用对象,可以像函数一样被调用。STL中的很多算法使用函数对象进行操作,如比较、排序、转换等。STL提供了多个函数对象类,也可以自定义函数对象。

  5. 配接器(Adapters): 配接器用于将容器或函数对象适配为不同类型的接口。STL提供了两种常见的配接器:堆栈(stack)和队列(queue)。

  6. 空间配置器 (Allocators): 空间配置器用于管理内存的分配和释放。STL提供了默认分配器,还可以自定义分配器以满足特定的内存管理需求。

1.4STL的优点 

STL 是 C++的⼀部分,因此不⽤额外安装什么,它被内建在你的编译器之内。
         STL 的⼀个重要特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作。程序员可以不⽤思考 STL 具体的实现过程,只要能够熟练使⽤STL 就 OK 了。这样他们就可以把精⼒放在程序开发的别的⽅⾯。
STL 具有⾼可重⽤性,⾼性能,⾼移植性,跨平台的优点。
⾼可重⽤性:STL 中⼏乎所有的代码都采⽤了模板类和模版函数的⽅式实现,这相⽐于传统的由函数和类组成的库来说提供了更好的代码重⽤机会。
⾼性能:如 map 可以⾼效地从⼗万条记录⾥⾯查找出指定的记录,因为 map 是采⽤红⿊树的变体实现的。
⾼移植性:如在项⽬ A 上⽤ STL 编写的模块,可以直接移植到项⽬ B 上。

二、STL三大组件 

2.1容器

在C++的STL(Standard Template Library)中,容器(Containers)是用于存储和组织数据的数据结构。STL提供了多种不同类型的容器,每种容器都有不同的特点和用途。以下是STL中常见的容器:

  1. 向量(vector): 动态数组,支持快速的随机访问和尾部插入。在插入和删除元素时,效率较低。

  2. 链表(list): 双向链表,支持在任意位置高效地插入和删除元素,但不支持随机访问。

  3. 双向队列(deque): 双端队列,既可以在头部高效地插入和删除,也可以在尾部高效地插入和删除。

  4. 栈(stack): 后进先出(LIFO)的数据结构,支持在栈顶插入和删除元素。

  5. 队列(queue): 先进先出(FIFO)的数据结构,支持在队尾插入,在队头删除元素。

  6. 优先队列(priority_queue): 基于堆的数据结构,能够快速访问最大或最小元素。

  7. 映射(map): 关联数组,存储键-值对,支持通过键快速查找和插入元素。

  8. 集合(set): 存储唯一值的有序集合,支持高效地插入、删除和查找操作。

  9. 无序映射(unordered_map): 基于哈希表的关联数组,能够快速访问键-值对。

  10. 无序集合(unordered_set): 基于哈希表的唯一值集合,支持高效的插入、删除和查找操作。

2.2算法 

在C++的STL(Standard Template Library)中,算法(Algorithms)是一组通用的函数,用于操作容器中的元素。STL提供了许多已经实现和优化的算法,可以用于不同类型的容器,从而实现代码的重用。这些算法可以大大简化编程任务,如排序、查找、合并等。以下是STL中常见的一些算法:

  1. 排序算法:

    • sort():对容器中的元素进行排序。
    • stable_sort():稳定排序,保留相等元素的相对顺序。
  2. 查找算法:

    • find():在容器中查找指定元素。
    • binary_search():二分查找,用于有序容器。
  3. 合并和拷贝算法:

    • merge():合并两个有序容器。
    • copy():将一个容器的元素拷贝到另一个容器。
  4. 删除和替换算法:

    • remove():从容器中移除指定值的元素。
    • replace():将容器中的元素替换为指定值。
  5. 遍历和操作算法:

    • for_each():遍历容器中的每个元素,执行指定操作。
    • transform():对容器中的元素进行转换操作。
  6. 计数和累积算法:

    • count():计算容器中指定值的数量。
    • accumulate():累积容器中的元素。
  7. 最大和最小算法:

    • max_element():找到容器中的最大元素。
    • min_element():找到容器中的最小元素。
  8. 洗牌和随机算法:

    • shuffle():对容器中的元素进行随机洗牌。
    • random_shuffle():使用随机数引擎进行洗牌。

2.3迭代器 

在C++的STL(Standard Template Library)中,迭代器(Iterators)是一种用于遍历容器中元素的抽象概念。迭代器提供了一种统一的方式来访问容器中的元素,而不需要关心容器的具体实现。STL中的算法使用迭代器来访问和操作容器中的元素,这样可以使算法与容器的实际类型解耦,提高了代码的可重用性和灵活性。

迭代器可以被视为一种类似于指针的对象,它可以指向容器中的某个元素,并允许对元素进行读取、写入和操作。根据容器的性质,迭代器可以分为不同的类型,包括以下几种:

  1. 输入迭代器(Input Iterator): 支持从容器中读取数据,但只能遍历一次,不能修改容器中的数据。例如:vectorlist

  2. 输出迭代器(Output Iterator): 支持向容器中写入数据,但也只能遍历一次。例如:ostream_iterator

  3. 前向迭代器(Forward Iterator): 支持从容器中读取数据,可以多次遍历,但不能反向遍历。例如:forward_list

  4. 双向迭代器(Bidirectional Iterator): 支持从容器中读取和写入数据,可以正向和反向遍历,但效率可能较低。例如:list

  5. 随机访问迭代器(Random Access Iterator): 具备前面所有类型的特性,同时还支持随机访问,即可以像指针一样进行加减操作。例如:vector

58.C++ STL标准模板库 STL概述 STL三大组件,C++,c++,开发语言

#include <iostream>
#include <vector>
using namespace std;

int main() {
    vector<int> nums = {1, 2, 3, 4, 5};

    // 使用迭代器遍历向量并打印元素
    for (vector<int>::iterator it = nums.begin(); it != nums.end(); ++it) {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

 文章来源地址https://www.toymoban.com/news/detail-658967.html

到了这里,关于58.C++ STL标准模板库 STL概述 STL三大组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 17 标准模板库STL之list

    基础知识         1、list是由双向链表实现的,这也意味着,其内存空间是不连续的。因此,list不支持随机访问,没有提供[]操作符重载和at()函数,迭代器只能进行++和--操作,不能进行+n和-n操作。由于底层使用链表实现,list在任意位置插入和移除元素都非常高效。list适

    2023年04月26日
    浏览(70)
  • 24 标准模板库STL之算法1

    概述         算法是STL中用来处理容器中数据的一系列模板函数,可以对数据集合进行查找、排序、拷贝等操作。通过使用迭代器,算法可以运用在任意容器之上,做到与操作的数据的类型和结构无关。         STL算法博大精深,涵盖范围非常之广,一共提供了大约

    2024年02月05日
    浏览(37)
  • 25 标准模板库STL之算法2

    搜索算法         常用的搜索算法可参看下表。 函数名 算法描述 search 搜索迭代器区间中与另一个迭代器区间所有元素匹配的第一次的位置 search_n 搜索迭代器区间中与若干个相同元素匹配的第一次的位置 binary_search 以二分法在有序序列中查找指定值,找到返回true,否则

    2024年02月06日
    浏览(34)
  • 21 标准模板库STL之string

    概述         从严格意义上来说,string并不是STL中的容器,但它与容器有很多类似的接口和操作。string是STL中的一个类,对char *或char[]类型的字符串进行了封装。使用string后,不需要再考虑内存是否足够、内存是否未释放、内存越界等问题。除此之外,string还提供了一系

    2024年02月04日
    浏览(54)
  • 18 标准模板库STL之deque

    基础知识         1、deque是一个双端数组容器,可以同时在头部和尾部添加、移除元素。deque与vector类似,也支持随机访问,但vector是一整段的连续内存空间,而deque是一段一段的连续内存空间。每一段连续内存空间称为一个deque块,所有deque块由一个map进行管理。     

    2023年04月22日
    浏览(40)
  • 23 标准模板库STL之迭代器

    概述         迭代器作为STL中的三大组件之一,是容器和算法的粘合剂。迭代器提供了访问容器中元素的方法,每一种容器都提供了自己的迭代器,而这些迭代器向外界隐藏了容器的内部结构。算法使用迭代器访问容器中的元素,不需要关心容器的内部结构。        

    2024年02月05日
    浏览(37)
  • 标准模板库STL——deque和list

    deque概述 deque属于 顺序容器 ,称为双端队列容器 底层数据结构是动态二维数组,从整体上看,deque的内存不连续 初始数组第一维数量为2,必要时进行2倍扩容 每次第一维扩容后,原来数组第二维元素从新数组下标为OldSize/2的第一维开始存储 这样的存储方式使得前后都预留相

    2024年02月12日
    浏览(48)
  • C++ STL 标准模板库介绍与入门

    目录 1、概述 1.1、C++ 标准库 1.2、Boost库 2、STL 版本 2.1、HP 原始版本

    2024年02月05日
    浏览(63)
  • 一天学完C++的标准模板库STL

    提到字符串,我们会想起C语言中的 char * ,这是一个指针。而在STL中 string 也是用来声明字符串的,但是 string 是一个类,需要导入库 #includestring 。 String 封装了 char * ,管理这个字符串,是一个 char* 型的 容器 。 string 本质上是一个动态的 char 数组。 使用String字符串的第一步

    2023年04月17日
    浏览(49)
  • 22 标准模板库STL之容器适配器

    概述         提到适配器,我们的第一印象是想到设计模式中的适配器模式:将一个类的接口转化为另一个类的接口,使原本不兼容而不能合作的两个类,可以一起工作。STL中的容器适配器与此类似,是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一

    2024年02月05日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包