标准库算法实现一

1.max(x,y)

2.find(b,e,t)

3.find_if(b,e,p)

4.search(b,e,b2,e2)

5.remove(b,e,t)

6.copy(b,e,d)

7.remove_copy(b,e,d,t)

8.remove_copy_if(b,e,d,p)

9.replace(b,e,x,y)

10.swap(x,y)

11.reverse(b,e)

12. binary_search(b,e,x)

13.split(s)

14.equal(b,e,b2)

15.transform(b,e,d,f)

16.partition(b,e,p)

17.accumulate(b,e,t)

1.max(x,y)
template <class T>
T max(const T& x,const T& y)
{
    return x<y?y:x;
}

2.find(b,e,t)
template <class In,class X>
In find(In begin,In end,const X& x)
{
    //In is an iterator or const_iterator
    while(begin!=end && *begin!=x)
        ++begin;
    return begin;
}

3.find_if(b,e,p)
template <class In>
In find_if(In begin,In end,p)
{
    while(begin!=end)
    {
        if(p(*begin))
        {
            return begin;
        }
        ++begin;
    }
}

4.search(b,e,b2,e2)
template <class In>
In search(In b,In e,In b2,In e2)
{
    int k=0;
    In start;
    while(b2!=e2)
    {
        while(b!=e)
        {
            if(k==0 && *b==*b2)
            {
                start=b;
                ++b;
                ++k;
                break;
            }
            else if(*b==*b2)
            {
                ++b;
                break;
            }
            ++b;
        }
        ++b2;
    }
    return start;
}

5.remove(b,e,t)
//put the element that are !=t in front of the container
template <class X>
void sw(X& x,X& y)
{
    X temp=x;
    x=y;
    y=temp;
}
template <class In,class X>
In remove(In begin,In end,X& x)
{
    while(begin!=end)
    {
        if(*begin==x)
        {
            --end;
            while(*end==x)
                --end;

            sw(*begin,*end);
        }
        ++begin;
    }
    return end;
}

6.copy(b,e,d)
template <class In,class Out>
Out copy(In begin,In end,Out dest)
{
    while(begin!=end)
        *dest++=*begin++;
    return dest;
}

7.remove_copy(b,e,d,t)
template <class In,class Out,class X>
Out remove_copy(In begin,In end,Out dest,const X& x)
{
    while(begin!=end)
    {
        if(*begin==x)
            *d++=*begin;
        ++begin;
    }
    return dest;
}

8.remove_copy_if(b,e,d,p)
template <class X>
bool fun(const X& x)
{
    return *x>10;
}
template <class In,class Out>
Out remove_copy_if(In begin,In end,Out dest,bool fun(const In&))
{
    while(begin!=end)
    {
        if(!fun(begin))
            *dest++=*begin;

        ++begin;
    }
    return dest;
}

9.replace(b,e,x,y)
template <class In,class X>
void replace(In begin,In end,const X& x,const X& y)
{
    while(begin!=end)
    {
        if(*begin==x)
            *begin=y;
        ++begin;
    }
}
10.swap(x,y)
template <class X>
void swap(X& x,X& y)
{
    X temp;
    temp=x;
    x=y;
    y=temp;
}

11.reverse
template <class In>
void reverse(In begin,In end)
{
    while(begin!=end)
    {
        --end;
        if(begin!=end)
        {
            swap(*begin++,*end);
        }
    }
}

12.binary_search
template <class In,class X>
In binary_search(In begin,In end,const X& x)
{
    //the function is return a iterator,and if not find
    //we let it return the second arguments(end)
    while(begin!=end)
    {
        In mid=begin+(end-begin)/2;
        if(*mid<x)
            end=mid;
        else if(x<*mid)
            begin=mid+1;
        else
            return mid;
    }
    return end;
}

13.split
/*
bool space(char c)
{
    return isspace(c);
}
bool not_space(char c)
{
    return !isspace(c);
}
*/
template <class Out>
void split(const string& s,Out os)
{
    typedef string::const_iterator iter;
    iter i=s.begin();
    iter e=s.end();
    while(i!=e)
    {
        i=find_if(i,e,not_space);
        iter j=find_if(i,e,space);
        if(i!=e)
            *os++=string(i,j);
        i=j;
    }
}

14.equal(b,e,b2)
template <class In>
bool equal(In beg,In end,In beg2)
{
    while(beg!=end)
    {
        if(*beg!=*beg2)
        {
            return false;
        }
        ++beg;
        ++beg2;
    }
    return true;
}

15.transform(b,e,d,f)
template <class In,class Out>
Out transform(In beg,In end,Out beg2,,bool fun(In))
{
    while(beg!=end)
    {
        if(fun(beg))
        {
            *beg2=*beg;
            ++beg;
        }
        ++beg2;
        ++beg;
    }
}

