初识STL

举报
灵彧 发表于 2022/05/08 14:28:03 2022/05/08
【摘要】 初识STL

初识STL

STL简介:

STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。是一套功能强大的 C++ 模板类,提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

C++标准模板库的核心包括容器 (Containers)、算法(Algorithms)、迭代器(iterators)三个组件,其中1.容器是用来管理某一类对象的集合,C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等;2.算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作;3.迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。这三个组件都带有丰富的预定义函数,帮助我们通过简单的方式处理复杂的任务。

STL的特点:

STL的一个重要特点是数据结构和算法的分离:

​ 尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;

STL另一个重要特点是它不是面向对象的:

​ 为了具有足够通用性,STL主要依赖于模板而不是封装,继承和多态性——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;

STL组件:

STL 组件主要包括容器,迭代器、算法和仿函数

容器

容器即用来存储并管理某类对象的集合。

​ 例如鱼缸是用来盛放金鱼的容器。每一种容器都有其优点和缺点。为满足程序的各种需求,STL 准备了多种容器类型,容器可以是 arrays 或是 linked lists,或者每个元素有特别的键值。

迭代器

迭代器用于在一个对象群集的元素上进行遍历动作。对象群集可能是容器,也可能是容器的一部分。

​ 迭代器的主要用途是为容器提供一组很小的公共接口。利用这个接口,某项操作可以行进至群集内的下一个元素。每种容器都提供了各自的迭代器。迭代器了解该容器的内部结构,所以能够正确行进。迭代器的接口和一般指针类似。

算法

用来处理群集内的元素,可以出于不同目的搜寻、排序、修改、使用那些元素。

​ 所有容器的迭代器都提供一致的接口,通过迭代器的协助,算法程序可以用于任意容器。

STL 的一个特性是将数据和操作分离。数据由容器类别加以管理,操作则由可定制的算法定义。迭代器在两者之间充当“粘合剂”,以使算法可以和容器交互运作。

STL 的另一个特性即组件可以针对任意型别运作。“标准模板库”这一名称即表示“可接受任意型别”的模板,并且这些型别均可执行必要操作。

在 STL 中,容器又分为序列式容器关联式容器两大类,而迭代器的功能主要是遍历容器内全部或部分元素的对象。迭代器可划分为 5 种类属,这 5 种类属归属两种类型:双向迭代器和随机存取迭代器。

SIL 中提供的算法包括搜寻、排序、复制、重新排序、修改、数值运算等。

仿函数

STL中大量运用了仿函数。仿函数具有泛型编程强大的威力,是纯粹抽象概念的例证。

STL之容器与算法:

容器

​ STL 包含诸多容器类。容器类是可以包含其他对象的类,就像数组和队列堆栈等数据结构包含整数、小数、类等数据成员一样。STL 可以包含常见的向量类、链表类、双向队列类、集合类、图类等,每个类都是一种模板,这些模板可以包含各种类型的对象。

下述代码是常用的 vector 赋值方法:

vector <int> l;
for (int i =0;i <100;i++ )
l.push_back (i);

下述代码采用 map 容器进行二维元素的管理:

map <string, string, less <string>> cap; //按从小到大排序
cap ["Ark"] ="Little Rock";
cap ["New"] ="Albany";

map 类似于二维数组,但比二维数组灵活得多。

目前,STL 中已经提供的容器主要如下:

  • vector <T>:一种向量。
  • list <T>:一个双向链表容器,完成了标准 C++ 数据结构中链表的所有功能。
  • queue <T>:一种队列容器,完成了标准 C++ 数据结构中队列的所有功能。
  • stack <T>:一种栈容器,完成了标准 C++ 数据结构中栈的所有功能。
  • deque <T>:双端队列容器,完成了标准 C++ 数据结构中栈的所有功能。
  • priority_queue <T>:一种按值排序的队列容器。
  • set <T>:一种集合容器。
  • multiset <T>:一种允许出现重复元素的集合容器。
  • map <key, val>:一种关联数组容器。
  • multimap <key, val>:一种允许出现重复 key 值的关联数组容器。

以上容器设计高效,还提供了接口。程序员可以在任何适当的地方使用它们。

容器可以分为序列式容器关联式容器两大类。序列式容器主要有 vector、list 和 deque;关联式容器包括 set、map、multiset 和 multimap 等容器模板类。

算法

STL 提供了非常多的数据结构算法。这些算法在命名空间 std 的范围内定义,通过包含头文件 <algorithm> 来获得使用权。

常见的部分算法如下:

  • for_each();
  • find();
  • find_if();
  • count();
  • count_if();
  • replace();
  • replace_if();
  • copy();
  • unique_copy();
  • sort();
  • equal_range();
  • merge();

STL 中的所有算法都是基于模板实现的。

由于是出于好奇,私自在网上浏览查阅所得,没有进行过系统,全面的学习,若有不正确和不足的地方还请指教哦ψ(`∇´)ψ( ̄︶ ̄)↗
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。