STL提供了一组表示容器、迭代器、函数对象和算法的模板。容器是一个与数组类似的单元,可以存储若干值。STL容器是同质的,存储的值的类型相同;迭代器能够用来遍历容器的对象,是广义的指针;函数对象可以是类对象或函数指针。
在计算中,矢量对应数组。可以创建vector对象,将vector对象赋给另一对象,使用[]运算符来访问vector对象。
在头文件vector中定义了vector模板。#include
创建vector模板对象,使用
#include
using namespace std;
vector
int n;
cin>>n;
vector
运算符[]被重载,创建vector对象后,可以使用通常的数组表示法来访问各个元素。
rating[0] = 9;
for(int i= 0;i
{
cout<
}
各个STL容器模板都接受一个可选的模板参数,该参数指定使用那个分配器对象来管理内存。
例如,vector模板的开头:
template
class vector{…}
如果省略该模板参数的值,则容器模板将默认使用allocator
可对矢量执行的操作:
size()--返回容器中的元素数目;
swap()--交换两个容器的内容;
begin()--返回一个指向容器中第一个元素的迭代器;
end()--返回一个表示超过容器为的迭代器;
迭代器是一个广义的指针,每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iterator的typedef,其作用域为整个类。
vector
vector
pd = scores.begin();
*pd = 22.3;
++pd;
end()成员函数表示超过结尾的位置。如果将迭代器设置为容器的第一个元素,并不断的递增,则最终它将到达容器的结尾,从而遍历整个容器的内容。
for(pd = scores.begin(); pd != scores.end(); pd++)
cout<<*pd<
vector模板类包含针对某些STL容器的方法。push_back()将元素添加到矢量的末尾。
vector
double temp;
while(cin>>temp && temp >=0)
scores.push_back(temp);
cout<
erase()方法删除矢量中给定区间的元素。它接受两个迭代器参数,这些参数定义了要删除的区间。第一个迭代器指向区间的起始处,第二个迭代器位于区间中指出的后一个位置。
scores.erase(scores.begin(),scores.begin()+2); //删除begin()和begin()+1指向的元素
insert()方法向vector类插入元素。它接受3个迭代器参数,第一个参数指定了新元素的插入位置,第二个和第三个迭代器参数定义了被插入区间,该区间通常是另一个容器对象的一部分。
vector
vector
…
//将矢量new_v中除第一个元素外的所有元素插入到old_v矢量的第一个元素后
old_v.insert(old_v.begin(),new_v.begin()+1,new_v.end());
//将新元素插入到old.end()前面,也即old_v矢量最后一个元素的后面。
old_v.insert(old_v.end(),new_v.begin()+1,new_v.end());
接受三个参数;前两个是定义容器中区间的迭代器,最后一个是指向函数的指针。
将被指向的函数应用于容器区间中的各个元素。被指向的函数不能修改容器元素的值。
vector
for(pr = books.begin();pr !=books.end();pr++)
ShowReview(*pr); //打印*pr的内容
可将上述代码改写成
for_each(books.begin(),books.end(),ShowReview);
函数接受两个指定区间的迭代器参数,并随机排列该区间中的元素。
random_shuffle(books.begin(),books.end()); //随机排列books矢量中所有元素
要求容器支持随机访问。有两个版本。
版本一:
接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的<运算符,对区间中的元素进行操作。
vector
…
//按升序对coolstuff的内容进行排序,排序时使用内置的<运算符对值进行比较
sort(coolstuff.begin(),coolstuff.end());
如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的operator<()函数。
bool oprator<(const Review & r1, const Review & r2)
{
if (rl.title < r2.title)
return true;
else if (rl.title == r2 .title && r1.rating < r2.rating)
return true;
else
return false;
}
之后可以对包含Review对象的矢量进行排序
sort(books.begin(),books.end());
版本二:
接受三个参数,前两个参数也是指定区间的迭代器,最后一个参数是指向要实用的函数的指针,而不是用于比较的operator<()。返回值可转换为bool,false表示两个参数的顺序不正确。
bool WorseThan (const Review & r1, const Review & r2)
{
if(rl.rating < r2.rating)
return true;
else
return false;
}
之后,使用sort()函数对包含Review对象的矢量类进行排序。
sort(books.begin(),books.end(),WorseThan);