STL(一)---概述

STL(Standard Template Library)里有很多组成部分,但是主要有三个,容器迭代器算法

容器用来管理某个特定对象的集合。每一种容器都有自己的优点和缺点,在项目中根据不同的需求,使用不同的容器。容器可以是数组、链表或者类字典。
迭代器用于遍历对象集合的元素。这些集合可以是容器或容器的子集。每一个容器类都提供了它自己的迭代器类型。
算法用来处理的元素的集合。例如,可以进行搜索、排序等操作。

STL的数据和操作是分离的。数据存储在容器里,使用算法进行操作。迭代器是这两者之间的粘合剂,让算法与容器可以进行交互。
在这里插入图片描述
某种程度上,STL的概念与面向对象编程的原则相背,
STL数据和算法是分离的而不是结合。STL是泛型编程的一个很好的例子。容器和算法分别是任意类型和类的泛型。STL提供了更通用的组件。还可以通过使用适配器和仿函数来达到特殊要求。

容器
容器管理着一系列元素,为了满足不同的需求,STL提供了多种类型的容器,见下图。
在这里插入图片描述
主要可以分为三大类
序列容器是有序集合,其中的每个元素都有特定位置。这个位置取决于插入的时间和地点,但是它跟元素的值无关。STL包含5个预定义的序列容器类:array、vector、deque、list和forward_list。
关联容器是把元素的值按照某种规则排好顺序的集合。STL包含4个预定义的关联容器类:set、multiset、map和multimap。
无序(关联)容器是无序集合。主要关注一个元素是否在集合中。不论是插入的顺序还是插入元素的值对元素的位置都没有任何影响。STL包含4个预定义的无序容器类:unordered_set、unordered_multiset、unordered_map和unordered_multimap。

序列容器通常是数组或链表的实现
关联容器通常是二叉树的实现
无序容器通常是哈希表的实现

容器适配器
容器适配器提供顺序容器的特殊接口

stack 堆栈适配器(LIFO)
queue 改写容器来提供队列(FIFO数据结构)
priority_queue 改写容器来提供优先级队列

迭代器
根据迭代器所支持的操作,一般分为下面5种。
前向迭代器只能利用递增运算符进行前向迭代。像unordered_set、unordered_multiset、unordered_map和unordered_multimap这些容器都“至少”是用前向迭代器(某些情况下可以提供双向迭代器)。
双向迭代器是可以用递增运算符向前迭代,或者用递减运算符向后迭代。像list、set、multiset、map和multimap的迭代器都是双向迭代器。
随机访问迭代器具有双向迭代器的所有属性。此外,他们还可以进行随机访问。这种迭代器本身支持运算操作,可以改变偏移量,也可以利用关系运算符(< 和 >)比较迭代器。像vector、deque、array和string的迭代器都是这类迭代器。
输入迭代器能够在迭代时读取或处理一些值。如Input stream iterators。
输出迭代器能够在迭代时输出一些值。如Inserters、和output stream iterators。

算法
STL提供了一些标准算法来处理集合元素。这些算法一般提供最基本的功能,如搜索、排序、复制、修改和数值处理。

算法不是容器类的成员函数,而是全局函数。算法可以操作不同容器类型的元素,甚至可以操作用户自定义的容器类型。总之,既减少了代码量,又增强了性能。

迭代器适配器
任何操作起来像迭代器的东西都可以当作迭代器。所以可以写出像迭代器的一些类但又执行不一样的操作。C++标准库提供的一些预定义的特殊迭代器,即迭代器适配器。
一般分为四类:
Insert iterators也称为inserters,用来将“赋值新值”操作转换为“安插新值”操作。通过这种迭代器,算法可以执行安插(insert)行为而非覆盖(overwrite)行为。所有Insert迭代器都隶属于Output迭代器类型,所以它只提供赋值(assign)新值的能力。通常算法会将数值赋值给目的迭代器,如copy()算法
Stream iterators是一种迭代器配接器,可以把stream当成算法的原点和终点。更明确的说,一个istream迭代器可以用来从input stream中读元素,而一个ostream迭代器可以用来对output stream写入元素。Stream迭代器的一种特殊形式是所谓的stream缓冲区迭代器,用来对stream缓冲区进行直接读取和写入操作。
Reverse iterators重新定义递增运算和递减运算,使其行为正好倒置。
Move iterators很像一个底层迭代器(必须至少有一个InputIterator)。如果这个迭代器被当作输入迭代器来用,要注意的是,值的操作是移动而不是复制。

仿函数
算法函数的参数不一定非要是函数。可以是行为类似函数的对象,称为函数对象,或仿函数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: STL (Standard Template Library) 是 C++ 的标准库,它提供了许多预定义的模板,例如容器、算法、迭代器等,使得程序员能够方便快捷地完成一些常见的任务。如果你想用 C 语言来写一个 STL,你需要自己实现 STL 的所有功能。由于 C 语言没有模板这样的高级特性,所以实现 STL 的难度相当大。如果你真的想写,建议先了解 STL 的实现原理,并研究一些开源的 STL 实现,这样可以为你的实现提供很多启发。 ### 回答2: 用C语言编写一个完整的STL(Standard Template Library)是一个非常庞大和复杂的任务,超过了300字的篇幅。因此,在这里我将概述一下STL的核心组件和功能。 STL是C++标准库的一部分,提供了许多重要的模板类和函数,用于处理常见的数据结构和算法。要用C语言实现一个类似的STL,你需要具备扎实的C语言编程基础和对数据结构和算法的深入理解。 首先,你需要实现各种容器类,例如vector、list、queue和stack等。每个容器类都有其特定的数据结构和操作,例如向量、链表、队列和堆栈。你需要定义这些数据结构,并提供插入、删除和访问元素等操作。 其次,你需要实现算法部分,例如排序、搜索和操作容器的函数。这些算法非常重要,包括快速排序、二分查找和容器的遍历和修改,都需要使用C语言实现。 此外,你还需要实现迭代器,迭代器是STL的核心概念之一。迭代器是用于在容器遍历元素的指针或类似的机制。你需要定义迭代器的类型,并实现其与容器的操作和交互。 最后,你需要实现其他辅助功能,例如自动内存管理、异常处理和性能优化。这些功能可以提高你的STL的可用性和效率。 总之,用C语言编写一个完整的STL是一个非常复杂和耗时的任务。它需要深入的编程知识和对数据结构和算法的深入了解。希望我对你提出的问题有所解答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值