zoukankan      html  css  js  c++  java
  • C++ Primer 学习笔记_45_STL实践与分析(19)--建筑常规算法

    STL实践与分析

    --泛型算法的结构



    引言:

        正如全部的容器都建立在一致的设计模式上一样,算法也具有共同的设计基础

        算法最主要的性质是须要使用的迭代器种类。全部算法都指定了它的每一个迭代器形參可使用的迭代器类型。

    比方,假设形參必须为随机訪问迭代器则可提供vectordeque类型的迭代器,或者提供指向数组的指针。

    而其它容器的迭代器不能用在这类算法上。

       C++还提供了另外两种算法模式:一种模式由算法所带的形參定义;还有一种模式则通过两种函数命名和重载的规范定义


    一、算法的形參模式

       大多数的算法都採用以下四种形參模式:

    alg(beg,end,other parms);
    alg(beg,end,dest,other parms);
    alg(beg,end,beg2,other parms);
    alg(beg,end,beg2,end2,other parms);
    

       当中。alg是算法的名字。begend指定算法操作的元素范围。

    我们通常将该范围成为算法的“输入范围”。


    1、带有单个目标迭代器的算法

       dest形參是一个迭代器。用于指定存储输出数据的目标对象。

        调用这些算法时,必须确保输出容器有足够大的容量存储输出数据。

        假设dest是容器上的迭代器,则算法将输出内容写到容器中已存在的元素上

    更普遍的使用方法是,dest与某个插入迭代器或者ostream_iterator绑定在一起

    插入迭代器在容器中加入元素,以确保容器有足够的空间存储输出。ostream_iterator则实现写输出流的功能,无须要考虑所写的元素个数


    2、带第二个输入序列的算法

        有一些算法带有一个beg2迭代器形參。或者同一时候带有beg2end2迭代器形參,来指定他的第二个输入范围。此时,算法完整地制定了两个范围:begend标记第一个输入范围,而beg2end2则标记第二个输入范围。

        与写入dest的算法一样。仅仅带有beg2的算法也假定一beg2開始的序列与begend标记的序列一样大


    二、算法的命名规范

    标准库使用了两种重要的算法命名和重载规范:

        1)第一种模式包含測试输入范围内的元素的算法

        2)另外一种模式应用于对输入范围内元素又一次排序的算法【不是非常理解】


    1、差别带有一个值或一个谓词函数參数的算法版本号

        非常多算法通过检查其输入范围内的元素实现其功能。当中的大部分算法会提供第二个版本号的函数,同意程序猿提供比較或測试函数代替操作符(<==)的使用

        sort(beg,end);
        //带有一个额外的形參,表示用于元素排序的不同运算
        sort(beg,end,comp);

    检查指定值的算法默认使用==操作符。

    系统为这类算法提供另外命名的(而非重载的)版本号:

        find(beg,end,val);
        find_if(beg,end,pred);

        带有谓词函数形參的算法,其名字带有一个_if后缀。当中。find_if算法用于查找一个使谓词函数pred返回非零值的元素。


    2、差别是否实现复制的算法版本号

        不管算法是否检查它的元素值,都可能又一次排列输入范围内的元素。在默认情况下,这些算法将又一次排列的元素写回其输入范围。标准库也为这些算法提供另外命名的版本号,将元素写到指定的输出目标。

    此版本号的算法在名字中加入了_copy后缀:

        reverse(beg,end);
        reverse_copy(beg,end,dest);
    

    //P360 习题11.27
        //仅仅依据这些函数的名字和形參,描写叙述这些算法的功能。
        replace(beg, end, old_val, new_val);
        replace_if(beg, end, pred, new_val);
        replace_copy(beg, end, dest, old_val,new_val);
        replace_copy_if(beg, end, dest, pred,new_val);
    

    //习题11.28
    int main()
    {
        list<int> iList;
        for (list<int>::size_type i = 0; i != 100; ++i)
        {
            iList.push_back(i);
        }
    
        vector<int> vec;
        reverse_copy(iList.begin(),iList.end(),back_inserter(vec));
    
        for (vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter)
        {
            cout << *iter << endl;
        }
    }

    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    Oracle notes
    jQuery笔记
    sql developer 要求enter the full pathname for java.exe
    [Error] WCF: SOAP security negotiation
    Unity
    Windows Form 开发笔记
    WP开发 资料整理
    乔迁新居:http://longwarelive.spaces.live.com/
    2008年1月1日启用 longware@live.cn
    《程序员》杂志揭晓2007软件中国年度评选
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4734668.html
Copyright © 2011-2022 走看看