【温故而知新】C和C++4:STL概览

一、STL简介

1、什么是STL:

标准模板库(Standard Template Library , STL)是一个C++通用库,其目的在于将组建标准化,节省开发者的时间和精力。从组织上来看,STL可分为六大部分,分别是迭代器(iterators)、算法(algorithms)、容器(container)、函数对象(function object)、内存分配器(allocator)和配接器(adapter)。其中的代码采用了模板类和模板函数实现,极大地提高了编程效率。STL相对于传统的编程方法,可以更好地实现代码的重用。

STL除了具有节省开发成本的有点之外,还具有以下特点:通用性好;运行效率高;数据结构简单却严谨、层次化好;安全机制完善、有较好的内存管理方法。

2、关于命名空间namespace:

命名空间技术是STL的特性之一,主要用于解决软件的模块组件化而可能产生的命名冲突。这种冲突主要来自不同看模块和库针对不同的对象所采用的相同的标识符表示。命名空间是开放的,因此利用一个namespace定义的一些组件可以散布于多个代码模块内。如C++标准库采用的就是一个命名空间,即“标准命名空间”std。如果在代码中使用了using namespace std;则会默认调用这个std命名空间内的标识符;如果要指定调用某个命名空间的标识符,则需要使用namespace::obj的方法,如:

std::cout<<"Hello World!"<<endl;

需要注意的是,最好不要在头文件、模块等位置使用using namespace声明,因为这可能会改变namespace的作用范围,导致其他模块收到未知的影响。

二、STL的基本结构

1、容器

容器类是STL的基本类之一,是可以包容其他类的结构。常见的有向量类(vector)、链表类(deque)、双向队列(list)、集合(set)、图(map)等。

1)vector<T>:一种容量可变的向量,可以实现顺序表结构的功能;

2)list<T>:双向链表容器,实现链表的功能;

3)queue<T>:队列容器,实现队列结构的功能;

4)stack<T>:栈容器,实现栈数据结构的功能;

5)deque<T>双端队列;

6)priority_queue<T>按值排序的队列;

7)set<T>集合容器

8)multiset<T>多重集合容器,允许出现重复元素;

9)map<key,val>键值对容器,可以实现根据key对val的查询;

10)multimap<key,val>多重键值对,允许出现重复的key值;

根据这些容器的不同特点,可以分为两大类:(1)顺序式容器:vector、list、deque等;(2)关联式容器:set、map等。

2、算法

STL提供了多种针对不同数据结构的算法,定于与std命名空间中,引用如下头文件后可以获取:

#include <algorithm>

一般来说,STL提供的算法函数具有多种优点:定义、操作简单;能根据输入数据的类型自动选择最合适的算法;

具体针对不同对象的算法函数可以参考相关书籍和文档。

3、迭代器

迭代器为访问容器提供了通用的方法,可以允许程序对容器进行反复访问,其作用类似于指向对象的指针。STL定义了5种不同的迭代器,以使用方式分别命名为输入、输出、前向、双向和随机访问5种,可用于不同种类的容器。不同的迭代器的特点和支持的容器类型如下所示:

1)输入迭代器:前向读取,支持istream等;

2)输出迭代器:前向写入,支持ostream、inserter等;

3)前向迭代器:前向读写;

4)双向迭代器:前向+反向读写,支持list、set(包括multiset)、map(包括multimap)等;

5)随机访问迭代器:随机读写,支持vector、deque、string等。

4、函数对象、内存分配器和配接器

所谓函数对象,可以理解为函数的一般形式;配接器主要用于接口间的转换,比如把数据从一个类中移到另一个类;内存分配器应用较少,接触到的时候再详述。

时间: 2024-09-24 13:46:07

【温故而知新】C和C++4:STL概览的相关文章

C++11时代的标准库快餐教程(2) - STL概览

STL概览 在进入STL的世界之前,我们先对其中的主要组件做一个鸟瞰: 先来一张层次图: 如果觉得层次图看不清的话,我们把它重新绘成思维导图吧: 从图中我们可以看到: STL的核心只有三个大组件: 容器 迭代器 算法 当然,这么大的一个包罗万象的C++标准库,还是有很多其他的组件,比如智能指针.字符串.正则表达式.流式I/O.并发处理等不是跟容器相关的.但是做为核心的容器库,就只有这三大组件. 容器的种类其实蛮少的,大体上分为基本容器和特殊容器两大类. 基本容器按照无序,有序,排序分成了三大类:

【温故而知新】C和C++5:STL容器技术综述

