C++泛型算法

一、不修改容器的算法

1、泛型find
类似于set模板类的find成员函数,但可作用于任何STL顺序容器类;为了使用find函数,容器必须有迭代器,元素必须存储成一种线性序列,这样++操作符才能移动迭代器来遍历整个容器。

find函数的源码定义:

//find.h
template <class Iterator, class T>
Iterator find(Iterator begin, Iterator end, const T &value) {
    while(begin != end && *begin != value) {
        ++begin;
    }
    return begin;
}

从定义中我们可以看出它返回的是要查找的字符的开始位置。 下面通过一个例子来看一下find是怎么使用的:

#include <iostream>
        #include <vector>
        #include <algorithm>
        using namespace std;
        int main()
        {
            vector<char> line;
            cout<<"Enter a line of text:\n";
            char next;
            //输入字符串
            cin.get(next);
            while(next!='\n'){
                line.push_back(next);
                cin.get(next);
            }
            //创建一个迭代器where
            vector<char>::const_iterator where;
            //从头到尾循环查找
            where=find(line.begin(),line.end(),'e');
            vector<char>::const_iterator p;
            cout<<"You entered the following before you entered you first e:\n";
            for(p=line.begin();p!=where;p++) //输出要查找元素之前的内容
                cout<<*p; 
            cout<<endl;
            cout<<"You entered the following after that:\n";
            for(p=where;p!=line.end();p++)
                cout<<*p;
            cout<<endl;
            cout<<"End of demonstration.\n";
            return 0;
        }
        /*
        A line of text.
        I will not!
        */

当输入A line of text.输出如下
这里写图片描述
从输出结果我们可以看出,当find找到查找的数据时返回的是第一个匹配项的位置,我们就可以通过迭代器遍历来输出前面和后面的字符串;
当输入I will not!时,输出如下:
这里写图片描述
当find没有找到匹配项时,返回的是第二个迭代器实参即line.end();

此外常用的不改变容器的泛型函数还有:
ForwardIterator find()、int count()、bool equal()、ForwardIterator1 search()、bool binary_search()。具体函数的用法和时间复杂度可查。

二、会修改容器的算法

template <class T>
    void swap(T& variable, T& variable2)
    //交换 variable1和 variab1e2的值

template<class Forwarditerator, class Forwarditerator2>
    Forwarditerator2 copy( Forwarditeratorl first1, Forwarditeratorl last1Forwarditerator2 first2 Forwarditerator2 last2)
    //前条件:[fiSt1,1ast1]和[ first2,1ast2]这两个范围的长度一样
    //动作:将位置[ first1,1ast1]的元素
    //复制到位置[ first2,1ast210//返回1ast2
    //时间复杂度:与范围[ first,1ast]的长度成正比的线性时间

template<class Forwarditerator class,T>
     Forwarditerator remove( Forwarditerator first, Forwarditerator last,const T& target)
    //从范围[ first,1ast]中删除等于 target的元素
    //容器长度不变
    //等于 target的那些被删除的值被移到范围[fist,1ast]的末尾
    //这个范围有一个迭代器i,使所有有不等于 target的值都在范围[ first,i]中。返回1。
    //时间复杂度:与范围[fist,1ast]的长度成正比的线性时间

template<class Bidirectionaliterator>
     void reverse(Bidirectionaliterator first, Bidirectionaliterator last)
    //逆转范围[ first,1ast]中元素的顺序
    //时间复杂度:与范围[ first,1ast]的长度成正比的线性时间

template<class Randomaccessiterator>
    void random shuffle(Randomaccessiterator first, Randomaccessiterator last)
    //使用一个伪随机数生成器对范围[ first,1ast]中的元素进行随机排序
    //时间复杂度:与范围[ first,1ast]的长度成正比的线性时间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值