栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++STL

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++STL

C++ STL(标准模板库)是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++ 标准模板库的核心包括以下三个组件:

组件描述
容器(Containers)容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms)算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators)迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。
函数对象如果一个类将 () 运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象(又称仿函数)。
适配器可以使一个类的接口(模板的参数)适配成用户指定的形式,从而让原本不能在一起工作的两个类工作在一起。值得一提的是,容器、迭代器和函数都有适配器。
内存分配器为容器类模板提供自定义的内存申请和释放功能,由于往往只有高级用户才有改变内存分配策略的需求,因此内存分配器对于一般用户来说,并不常用。

C++ STL头文件
,,,,,,,,, , ,,

使用 STL 编程有哪些优势

以 C++ 定义数组的操作为例,在 C++ 中如果定义一个数组,可以采用如下方式:

int a[n];

这种定义数组的方法需要事先确定好数组的长度,即 n 必须为常量,这意味着,如果在实际应用中无法确定数组长度,则一般会将数组长度设为可能的最大值,但这极有可能导致存储空间的浪费。

所以除此之外,还可以采用在堆空间中动态申请内存的方法,此时长度可以是变量:

int *p = new int[n];

这种定义方式可根据变量 n 动态申请内存,不会出现存储空间浪费的问题。但是,如果程序执行过程中出现空间不足的情况时,则需要加大存储空间,此时需要进行如下操作:

  1. 新申请一个较大的内存空间,即执行int * temp = new int[m];
  2. 将原内存空间的数据全部复制到新申请的内存空间中,即执行memecpy(temp, p, sizeof(int)*n);
  3. 将原来的堆空间释放,即执行delete [] p; p = temp;

而完成相同的操作,如果采用 STL 标准库,则会简单很多,因为大多数操作细节将不需要程序员关心。下面是使用向量模板类 vector 实现以上功能的示例:

vector  a; //定义 a 数组,当前数组长度为 0,但和普通数组不同的是,此数组 a 可以根据存储数据的数量自动变长。
//向数组 a 中添加 10 个元素
for (int i = 0; i < 10 ; i++)
    a.push_back(i)
//还可以手动调整数组 a 的大小
a.resize(100);
a[90] = 100;
//还可以直接删除数组 a 中所有的元素,此时 a 的长度变为 0
a.clear();
//重新调整 a 的大小为 20,并存储 20 个 -1 元素。
a.resize(20, -1)

使用 STL 可以更加方便灵活地处理数据。

算法

算法(algorithm)是应用在容器上以各种方法处理其内容的行为和功能。例如:有对容器内容排序、复制、检索、合并等算法。在STL中,算法是由模板函数表现的。这些函数不是容器类的成员函数,相反它们是独立的函数。令人吃惊的特点之一就是其算法是如此的通用,不仅可以将其用于STL容器,而且可以用于普通的C++数组或任何其他应用程序指定的容器。

STL提供了大约100个实现算法的模版函数,比如算法for_each将为指定序列中的每一个元素调用指定的函数,stable_sort以你所指定的规则对序列进行稳定性排序等等。

算法部分主要由头文件,和组成。

  • :是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模板函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等;
  • :体积很小,只包括几个在序列上面进行简单数学运算的模版函数,包括加法和乘法在序列上的一些操作;
  • :其中定义了一些模板类,用以声明函数对象。
容器

容器是数据在内存中的组织的方法,例如:数组、堆栈、队列、链表、二叉树等(这些都不是STL标准容器)。STL中的容器是一种存储T(Template)类型值的有限集合的数据结构,容器的内部实现一般是类。这些值可以是对象本身,如果数据类型T代表的是class的化。
容器部分主要由头文件,,,,,和组成。

  • 向量(vector):连续存储的元素;
  • 列表(list):由节点组成的双向列表,每个节点包含着一个元素;
  • 双队列(deque):连续存储的指向不同元素的指针所组成的数组;
  • 集合(set):由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序;
  • 多重集合(multiset):允许存在两个次序相等的元素的集合;
  • 栈(stack):后进先出的值的排列;
  • 队列(queue):先进先出的值的排列;
  • 优先队列(priority_queue):元素的次序是由作用于所存储的值对上的某种谓词决定的一种队列;
  • 映射(map):由{键,值}对组成的集合,以某种作用于键对上的谓词排列;
  • 多重映射(multimap):允许键对有相等的次序的映射。
STL序列容器

STL序列容器
STL关联式容器–map

迭代器

迭代器在STL中用来将算法和容器联系起来,起着一种黏和剂的作用。几乎STL提供的所有算法都是通过迭代器存取元素序列进行工作的,每一个容器都定义了其本身所专有的迭代器,用以存取容器中的元素。

迭代器部分主要由头文件,和组成。

  • :是一个很小的头文件,它包括了贯穿使用在STL中的几个模版的声明;
  • :提供了迭代器使用的许多方法
  • :它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制;中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/917176.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号