C++ STL算法

STL 提供了大量操作容器的算法,这些算法大致可以分为:排序、搜索、集合运算、数值处理和拷贝等,这些算法的实现是采用函数模板来实现的,函数模板类似于类模板。对于 STL 算法而言,算法是一样的,只是所处理的容器不同,只要使用合适的迭代器,就可以直接用算法操作容器了。

【例 1】
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool compare( const int & a, const int & b)
{
    return a > b;
}

void display( int i )
{
    cout<< i << " ";
}

bool odd( int i )
{
    return i % 2 != 0;
}

int main()
{
    vector < int > num ( 10 );
    //生成随机数字,填充num
    generate( num.begin(), num.end(), rand );
    //将其中的奇数全部替换我0
    replace_if( num.begin(), num.end(), odd, 0 );
    //从大到小排序
    sort( num.begin(), num.end(), compare );
    for_each( num.begin(), num.end(), display );
    cout << endl;
    return 0;
}
如果我们需要使用 STL 算法,则需要在头文件中包括<algorithm>头文件,在本程序中使用了四种 STL 算法:generate()、replace_if()、sort() 和 for_each()。下面我们来一一了解这四种算法的功能。

generate() 函数前面两个参数均为迭代器,分别指向开头和结尾,通过这两个迭代器,我们可以为 num 的 10 个元素赋值。由于 num 是整型的 vector 实例,因此要求 generate() 函数的第三个参数返回值也为整型,因此我们将库函数 rand() 作为第三个参数,用于生成随机数,其返回值是整型。调用完 generate() 函数之后,num 中就填充了一些随机数值。

replace_if() 前面两个参数还是两个迭代器,通过这两个迭代器我们可以对 num() 进行遍历,遍历过程中会逐一判断元素是否为奇数,如果为奇数,则将其换为 0。Replace_if() 要求第三个参数为一个返回 bool 类型的函数,为此我们专门设计了一个 odd() 函数,用于判断数值是否为奇数,如果为奇数则返回 true,否则返回 false。因为 num 为 int 型 vector 实例,因此要求用来替换的元素也必须为 int 型,故 replace_if() 函数最后一个参数必须为 int 型,在本例中我们直接使用 0。

接着我们对 num 进行排序,sort() 函数前面两个参数仍然是迭代器,第三个参数是可选的,默认情况下 sort() 将会以升序进行排序。本例中使用了第三个参数,第三个参数为 compare() 函数的函数名。因为 num 为整型实例,因此 compare() 函数的两个参数为整型的引用。同时由于 sort() 函数要求第三个参数为返回一个 bool 类型的函数,因此 compare() 也必须返回 bool 类型。本例中我们希望 num 以降序的方式排列,因此我们 compare() 函数返回“a > b”。当我们返回“a < b”或者根本就不提供第三个参数时,函数将会以升序的形式排列 num。

最后为了打印 num 中的所有元素,我们使用了 for_each() 函数,当然如果使用循环根据下标或使用迭代器都是可以打印 num 中的元素的,只不过我们是想介绍一下 for_each() 函数而已。for_each() 函数前面两个参数仍然是两个迭代器,通过这两个迭代器,我们就可以遍历 num 中的元素。for_each() 函数第三个参数用来完成打印操作,我们定义了一个 display() 函数用于完成此操作。

在整个程序中我们一直没有使用任何循环就完成了整个操作,这是因为这四个函数中分别定义了内建的迭代操作,而我们只需要指明迭代的起始和终止位置即可。

STL 中还提供了很多其它的算法,在今后的学习过程中,大家如果有需要可以去查找 C++ 的类库手册。