??????? 一、STL简单介绍
??????? 泛型编程的代表作品STL是一种高效、泛型、可交互操作的软件组件。所谓泛型(Genericity),是指具有在多种数据类型上皆可操作的含意,与模板有些相似。
??????? STL巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。STL以迭代器 (Iterators)和容器(Containers)为基础,是一种泛型算法(Generic Algorithms)库,容器的存在使这些算法有东西可以操作。STL包含各种泛型算法(algorithms)、泛型指针(iterators)、泛型容器(containers)以及函数对象(function objects)。STL并非只是一些有用组件的集合,它是描述软件组件抽象需求条件的一个正规而有条理的架构。
?????? 泛型的第一个好处是编译时的严格类型检查。这是集合框架最重要的特点。此外,泛型消除了绝大多数的类型转换。如果没有泛型,当你使用集合框架时,你不得不进行类型转换。
?????? 关于泛型的理解可以总结下面的一句话,它是把数据类型作为一种参数传递进来。
?
??????? 二、组件:
??????? 1、容器:顺序容器{vector、list、deque、string等}是一系列元素的有序集合,关联容器{set、multiset、map、multimap}包含查找元素的键值;
??????? 2、迭代器,作用:遍历容器;
??????? 3、算法:1、排序算法;2、不可变序算法;3、变序性算法;4、数值算法。
?
?????? 三、容器:
?????? 2.1 vector容器
?1、创建形式
?(1)不指定容器的元素个数:vector<int > v;
?(2)创建时,制定容器的大小:vector<int> v(10);
?(3)创建一个具有n个元素的向量容器对象,每一个元素具有指定的初始值:vector<int> v(10,0.8);
?(2)尾部元素扩张,调用push_back()方法,尾部添加,并自动分配新的内存空间。
?2、访问方式
?(1)以下标方式访问vector元素,类似于数组的访问
?(2)用迭代器访问
??vector<[数据类型]>::iterator it;?//it相当于指针,然后结合循环语句
?(3)元素的插入
??insert()方法可以在vector对象的任意位置 前 插入一个新的元素,同时vector自动扩展一个元素空间,插入位置之后的所有元素依次向后挪动一个位置。配合<对象>.begin(),<对象>.end()方法【begin()返回的是首元素位置的迭代器,end()返回的是最后一个元素的下一个元素位置的迭代器】
??注意:<对象>.insert()方法要求插入的位置,是元素的迭代器位置,而不是元素的下标。
#include<vector>
#include<iostream>
using namespace std;
int main(int argc,char* argv)
{
?vector<int> v(3);
?v[0] = 2;
?v[1] = 7;
?v[2] = 9;
?//在最前面插入新元素,元素值为8
?v.insert(v.begin(),8);??????//第一参数是迭代器的位置,第二个参数是插入的值
?//在第二个元素前添加新的元素,3
?v.insert(v.begin()+2,3);??????????//v.begin()+2
?//使用迭代器变量,相当于定义指针
?vector<int>::iterator it;
?for(it = v.begin();it != v.end();it++)
?{
??//输出迭代器上的元素值
??cout << *it << " " ;
?}
?// 换行
?cout << endl ;
?return 0;
}
?(4)元素的删除
?调用erase()方法可以删除vector中迭代器所指的一个元素,或者一段区间中的所有元素。
?clear()方法则是一次性的删除vector中的所有元素。
?
?v.erase(v.begin()+1,v.begin()+5);//头指针到尾指针
?(5)使用reverse反向排序算法,该函数包含于“#include<algorithm>”.
?reverse(v.begin(),v.end());//头指针到尾指针
?
?(6)使用sort()算法对向量元素排序,包含于"#include<algorithm>".
?sort算法要求使用随机访问迭代器的方式进行排序,在默认的情况下,对向量元素进行升序排列。
?
?sort(v.begin(),v.end());//头指针到尾指针,可以进行重写
?(7)向量的大小
?<对象>.size():返回向量的大小,即元素的个数。
?<对象>.empty():返回向量是否为空。0或者1.