容器类是可以包含其他对象的类.STL中提供的较为常用的容器类有向量.链表.队列.集合和图等,每一种容器类都是一个模板,可以包含各种类型的对象.这些容器可以分为序列式和关联式两大类. 序列式容器主要有: 1.vector:向量类,可以认为是一种容量可变的数组,可以提供对元素的随机访问,而且可以在序列尾部快速插入和删除数据,并且在需要的时候可以方便地改变容器的大小: 2.list:双向链表类,不支持随机访问的数组类,遍历链表的元素需要从某个端点开始向前或向后遍历: 3.queue:队列,实现先进先出

【温故而知新】C和C++8:STL中的list容器

STL提供的list容器实现了双向链表的功能.因此,list容器中的各个元素都是双向链表中的节点,可以很方便地插入和删除元素,但是无法对容器中的元素进行随机存取,必须从容器的头部或尾部遍历.list容器在序列中的任何位置增删元素都是非常高效率的,并可以在需要的时候任意改变自身容量的大小. 1.list容器的定义: 关于如何构造一个list对象,STL提供了多种构造方法: list<type> name;//构建一个空对象 list<type> name(size);//构建一个初始

【温故而知新】C和C++6:STL中的vector容器

向量容器vector是STL中提供的最常用的容器之一,提供了随机访问数组的功能,可以实现对内部元素的随机访问以及方便地在末尾插入和删除数据.vector可以十分方便地实现数据结构中数组.堆栈功能,而且不需要手动编写管理数据结构的相关函数.其定义在头文件<vector>中. 对vector中的元素进行赋值: 向vector中存放数据主要有两种方法,其一是使用push_back函数逐个在vector末尾添加数据:采用这种方法不需要对容器进行初始内存分配,可以直接从一个空的容器开始操作,但是只能依次

【温故而知新】C和C++9:STL中的set容器

1.Set/MultiSet容器的定义和创建 Set即集合类,可以在程序中按照次序来保存一组数值.在集合中,元素的关键字和数据二者相同,该集合本质上就是一个有序的排列.Multiset与set不同的是,前者其中的元素允许重复而后者不允许. Set对象采用二叉树结构储存,该结构的优点是查询效率高,并且有利于插入和删除操作. Set定义了多种实例化的方法,其中比较常用的有: set<int> s0;//定义一个空的set set<int, greater<int>> s1;

C++程序设计:原理与实践(进阶篇)15.10 容器概览

15.10 容器概览 STL提供了一些容器: 标准容器 vector 连续存储的元素序列:应用作默认容器 list 双向链表:当你希望在不移动现有元素的情况下完成对元素的插入和删除时使用 deque list和vector的交叉:除非你对算法和计算机体系结构知识非常精通,否则不要使用它 map 平衡有序树:当你需要按值访问元素时使用它(参见16.6.1-16.6.3节) multimap 平衡有序树,可以包含同一个key的多个拷贝:当你需要按值访问元素时使用它(参见16.6.1-16.6.3节)

STL——空间的配置和释放std::alloc(第一级配置器和第二级配置器)

1 空间的配置和释放,std::alloc 对象构造前的空间配置和对象析构后的空间释放,由<stl_alloc.h>负责,SGI对此的设计哲学如下: 向system heap要求空间 考虑多线程状态 考虑内存不足时的应变措施 考虑过多"小型区块"可能造成的内存碎片问题 C++的内存配置基本操作是::operator new(),内存释放基本操作是::operator delete().这两个全局函数相当于C的malloc()和free()函数.是的,正是如此,SGI正是以m

STL之Map

概述 Map是标准关联式容器(associative container)之一,一个map是一个键值对序列,即(key ,value)对.它提供基于key的快速检索能力,在一个map中key值是唯一的.map提供双向迭代器,即有从前往后的(iterator),也有从后往前的(reverse_iterator). map要求能对key进行<操作,且保持按key值递增有序,因此map上的迭代器也是递增有序的.如果对于元素并不需要保持有序,可以使用hash_map. map中key值是唯一的,如果马匹

c++,关于stl的应用,定义map

问题描述 c++,关于stl的应用,定义map 我想定义一个map容器,key是一个string,值是一个指向vector的指针,但是不同的string会对应不同类型的vector,这就不好定义了.求帮忙解决 解决方案 似乎没有很好的解决方案,因为stl是泛型,类型参数不同,就相当于两个不同的类型,不能存储在一个容器中.下面是一个勉强能用的方法,供你参考:可以用map<string void*>,然后再对void*强制类型转换,得到你想要的指针.前提是你已经知道每个string对应什么类型的指