您的位置 首页 > 娱乐休闲

深入理解STL的核心内容及其实质 如何扩展c盘空间

STL 就是借助模板把常用的数据结构及其算法都实现了一遍,并且做到了数据结构和算法的分离。

STL主要由六大组件构成:容器(Container)、算法(algorithm)、迭代器(iterator)、仿函数(functor)、适配器(adapter)、配置器(allocator)。几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函数和类组成的库来说提供了更好的代码重用机会。

1 容器Containers

用于管理数据集合,其包括各种数据结构,比如vector、list、deque、set、map用来存放数据,从实现角度来看,STL容器是一种class template。

容器可以区分为四类。

vector 的底层为顺序表(数组),list 的底层为双向链表,deque 的底层为循环队列,set 的底层为红黑树,hash_set 的底层为哈希表。

2 算法 Algorithm

算法定义了计算过程,其包括各种算法,比如sort、search、copy、earse等。从实现角度来看,STL算法是一种function template。

一般来说,STL中的算法部分主要由头文件<algorithm>、<numeric>、<functional>组成。

通常来说,容器对象有方法可供使用,而算法可以以容器对象方法的返回值(迭代器对象)作为参数或直接作为方法来对容器进行操作。

STL算法本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用。

3 迭代器 Iterators

提供遍历容器的方法,它扮演了容器与算法之间的胶合剂,是所谓“泛型指针”,共有5种类型及其他衍生变化。从实现角度来讲,STL迭代器是一种将operator*、operator->、operator++、opertor--等指针相关操作予以重载的class template。迭代器用来指向容器中的元素,并通过重载的迭代器的操作符来实现指向的偏移(通过自增、自减或简单的算术运算来遍历容器中的所有成员)。所有的STL容器都附有自己专属的迭代器。

简单来说,STL提供的所有算法几乎都是通过迭代器存取元素序列进行工作的,每个容器都定义了它本身所专有的迭代器,用以存取容器中的元素。

迭代器有各种不同的创建方法。程序可能把迭代器作为一个变量创建。一个STL容器类可能为了使用一个特定类型的数据而创建一个迭代器。作为指针,必须能够使用*操作符类获取数据。你还可以使用其他数学操作符如++用来递增迭代器,以访问容器中的下一个对象。如果迭代器到达了容器中的最后一个元素的后面,则迭代器变成past-the-end值。使用一个past-the-end值得指针来访问对象是非法的,就好像使用NULL或为初始化的指针一样。

有容器类方法可以返回迭代器对象,可以作为值来赋给迭代器变量。两个典型的容器类方法是begin()和end()。它们在大多数容器中表示整个容器范围。其他一些容器还使用rbegin()和rend()方法提供反向迭代器,以按反向顺序指定对象范围。

对于STL数据结构和算法,你可以使用五种迭代器。下面简要说明了这五种类型:

· Input iterators 提供对数据的只读访问。

· Output iterators 提供对数据的只写访问

· Forward iterators 提供读写操作,并能向前推进迭代器。

· Bidirectional iterators提供读写操作,并能向前和向后操作。

· Random access iterators提供读写操作,并能在数据中随机移动。

读写的分类可以理解为一种数据保护机制。而向前、向后、随机移动的操作是对迭代器作为一种类模板对操作符++、--、+、-的重载。

4 仿函数 Functors

将函数封装在对象中,供其他组件使用。行为类似函数,可作为算法的某种策略,从实现角度来看,它是一种重载了operator()的class或class template,一般的函数指针可视为狭义的仿函数。

5 配接器 Adapters

一种用来修饰容器、仿函数或迭代器的接口,如STL提供的queue和stack,虽然看似容器,其实只能算是一种容器配接器,因为它们底部完全借助deque, 所有操作都由底层的deque供应。改变functor接口者称为function adapter,改变container接口者称为container adapter,改变iterator接口者称为iterator adapter。

6 配置器 Allocators

负责空间配置与管理,从实现角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的class template。

7 实例

8 综述

为了避免和其他头文件冲突, STL的头文件不再使用常规的.h扩展。为了包含迭代器和算法,用下面的指示符:

#include <iterator> #include <algorithm>

STL头文件:

STL体现的是泛型编程的核心思想:独立数据结构和算法(这是一种独立于OO的编程哲学)。 STL深深地植根于C++的基础设施,这其中包括了内联、函数对象、函数模板、类模板等。

STL的最主要的两个特点:数据结构和算法的分离,非面向对象本质。访问对象是通过象指针一样的迭代器实现的;容器是象链表,矢量之类的数据结构,并按模板方式提供;算法是函数模板,用于操作容器中的数据。由于STL以模板为基础,所以能用于任何数据类型和结构。

附代码:

#include <io; #include <algorithm> #include <vector> using namespace std; vector<int> intVector( 5 ); void main() { intVector[3-1] = 33; for ( int i = 1; i <= 15; i++ ) { in( i ); } vector<int>::iterator intIter = \ find( in(), in(), 12 ); if ( intIter != in() ) cout << "Vector contains value " << *intIter << endl; else cout << "Vector does not contain 12" << endl; for ( intIter = in(); \ intIter != in(); ++intIter ) { cout << *intIter << " "; } cin.get(); } /*output: Vector contains value 12 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */

-End-

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“如何扩展stl,如何扩展c盘空间,如何扩展C盘,如何扩展手机内存”边界阅读