C++泛型算法结构

迭代器类别

按照算法要求的迭代器操作可以分为5个迭代器类型:

  • 输入迭代器,只读不写,单遍扫描,只能递增。
  • 输出迭代器,只写不读,单遍扫描,只能递增。
  • 前向迭代器,可读写,多遍扫描,只能递增。
  • 双向迭代器,可读写,多遍扫描,可递增递减。
  • 随机访问迭代器,可读写,多遍扫描,支持全部迭代器运算。

算法形参模式

大多数算法具有如下4种形式之一,其中alg是算法的名称,begin和end表示算法所操作的输入范围,dest,begin2,end2,都是迭代器参数,它们分别代表了目的位置和第二个范围,除了这些迭代器参数,一些算法还接受额外的非迭代器参数。

  • alg(begin,end,other args);
  • alg(begin,end,dest,other args);
  • alg(begin,end,begin2,other args);
  • alg(begin,end,begin2,end2,other args);

算法命名规范

一些算法使用重载形式传递一个谓词参数来代替默认操作(例如==运算符)。接受一个元素值的算法通常有另一个不同名的非重载版本,该版本接受一个谓词代替元素值,这种版本通常附加_if后缀。

bool myComp(int value1, int value2)
{
    return value1 < value2;
}

bool myFind(int value)
{
    return true;
}


int main()
{
    vector values{ 3,2,4,5 };
    unique(values.begin(), values.end());
    unique(values.begin(), values.end(), myComp);

    find(values.begin(), values.end(), 1);
    find_if(values.begin(), values.end(), myFind);
    system("pause");
}

特定容器算法

与其它容器不同,链表类型lits和forward_list定义了几个成员函数形式的算法,例如sort,merge,remove,reverse,unique。这些算法的通用版本可以用于链表,但代价太高,这些链表版本的算法的性能比对应的通用版本好得多。

链表定义了splice算法,此算法是链表数据结构特有的,它的功能是将其它链表里的元素移动到自身。

链表特有版本与通用版本的一个重要区别是链表版本会改变底层容器,例如remove的链表版本会删除指定元素,unique的链表版本会删除第二个和后继的重复元素。

你可能感兴趣的:(C++泛型算法结构)