STL基础详解 Made By HALover
STL有什么用?
STL提供了一组表示容器、迭代器、函数对象和算法的模板。
①容器是一个与数组类似的单元,可以存储若干个值。
②算法是完成特定任务的处方。
③迭代器能够用来遍历容器的对象,与能够遍历数组的指针类似,是广义指针。
④函数对象是类似于函数的对象,可以是类对象或函数指针。
STL能够构造各种容器和执行各种操作。
模板类VECTOR
计算矢量存储了一组可随机访问的值,即可以使用索引来直接访问矢量的
第10个元素,而不必首先访问前面第9个元素。
要创建vector模板对象,可使用通常的表示法来指出要使用的类型。
另外,vector模板使用动态内存分配,因此可以用初始化参数来指出需要
多少矢量。
#include
using namespace std;
vector ratings(5); //定义一个由5个int组成的矢量
vector scores(n); //定义一个由n个double组成的矢量
可对矢量执行的操作
所有的STL容器都提供了一些基本方法,其中包括
size()——返回容器中元素数目
swap()——交换两个容器的内容
begin()——返回一个指向容器中第一个元素的迭代器
end()——返回一个表示超过容器尾的迭代器
VECTOR容器特有方法
push_back()方法能够将元素添加到矢量的末尾。这样做时,他将负责内存管理,
增加矢量的长度,使之能够容纳新的成员。
erase()方法删除矢量中给定区间的元素。它接受两个迭代器参数,这些参数定义
了要删除的区间。
scores.erase(scores.begin(),scores.begin()+2);
注:由于vector提供了随机访问功能,因此vector类迭代器定义了诸如
begin()+2等操作。
令p1,p2是两个迭代器,STL文档使用[p1,p2)来表示从p1(包括)到p2(不包
括)的区间。因此,区间[begin(),end())将包括迭代器的所有内容。
所以,上面的代码只删除了2个元素——begin()和begin()+1;
VECTOR容器特有方法
Insert()方法与erase()相反。它接受3个迭代器参数,第一个参数指定了新元素的
插入位置,第二个和第三个迭代器参数定义了被插入区间,该区间通常是另一个
容器对象的一部分。例如,下面的代码将矢量new_v中除第一个元素外的所有元
素插入到old_v矢量的第一个元素前面:
old_v.insert(old_v.begin(),new_v.begin()+1,new_v.end());
对矢量可执行的其他操作
for_each()函数可用于很多容器类,它接受3个参数。前两个是定义容器中区间的
迭代器,最后一个是指向函数的指针。for_each()函数将被指向的函数应用于容器
区间中的各个元素。被指向的函数不能修改容器元素的值。可以用for_each函数
来代替for循环。例如:
vector::iterator pr;
for (pr=books.begin();pr!=books.end();++pr)
ShowReview(*pr);
可被替换为:
for_each(books.begin(),books.end(),ShowReview);
对矢量可执行的其他操作
random_shuffle()函数接受两个指定区间的迭代器参数,并随机排列该区间中的
元素。该函数要求容器允许随机访问。例如,下面的语句随机排列books矢量中所
有元素:
random_shuffle(books.begin(),books.end());