vector模板类

STL提供了一组表示容器、迭代器、函数对象和算法的模板。容器是一个与数组类似的单元,可以存储若干值。STL容器是同质的,存储的值的类型相同;迭代器能够用来遍历容器的对象,是广义的指针;函数对象可以是类对象或函数指针。

一、模板类vector

在计算中,矢量对应数组。可以创建vector对象,将vector对象赋给另一对象,使用[]运算符来访问vector对象。

在头文件vector中定义了vector模板。#include

创建vector模板对象,使用表示法来指出要使用的类型vector模板使用动态内存分配,可以使用初始化参数来指出需要多少矢量。

#include

using namespace std;

vector rating(5);   //a vector of 5 ints

int n;

cin>>n;

vector scores(n);     //a vector of n doubles

运算符[]被重载,创建vector对象后,可以使用通常的数组表示法来访问各个元素。

rating[0] = 9;

for(int i= 0;i

{

cout<

}        

二、分配器

各个STL容器模板都接受一个可选的模板参数,该参数指定使用那个分配器对象来管理内存。

例如,vector模板的开头:

template >

       class vector{…}

如果省略该模板参数的值,则容器模板将默认使用allocator类。这个类使用newdelete

可对矢量执行的操作:

size()--返回容器中的元素数目;

swap()--交换两个容器的内容;

begin()--返回一个指向容器中第一个元素的迭代器;

end()--返回一个表示超过容器为的迭代器;

三、迭代器

迭代器是一个广义的指针,每个容器类都定义了一个合适的迭代器,该迭代器的类型是一个名为iteratortypedef,其作用域为整个类。

vector::iterator pd; //vectordouble类型的迭代器

vector.scores;  //scores是一个vector对象

pd = scores.begin();

*pd = 22.3;

++pd;

end()成员函数表示超过结尾的位置。如果将迭代器设置为容器的第一个元素,并不断的递增,则最终它将到达容器的结尾,从而遍历整个容器的内容。

for(pd = scores.begin(); pd != scores.end(); pd++)

       cout<<*pd<

vector模板类包含针对某些STL容器的方法。push_back()将元素添加到矢量的末尾

vector scores;

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 old_v;

vector new_v;

//将矢量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());

四、三个具有代表性的STL函数:

  1.          for_each()

接受三个参数;前两个是定义容器中区间的迭代器,最后一个是指向函数的指针。

将被指向的函数应用于容器区间中的各个元素。被指向的函数不能修改容器元素的值。

vector::iterator pr;

for(pr = books.begin();pr !=books.end();pr++)

       ShowReview(*pr);  //打印*pr的内容

可将上述代码改写成

for_each(books.begin(),books.end(),ShowReview);

  1.          random_shuffle()

函数接受两个指定区间的迭代器参数,并随机排列该区间中的元素。

random_shuffle(books.begin(),books.end()); //随机排列books矢量中所有元素

  1.          sort()

要求容器支持随机访问。有两个版本。

版本一:

接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的<运算符,对区间中的元素进行操作。

vector coolstuff;

//按升序对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);

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