1.1 什么是STL?
STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库。它被容纳于C++标准程序库(C++ Standard Library)中,是ANSI/ISO C++标准中最新的也是极具革命性的一部分。该库包含了诸多在计算机科学领域里所常用的基本数据结构和基本算法。为广大C++程序员们提供了一个可扩展的应用框架,高度体现了软件的可复用性。
STL的一个重要特点是数据结构和算法的分离。尽管这是个简单的概念,但这种分离确实使得STL变得非常通用。例如,由于STL的sort()函数是完全通用的,你可以用它来操作几乎任何数据集合,包括链表,容器和数组;
STL另一个重要特性是它不是面向对象的。为了具有足够通用性,STL主要依赖于模板而不是封装,继承和虚函数(多态性)——OOP的三个要素。你在STL中找不到任何明显的类继承关系。这好像是一种倒退,但这正好是使得STL的组件具有广泛通用性的底层特征。另外,由于STL是基于模板,内联函数的使用使得生成的代码短小高效;
从逻辑层次来看,在STL中体现了泛型化程序设计的思想,引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术;从实现层次看,整个STL是以一种类型参数化的方式实现的,这种方式基于一个在早先C++标准中没有出现的语言特性--模板(template)。
1.2 STL内容介绍:
STL中六大组件:
1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供。为了访问容器中的数据,可以使用由容器类输出的迭代器;
2)迭代器(Iterator),提供了访问容器中对象的方法。例如,可以使用一对迭代器指定list或vector中的一定范围的对象。迭代器就如同一个指针。事实上,C++的指针也是一种迭代器。但是,迭代器也可以是那些定义了operator*()以及其他类似于指针的操作符地方法的类对象;
3)算法(Algorithm),是用来操作容器中的数据的模板函数。例如,STL用sort()来对一个vector中的数据进行排序,用find()来搜索一个list中的对象,函数本身与他们操作的数据的结构和类型无关,因此他们可以在从简单数组到高度复杂容器的任何数据结构上使用;
4)仿函数(Function object)
5)迭代适配器(Adaptor)
6)空间配制器(allocator)
1.3 STL中的组件使用:
一、vector容器
1、特点:
a、占用的是连续的内存
b、动态的管理内存
c、支持随机访问(at,[])。
d、支持按迭偌器进行插入和删除(inster,erase)
但只有在末尾添加和删除时效率才最高。
e、支持随机迭代:it=it+4;
2、定义
vector<类型> a; // 创建容器,
vectro<类型> a(10); // 创建容器并设置容量为10,把元素初始化为0
vector<类型> a(10,1);// 创建容器并设置容量为10,并设置初始值
3、返回值
v[i]、v.at(i)、v.front()、v.back()这种方式返回的是元素的引用。
5、成员函数
void assign( input_iterator start, input_iterator end);
void assign( size_type num, const TYPE &val);
size_type capacity(); //获取容器在扩充之后的容量
iterator erase( iterator loc );
iterator erase( iterator start, iterator end );
iterator insert( iterator loc, const TYPE &val );
void insert( iterator loc, size_type num, const TYPE &val );
void insert( iterator loc, input_iterator start, input_iterator end );
// 元素被删除或插入之后,之前的获取的迭代器就失效,需要重新获取。
void resize( size_type size, TYPE val );
//改容器的大小,可以调大(构造),也可以调小(析构)。
6、运算符
==、!=、>=、<=、>、<
比较两人个容器中元素的数量、顺序、值是否相等。
容器中存储的对象的==运算符必须要重载。
7、排序、查找
在vector容器中是没有排序和查找成员函数。
在List容器中由于这是链式的存储结构所有不能使用全局的sort函数,必须自己实现。
在使用sort排序时,待排序的对象必须实现出<的重载(或者给sort提高比较函数)。
8、自定义类使用容器时需要实现的成员有
无参构造、拷贝构造
== <
给出vector常用方法代码:
//1.定义和初始化
vector vec1; //默认初始化,vec1为空
vector vec2(vec1); //使用vec1初始化vec2
vector vec3(vec1.begin(),vec1.end());//使用vec1初始化vec2
vector vec4(10); //10个值为的元素
vector vec5(10,4); //10个值为的元素
//2.常用操作方法
vec1.push_back(100); //添加元素
int size = vec1.size(); //元素个数
bool isEmpty = vec1.empty(); //判断是否为空
cout<=、<=...
vector::iterator iter = vec1.begin(); //获取迭代器首地址
vec1.clear(); //清空元素
//3.遍历
//下标法
int length = vec1.size();
for(int i=0;i::const_iterator iterator = vec1.begin();
for(;iterator != vec1.end();iterator++)
{
cout<<*iterator;
}
二、set容器
集合容器,里面的元素不会重复,它会自动排重。
使用时要实现它的==运算符。
multiset 允许有重复的数据。
pair equal_range( const key_type &key );
查找值等于key的元素信息,返回两人个迭代器。
iterator lower_bound( const key_type &key );
查找大于等于key的第一个元素
iterator upper_bound( const key_type &key );
查找大于key的第一个元素
三、队列
单向队列:
back、empty、front、pop、push、size
双向队列:
四、List
是一种链式存储结构,不能使用算法库中的排序,只能调用自带的排序函数。
void unique();
void unique( BinPred pr );
删除重复的元素。
void splice( iterator pos, list &lst );
void splice( iterator pos, list &lst, iterator del );
void splice( iterator pos, list &lst, iterator start, iterator end );
从指定的位置开始合并两个链表
void merge( list &lst );
void merge( list &lst, Comp compfunction );
直接合并两人个链表
五、map是一种关联式的容器
它底层以采用的是红黑树(有序+平衡)进行存储的。
一个键值(主键)只能对应一个值。
multimap 多重映射
键值可以重复
关于map这里给出它的文件读写,需要使用迭代器
#include
#include
map的文件读写比向量麻烦,但是由于它的特殊性质,在有些地方很好用。
六、priority_queue优先队列
元素在入队后就已经排序好了,最大值在上面。
对元素排序依靠的是 < 运算符。
总结:STL中还有很多已经封装好的工具,我们要合理的使用它,在使用时查阅相关手册即可!