C++ STL简介

STL(Standard Template Library,标准模板库),提供了通用的模板类和函数,这些模板类和函数可以实现多种流行和常用的算法和数据结构,如向量、链表、队列、栈。

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

组件 描述
容器(Containers) 容器是用来管理某一类对象的集合。C++ 提供了各种不同类型的容器,比如 deque、list、vector、map 等。
算法(Algorithms) 算法作用于容器。它们提供了执行各种操作的方式,包括对容器内容执行初始化、排序、搜索和转换等操作。
迭代器(iterators) 迭代器用于遍历对象集合的元素。这些集合可能是容器,也可能是容器的子集。

在C++标准中,STL被组织为下面的13个头文件。 

容器:

STL容器它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模版类,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。

容器部分主要由头文件,,,,,组成。对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以总结一下它们和相应头文件的对应关系。

向量(vector) 连续存储的元素

列表(list)       由节点组成的双向链表,每个结点包含着一个元素

双队列(deque) 连续存储的指向不同元素的指针所组成的数组

集合(set) 由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序 

多重集合(multiset) 允许存在两个次序相等的元素的集合 

栈(stack) 后进先出的值的排列 

队列(queue) 先进先出的执的排列 

优先队列(priority_queue) 元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列 

映射(map) 由{键,值}对组成的集合,以某种作用于键对上的谓词排列 

多重映射(multimap) 允许键对有相等的次序的映射 

算法:

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

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

是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。

 体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。

 中则定义了一些模板类,用以声明函数对象。

迭代器:

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

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

是一个很小的头文件,它包括了贯穿使用在STL中的几个模板的声明,

中提供了迭代器使用的许多方法,而对于的描述则十分的困难,它以不同寻常的方式为容器中的元素分配存储空间,同时也为某些算法执行期间产生的临时对象提供机制,中的主要部分是模板类allocator,它负责产生所有容器中的默认分配器。

案例1:迭代器iterator

#include 
#include 
using namespace std;

int main()
{
    vector v;
    for(int i = 0; i < 10; ++i )
        v.push_back(i);
    //迭代器的简单使用
    for(vector::iterator it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << " ";
    }
    cout << endl;
    return 0;
}

set容器

  set是用红黑树的平衡二叉索引树的数据结构来实现的,插入时,它会自动调节二叉树排列,把元素放到适合的位置,确保每个子树根节点的键值大于左子树所有的值、小于右子树所有的值,插入重复数据时会忽略。set迭代器采用中序遍历,检索效率高于vector、deque、list,并且会将元素按照升序的序列遍历。set容器中的数值,一经更改,set会根据新值旋转二叉树,以保证平衡,构建set就是为了快速检索。

  multiset,与set不同之处就是它允许有重复的键值。

由于是平衡二叉树,所以中序是有序的序列。

案例:iterator、reverse_iterator 正向/反向遍历

 

#include
#include

using namespace std;

int main()
{
	set s;
	for(int i=0;i<10;i++){//数据插入
		s.insert(i);
	}
    //正向遍历
	for(set::iterator it=s.begin();it!=s.end();it++){
		cout<<(*it);
	}
	cout<::reverse_iterator it=s.rbegin();it!=s.rend();it++){
		cout<<(*it);
	}
    return 0;
    /*结果:
		0123456789
		9876543210
	*/
}

 

 

 

 

 

 

你可能感兴趣的:(C++)