16.partition(b,e,p)
/*
 *b,e is a bothway iterator;if p return true put the elements into the former of the container,else into the later;
 *return a iterator direct to the first dissatified elements.
*/
template <class Y>
bool fun(Y& x)
{
    return *x<6;
}
template <class X>
void sw(X& x,X& y)
{
    X temp=x;
    x=y;
    y=temp;
}
template <class In>
In partition(In beg,In end,bool fun(In&))
{
    while(beg!=end)
    {
        while(fun(beg))
        {
            ++beg;
            if(beg==end)
                return beg;
        }

        do{
            --end;
            if(beg==end)
                return beg;
        }while(!fun(end));

        sw(*beg,*end);
        ++beg;
    }
    return beg;
}

17.accumulate(b,e,t)
template <class In,class X>
X accumulate(In beg,In end,X x)
{
    while(beg!=end)
    {
        x+=*beg;
        ++beg;
    }
    return x;
}
时间: 2024-12-16 12:35:46

标准库算法实现一的相关文章

利用标准库算法求解排列组合

以前求序列的排列时,最常用的方法就是递归回溯,现在发现其实像这样有特定算法的重复性工作是可以在STL标准库中找到答案的. 在STL的变序性算法中,有两个用于排列元素的算法分别如下: bool next_permutation(Iterator beg,Iterator end) bool prev_permutation(Iterator beg,Iterator end) 这两个算法的功能也很简单,next_permutation()会改变区间(beg,end)内的元素次序,使它们符合"下一个

STL标准库-算法-常用算法

摘要: 摘要: 摘要: 技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 介绍11种STL标准库的算法,从这11种算法中总结一下算法的基本使用 1.accumulate() 累加 2.for_each() for一段区间 做你指定的行为 3.replace(), replace_if(), replace_copy() 替换函数 4.count(), count_if() 计数 5.find() 查找 6.sort() 排序 7.binary_search()查看元素是否在

将函数对象用于标准库算法

1 #include<iostream> 2 #include<vector> 3 4 bool GT6(const int &s){ 5 return s>=6; 6 } 7 int main(){ 8 int a[]={0,1,2,3,4,5,6,7,8,9}; 9 std::vector<int>vec(a,a+10); 10 std::cout<<count_if(vec.begin(),vec.end(),GT6)<<st

4.Python3标准库--算法

(一)functools:管理函数的工具 import functools ''' functools模块提供了一些工具来管理或扩展和其他callable对象,从而不必完全重写 ''' 1.修饰符 from functools import partial ''' functools模块提供的主要工具就是partial类,可以用来包装一个有默认参数的callable对象. 得到的对象本身就是callable,可以把它看作是原来的参数. ''' # 举个栗子 def foo(name, age,

程序设计语言-标准库概述

1 认识标准库 没有任何一个重要程序只用某种赤裸裸的程序设计语言写出的:首先总要开发出一组支持库,这也形成了进一步工作的基础. 2 第一个程序 #include<iostream>  //指编译器包含位于iostream里的标准流I/O功能的声明 int main() //定义一个main()函数,该函数没有参数,也不做任何事情 { std::cout<<"hello,world!\n"; //字符串文字量"hello,world!\n"将被

《C++ Primer》第II部分:C++标准库

<C++ Primer>第II部分:C++标准库 前言 把<C++ Primer>读薄系列笔记.本篇为第II部分C++标准库,包含全书第8-12章重难点: IO库 顺序容器 范型算法 关联容器 动态内存 修订版课后题解见GitHub仓库cpp-primer-workbook. IO库 IO类继承机制:ifstream和istringstream继承自istream,ofstream和ostringstream都继承自ostream 宽字符IO类:在函数和类型前加前缀w,如wcin.

14.8.2. 标准库定义的函数对象

#include<iostream> #include<string> #include<vector> using namespace std; /* 这个类很简单,它定义了一个操作:函数调用操作符,该操作符有一个形参 并返回形参的绝对值. 函数调用操作符必须声明为成员函数.一个类可以定义函数调 用操作符的多个版本,由形参的数目或类型加以区别 */ struct absInt { int operator()(int val) { return val<0 ?

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

【C++标准库】STL算法

使用C++标准库的算法,需包含头文件<algorithm> STL算法用于处理一个或多个iterator区间,第一个区间通常以起点和终点表示,其他区间则多数情况下只需提供起点足矣,其终点可以根据第一区间的元素数量推导出来.调用者需保证区间的有效性.STL算法命名时,引入了两种特殊的后缀: STL算法分类 非更易型算法(nomodifying algorithm) 更易型算法(modifying algorithm) 移除型算法(removing algorithm) 变序型算法(mutatin