c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作
c++ primer plus 第16章string 类和标准模板库, 16.3.3 对矢量可执行的其他操作
16.3.3 对矢量可执行的其他操作
程序员通常要对数组执行很多操作,如搜索、排序、随机排序等。矢量模板类包含了执行这些常见的操作的方法吗?没有!STL从更广泛的角度定义了非成员(non-member)函数来执行这些操作,即不是为每个容器类定义 find()成员函数,而是定义了一个适用于所有容器类的非成员函数 find()。这种设计理念省去了大量重复的工作。例如,假设有8个容器类,需要支持10种操作。如果每个类都有自己的成员函数,则需要定义80(8*10)个成员函数。但采用STL方式时,只需要定义10个非成员函数即可。在定义新的容器类时,只要遵循正确的指导思想,则它也可以使用己有的10个非成员函数来执行查找、排序等操作。另一方面,即使有执行相同任务的非成员函数,STL有时也会定义一个成员函数。这是因为对有些操作来说,类特定算法的效率比通用算法高,因此,vector的成员函数swap()的效率比非成员函数swap()高,但非成员函数让您能够交换两个类型不同的容器的内容。
下面来看3个具有代表性的STL函数:for_each()、random_shufe()和sort()。for each()函数可用于很多容器类,它接受3个参数。前两个是定义容器中区间的迭代器,最后一个是指向函数的指针(更普遍地说,最后一个参数是一个函数对象,函数对象将稍后介绍)。foreach()函数将被指向的函数应用于容器区间中的各个元素。被指向的函数不能修改容器元素的值。可以用foreach()函数来代替 for 循环。例如,可以将代码:
vector<Review>::iterator pr;
for(pr=books.begin();pr !=books.end();pr++)
ShowReview(*pr);
替换为:
for each(books.begin(),books.end(),ShowReview);
这样可避免显式地使用迭代器变量。
Random shume()函数接受两个指定区间的迭代器参数,并随机排列该区间中的元素。例如,下面的语句随机排列 books 矢量中所有元素:
random_shuffle(books.begin(),books.end());
与可用于任何容器类的 for each 不同,该函数要求容器类允许随机访问,vector 类可以做到这一点。sort()函数也要求容器支持随机访问。该函数有两个版本,第一个版本接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的<运算符,对区间中的元素进行操作。例如,下面的语句按升序对coolstuf的内容进行排序,排序时使用内置的<运算符对值进行比较:
vector<int>coolstuff;
sort(coolstuff.begin(),coolstuff.end());
如果容器元素是用户定义的对象,则要使用sort(),必须定义能够处理该类型对象的 operator<()函数例如,如果为 Review提供了成员或非成员函数operator<(),则可以对包含 Review 对象的矢量进行排序。由于Review是一个结构,因此其成员是公有的,这样的非成员函数将为:
bool