美文网首页
标准模版STL-算法

标准模版STL-算法

作者: gpfworld | 来源:发表于2019-03-16 15:08 被阅读0次
    6.算法
(1)算法介绍
(1)什么是算法
    所谓算法就是数据的具体处理方式,在程序中算法的常见组织形式就是
    函数,单个的子函数就是一个小型的算法单元。


(2)c++中涉及的算法有两类
    (1)c++函数库提供的算法函数(现成可用的算法)

        (1)成员算法函数
            所有的容器的都有自己的成员算法函数,比如vector/list/map都提供了
            swap算法函数。

            除此外C++中所有类库提供的类,比如string/array都有成员算法。

            成员算法的特点是,成员算法的操作几乎只与当前类有关。

        (2)全局算法
            c++中实现了大量的全局算法,这些全局算法的特点就是,可以针对很多
            类型的数据操作,几乎都是利用函数模板实现,具有高度的抽象性,与具
            体的数据类型无关。
    
            c++的STL模板库就提供了专门针对容器的全局算法函数。

    (2)自定义算法
        (1)c++编程的工作是什么
            编写各种算法函数,定义类只是实现各种成员算法的封装的一种手段,整个
            c++程序真正核心是各种算法函数。
    

        (2)全局算法和成员算法
            (1)与类相关的就写为成员算法函数
            (2)超脱各种类类型的,就写成全局算法,这一点在讲函数时就已经提到过。


(3)操作STL容器时涉及的算法
    (1)使用容器成员算法
    (2)STL全局算法
    (3)自定义自己的针对这些容器操作的算法函数(成员/全局)
    
        也就是说我们可以通过容器提供的迭代器遍历,自己实现对容器的增加/删除/查找/
        修改/排序等算法,但不提倡这样的做法。

    注意:如果使用STL提供的外部算法函数的话,必须包含<algorithm>头文件。


(2)STL全局算法大致有三类

(1)查找类
    find(),find_end(),adjacent_find(),count(), mismatch(),

    seaech(), equal()。
(2)修改类
    swap(), copy(), transform(). replace(), remove(), reverse(),
    rotate(), fill(), random_shffle()。

(3)排序类
    sort() stable_sort(), binary_search(), merage(), min(), 
    max()。      
    

(3)查找类算法
   (1)常用全局算法函数

find():只有一个函数模板
    函数模板:
    template <class InputIterator, class T>
    InputIterator find ( InputIterator first, InputIterator last, const T& value );
    
    功能:查找[first,last)之间是否有value,没有就返回end()。
    
find_if():只有一个模板
    template <class InputIterator, class Predicate>
    InputIterator find_if ( InputIterator first, InputIterator last, Predicate pred );
    功能:根据自定义函数进行比较查找。由于该函数默认只允许一个参数。
        为了让比较更为灵活,往往需要定义函数类类型(或者利用仿函数和绑定实现也可以,
        具体请看例子)。
    
find_end():提供两个函数模板
    template <class ForwardIterator1, class ForwardIterator2>
        ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,
                           ForwardIterator2 first2, ForwardIterator2 last2 );
    功能:在[ForwardIterator1,ForwardIterator2)查找[first2, last2)中
        任何一个元素出现的最后位置,返回指向该位置的迭代器。


    template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
        ForwardIterator1 find_end ( ForwardIterator1 first1, ForwardIterator1 last1,
                           ForwardIterator2 first2, ForwardIterator2 last2.
                           BinaryPredicate pred);
    功能:在[ForwardIterator1,ForwardIterator2)查找[first2, last2),但是
        多了一个参数,可以用于传递一个比较函数的地址。

find_first_of:功能与模板和find_end相似,只是返回的是第一次出现的位置的
    迭代器。

    
adjacent_find():有两个模板
    template <class ForwardIterator>
        ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last );
    功能:查询相邻两个元素是否相等,如果相等就返回指向第一个元素的
        迭代器。    
        
    template <class ForwardIterator, class BinaryPredicate>
        ForwardIterator adjacent_find ( ForwardIterator first, ForwardIterator last,
                              BynaryPredicate pred );
    功能:查询相邻两个元素是否相等,如果相等就返回指向第一个元素的
        迭代器,可以提供自己定义的比较函数。

count():只有一个函数模板
    template <class InputIterator, class T>
        typename iterator_traits<InputIterator>::difference_type
            count ( ForwardIterator first, ForwardIterator last, const T& value );
    功能:在[ForwardIterator1,ForwardIterator2)查找value的出现的次数并返回。    
    
   (2)例子:           
    #include <iostream>
    #include <algorithm>
    #include<iterator>
    #include<list>

using namespace std;
class Student {
public:
        Student(const string name=" ", const string num=" "):name(name), num(num) { }

        string getname() const { return name; }
        string getnum() const { return num; }
private:
        string name;
        string num;
};
class Compare {
public:
        Compare(const Student *stu, int comptype):stu(stu), comptype(comptype) {  }
        bool operator()(Student *op) {
                if(1 == comptype) {
                        return(op->getname()==stu->getname());
                } else if(2 == comptype) {
                        return(op->getnum()==stu->getnum());
                }
        }
private:
        const Student *stu;
        int comptype;
};
bool compare(Student *&op) {
        return (op->getname() == "name1");
}

bool compare1(Student *&op1, Student *&op2) {
        return (op1->getname() == op2->getname());
}

bool compare2(Student *&op1, Student *&op2) {
        if(op1 == op2) return true;
        else if(op1->getname() == op2->getname()&&op1->getnum() == op2->getnum()) {
                return true;
        } else return false;
}
void print_find_element(std::list<Student *>::iterator it, std::list<Student *>::iterator end) {
        if(it != end) {
                cout <<"查找结果:" <<(*it)->getname()<<"   "<<(*it)->getnum()<<endl;
        } else cout<<"没有找到"<<endl;
}

int main(void)
{
        Student *stu[10] = {NULL};
        std::list<Student *>::iterator it;//定义一个空的list,存放的数据类型伟Student *

        /* 初始化对象数组 */
        for(int i=0; i<sizeof(stu)/sizeof(stu[0]); i++) {
                stu[i] = new Student(string("name")+string(1, i+'0'), string("11")+string(1, i+'0'));
        }
        /* 利用对象数组初始化list */
        std::list<Student *> v1(stu, stu+sizeof(stu)/sizeof(stu[0]));

        cout<<"使用find查找,由于容器存放的是对象地址,所以需要为对象地址查找 "<<endl;
        it = find(v1.begin(), v1.end(), stu[1]);
        print_find_element(it, v1.end());

        cout<<"\n使用find_if查找,自定义比较函数,在函数中确定查找方式为按名字查找 "<<endl;
        it = find_if(v1.begin(), v1.end(), compare);
        print_find_element(it, v1.end());

        cout<<"\n使用find_if查找,定义比较函数类类型,重写()后按照学号查找 "<<endl;
        it = find_if(v1.begin(), v1.end(), Compare(new Student("wwwww", "111"), 2));
        print_find_element(it, v1.end());

        cout<<"\n使用find_first_of查找[stu+2, stu+5)中某个在list中出现的最开始的位置,自定义比较函数"<<endl;
        it = find_first_of(v1.begin(), v1.end(), stu+2, stu+5,compare1);
        print_find_element(it, v1.end());

        cout<<"\n使用adjacent_find在list中使用自定义比较函数查找否有相等的相邻元素"<<endl;
        it = adjacent_find(v1.begin(), v1.end(), compare2);
        print_find_element(it, v1.end());
    
        return 0;
}


(4)修改类算法
  (1)常见函数
swap():只有一个函数模板
    template <class T> void swap ( T& a, T& b );
    功能:交换两个a和b两个容器中的内容。
    
copy():只有一个模板
    template <class InputIterator, class OutputIterator>
     OutputIterator copy ( InputIterator first, InputIterator last, OutputIterator result );
    功能:将[InputIterator, OutputIterator)内容复制到result开始的位置。        
        但是被复制的容器不能为空,比如使用vector和list为空时,必须
        是使用resize函数预先开辟元素空间,如果开辟的空间不够只能复制
        一部分,如果空间过多,会导致无效内容的存在。

    使用copy函数只能实现浅拷贝,如果容器存放的是指针,那么经过copy复制后,
    两个容器里面存放的所有指针指向的都是相同的数据空间。


transform():有两个模板,实现对容器中数据进行指定操作。

    前面提到,copy只能浅拷贝,如果希望实现深拷贝,我们就需要使用transform
    函数。之所以能够实现深拷贝,是因为我们可以通过指定自定义的函数实现具体
    的拷贝过程。

    对transform来说,同样要求被复制的容器不能为空,比如vector和list,必须
    是使用resize函数开辟元素空间,如果开辟的空间不够只能复制一部分,如果空
    间过多,会导致无效内容存在。

    template < class InputIterator, class OutputIterator, class UnaryOperator >
        OutputIterator transform ( InputIterator first1, InputIterator last1,
                         OutputIterator result, UnaryOperator op);
    功能:对[first1, last1)之间内容做指定的op操作,将结果转存到result容器中,
        

    template < class InputIterator1, class InputIterator2,
            class OutputIterator, class BinaryOperator >
        OutputIterator transform ( InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, OutputIterator result,
                         BinaryOperator binary_op );
    功能:对[first1, first1)和first2开时的内容进行指定的op运算,结果转存到 
        result中,要求用于做运算的两个容器内容要想等,否者会抛出异常。
    

replace():只有一个模板
    template < class ForwardIterator, class T >
        void replace ( ForwardIterator first, ForwardIterator last,
                    const T& old_value, const T& new_value );
    功能:将[first, last)之间old_value替换为new_value。


remove():只有一个模板
    template < class ForwardIterator, class T >
        ForwardIterator remove ( ForwardIterator first, ForwardIterator last,
                       const T& value );
    功能:将[first, last)之间等于value的数据删除。
    
    
remove_if():只有一个模板
    template < class ForwardIterator, class Predicate >
     ForwardIterator remove_if ( ForwardIterator first, ForwardIterator last,
                          Predicate pred );
    功能:同remove,但是可以按照自定义的pred的要求删除。
        

reverse():只有一个模板
    template <class BidirectionalIterator>
    void reverse ( BidirectionalIterator first, BidirectionalIterator last);
    功能:将[first, last)之间元素顺序颠倒。


rotate():只有一个模板
    template <class ForwardIterator>
    void rotate ( ForwardIterator first, ForwardIterator middle,
            ForwardIterator last );
    功能:将[middle,last)元素旋转到开始位置,middle为第一个元素,将
        [first,middle)元素旋转到后面。
        比如123456789,以4为middle进行旋转后为456789123。

fill():只有一个模板
    template < class ForwardIterator, class T >
    void fill ( ForwardIterator first, ForwardIterator last, const T& value ); 
    功能:使用value填充[first,last)之间内容。


random_shuffle():有两个模板
    template <class RandomAccessIterator>
    void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last );
    功能:将[first,last)之间的内容按照默认算法进行随机排序。

    template <class RandomAccessIterator, class RandomNumberGenerator>
    void random_shuffle ( RandomAccessIterator first, RandomAccessIterator last,
                    RandomNumberGenerator& rand );
    功能:将[first,last)之间的内容按照rand指定的随机序列号进行随机
        重新排序,需要自己实现rand函数。
        
        但是这个函数只能对数组/数组类型的容器如vector操作,对list操作
        无效,因为list等其它容器不支持随机访问。


 (2)例子
#include <iostream>
#include <algorithm>
#include<iterator>
#include<list>

using namespace std;
class Student {
public:
        Student(const string name=" ", const string num=" "):name(name), num(num) { }

        void setname(const string name) { this->name = name; }
        void setnum(const string num) { this->num=num; }
        string getname() const { return name; }
        string getnum() const { return num; }
private:
        string name;
        string num;
};
class Trans_operate {
public:
        Trans_operate(const string str=" "):str(str) {  }
        Student *operator()(Student *op) {
                Student *tmp = new Student(op->getname()+str, op->getnum()+str);
                return tmp;
        }
private:
        const string str;
};

class Remove_operate {
public:
        Remove_operate(const Student *stu, int optype):stu(stu), optype(optype) {  }
        bool operator()(Student *op) {
                if(1 == optype) return(op->getname()==stu->getname());
                else if(2 == optype) return(op->getnum()==stu->getnum());
                else return false;
        }
private:
        const Student *stu;
        int optype;
};

int random_fun(int i) {
        return (rand()%i);
}

/* 使用迭代器便利map */
template <class Iter> void show_list(Iter first, Iter last) {
        for( ;first!=last; first++) {
                cout << (*first)->getname() <<endl;
        }
}

int main(void)
{
        Student *stu[10] = {NULL};

        /* 初始化对象数组 */
        for(int i=0; i<sizeof(stu)/sizeof(stu[0]); i++) {
                stu[i] = new Student(string("name")+string(1, i+'0'), string("11")+string(1, i+'0'));
        }

        /* 利用对象数组初始化list */
        std::list<Student *> l1(stu, stu+sizeof(stu)/sizeof(stu[0]));
        std::list<Student *> l2;
        cout<<"\n交换l1和l2"<<endl;
        swap(l1, l2);
        if(!l1.empty()) {
                cout<<"显示l1"<<endl;
                show_list(l1.begin(), l1.end());
        }
        else cout<<"l1是空的"<<endl;
        if(!l2.empty())  {
                cout<<"显示l2"<<endl;
                show_list(l2.begin(), l2.end());
        }
        else cout<<"l2是空的"<<endl;

        cout<<"\n交换l1和l2后,l1变成了空,将l2的部分内容复制会l1"<<endl;
        cout<<"但是由于l1变成了空,需要使用resize函数开辟需要的元素空间"<<endl;
        l1.resize(l2.size()-2);
        copy(++l2.begin(), --l2.end(), l1.begin());
        cout<<"显示l1"<<endl;
        show_list(l1.begin(), l1.end());
        cout<<"显示l2"<<endl;
        show_list(l2.begin(), l2.end());

        cout<<"\n将l1中的对象深拷贝到l3中,需要自定义操作函数类"<<endl;
        cout<<"要求l3容器不能为空"<<endl;
        std::list<Student *> l3(l1.size());
        transform(l1.begin(), l1.end(), l3.begin(), Trans_operate("**"));

        cout<<"\n将l3中的[begin(), ++begin())替换l3begin()开始的元素"<<endl;
        replace(l1.begin(), l1.end(), *(++l1.begin()), *(++l3.begin()));
        cout<<"显示l1"<<endl;
        show_list(l1.begin(), l1.end());

        cout<<"\n按照条件删除元素"<<endl;
        remove_if(l1.begin(), l1.end(), Remove_operate(new Student("name4", "111"), 1));
        cout<<"显示l1"<<endl;
        show_list(l1.begin(), l1.end());

        cout<<"\n将l1[++++++l1.begin(), l1.end())的元素进行反转"<<endl;
        reverse(++++++l1.begin(), l1.end());
        cout<<"显示l1"<<endl;
        show_list(l1.begin(), l1.end());

        cout<<"\n将l2[l2.begin(), l2.end())的元素以++++++l2.begin()为中心进行rotate"<<endl;
        rotate(l2.begin(), ++++++l2.begin(), l2.end());
        cout<<"显示l2"<<endl;
        show_list(l2.begin(), l2.end());

        cout<<"\n将l2中[++++++l2.begin(), ------l2.end())使用new Student(\"wwwww\", \"999\")填充"<<endl;
        fill(++++++l2.begin(), ------l2.end(), new Student("wwwww", "999"));
        cout<<"显示l2"<<endl;
        show_list(l2.begin(), l2.end());

        ptrdiff_t (*p_myrandom)(ptrdiff_t) = random_fun;
        cout<<"\n将stu中的元素按照自定义的方式随机化"<<endl;
        random_shuffle(stu, stu+sizeof(stu)/sizeof(stu[0]), p_myrandom);
        cout<<"显示stu"<<endl;
        show_list(stu, stu+sizeof(stu)/sizeof(stu[0]));

        return 0;
}

(5)排序相关的算法
(1)常见函数

sort():有两个模板
    template <class RandomAccessIterator>
    void sort ( RandomAccessIterator first, RandomAccessIterator last );
    功能:将[first,last)之间的内容进行默认的升序排序,但是注意,只有
        基本类型有被提供默认的升序排序。
    
    template <class RandomAccessIterator, class Compare>
    void sort ( RandomAccessIterator first, RandomAccessIterator last, Compare comp );
    功能:将[first,last)之间的内容进行自定义的排序,需要提供比较函数的
        函数对象。特别是如果容器中存放的类类型的数据来说,就必须提
        供自定义的比较函数对象,否者会导致编译不通过。
    
   注意:
    由于sort全局算法函数只支持随机迭代器,所以sort只能对数组和数组类型
    的容器比如vetor进行排序。
    
    如果希望对list按照自定义继续宁排序,需要调用list自己成员函数sort。
    
    对于关联容器map来说,只能在存入元素的时候进行排序,寻找一个合适
    的位置后将元素插入,所以只能在插入的时候排序,不能进行独立的排序。
    

stable_sort():两个模板,与sort功能与参数同,唯一的区别是遇到相等元素时
    不会对其进行交换。

search():有两个模板
    template <class ForwardIterator1, class ForwardIterator2>
    ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
                         ForwardIterator2 first2, ForwardIterator2 last2 );
    功能:在[firs,last)之间查询有没有[first,last2)元素序列,有的话,返回
        第一次出现的迭代器。注意与find区别,search查找的是一整块序列,
        而find查找的是序列中的一个或者元素有没有在容器中出现。           

    template <class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
    ForwardIterator1 search ( ForwardIterator1 first1, ForwardIterator1 last1,
                         ForwardIterator2 first2, ForwardIterator2 last2.
                         BinaryPredicate pred );
    功能:与上同,但是可以提供带两个参数的自定义比较函数。具体查阅函数手册

binary_search():二分法查找,有两个模板
    template <class ForwardIterator, class T>
    bool binary_search ( ForwardIterator first, ForwardIterator last,
                   const T& value );
    功能:在[first, last)之间搜索value,找到返回true,失败返回false
        与前面讲解find_if函数功能基本相同,只是find_if如果成功,返回
        的是指向找到元素的迭代器,失败则返回end()。

    template <class ForwardIterator, class T, class Compare>
    bool binary_search ( ForwardIterator first, ForwardIterator last,
                   const T& value, Compare comp );

    指定比叫函数时,比较函数格式如下:
        bool myfunction (int op1,int op2) { return op1>op2); }
    其中op2时需要查找的元素。
        
    功能:与上同,但是可以指定自定义比较函数。比较函数格式请查阅手册

merge():两个模板
    template <class InputIterator1, class InputIterator2, class OutputIterator>
    OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result );
    功能:将[first1, last1)和[firsr2, last2)之间的内容合并,合并时会
        按照默认排序函数进行排序,这只能针对基本类型操作。

    template <class InputIterator1, class InputIterator2,
        class OutputIterator, class Compare>
    OutputIterator merge ( InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result, Compare comp );
    功能:同上,但是可以指定自定义的比较函数。



    备注:
    list也提供了一个属于自己的merge成员函数,利用该函数可以将其它链表合并到    
    自己中。使用全局的merge可以将两个链表合并到第三个链表中。

    这二者还有一个区别就是,list的merge函数合并成功后,被合并的list会被清空,
    但是全局的merge函数实现合并操作后,被合并的两个list不会被清空。


min():经过比较后,返回最小值,有两个模板。
    template <class T> const T& min ( const T& a, const T& b );
    功能:返回最小值,调用默认比较函数(只对基本类型有效)。        

    template <class T, class Compare>
    const T& min ( const T& a, const T& b, Compare comp );
    功能:同上,可以提供自定义比较函数,对类类型对象操作时,必须使用
        这个模板,因为必须指定比较函数。
    
max():功能与模板同min,只是返回的是最大的值。

        
   (2)演示例子
#include <iostream>
#include <algorithm>
#include<iterator>
#include<list>
#include<string.h>
#include<stdio.h>

using namespace std;
class Student { 
public:
        Student(const string name=" ", const string num=" "):name(name), num(num) { } 

        void setname(const string name) { this->name = name; }
        void setnum(const string num) { this->num=num; }
        string getname() const { return name; }
        string getnum() const { return num; }
private:
        string name;
        string num;
};   

class Compare {
public:
        Compare(int cmptype, int cmpoder):cmpoder(cmpoder), cmptype(cmptype) {  }
        /* 如果是二分法binary_search函数调用比较函数,那么op2表示需要被查找的元素 */
        bool operator()(Student *op1, Student *op2) {
                cout <<op1<<endl;
                cout <<op2<<endl;
                cout <<op1->getname()<<endl;
                cout <<op2->getnum()<<endl;
                if(1 == cmptype) {//按照名字排序
                        if(1 == cmpoder) {
                                return(op1->getname() > op2->getname());
                        } else if(2 == cmpoder) {
                                return(op1->getname() < op2->getname());
                        } else if(3==cmpoder) return(op1->getname() == op2->getname());
                }
                else if(2 == cmptype) {//按照学号排序
                        if(1 == cmpoder) {
                                return(op1->getnum() > op2->getnum());
                        } else if(2 == cmpoder) {
                                return(op1->getnum() < op2->getnum());
                        } else if(3==cmpoder) return(op1->getnum() == op2->getnum());
                } else return false;
        }
private:
        int cmpoder;
        int cmptype;
};      
        
/* 使用迭代器便利map */
template <class Iter> void show_list(Iter first, Iter last) {
        for( ;first!=last; first++) {
                cout << (*first)->getname() << "   "<<(*first)->getnum()<<endl;
        }
}
int main(void)
{
        Student *stu[10] = {NULL};

        /* 初始化对象数组 */
        for(int i=0; i<sizeof(stu)/sizeof(stu[0]); i++) {
                stu[i] = new Student(string("name")+string(1, i+'0'), string("11")+string(1, i+'0'));
        }

        /* 利用对象数组初始化list */
        std::list<Student *> l1(stu, stu+sizeof(stu)/sizeof(stu[0]));

        cout<<"\n对stu的内容按照要求排序"<<endl;
        sort(stu, stu+sizeof(stu)/sizeof(stu[0]), Compare(2, 2));
        show_list(stu, stu+sizeof(stu)/sizeof(stu[0]));

        cout<<"\n全局sort不能对list进行排序,对list排序需要调用list的成员函数sort"<<endl;
        l1.sort(Compare(1, 1));
        show_list(l1.begin(), l1.end());

        cout<<"\n在l2中搜索[++++l1.begin(), ------l1.end())区间的内容"<<endl;
        std::list<Student*>::iterator it;
        it = search(l1.begin(), l1.end(), ++++l1.begin(), ------l1.end(), Compare(2, 3));
        if(it!=l1.end()) {
                cout <<"找到,第一个元素是:"<<endl;
                cout <<(*it)->getname()<<"  "<<(*it)->getnum() <<endl;
        }

        cout<<"\n使用二分法在l2中按照要求查找new Student(\"name4\", \"111\")"<<endl;
        bool ret = binary_search(l1.begin(), l1.end(), new Student("name4", "111"), Compare(2, 1));
        cout << "ret = " << ret << endl;
        if(ret) cout <<"找到"<<endl;
        else cout <<"未找到"<<endl;

        cout << "\n使用全局merge函数,将l1和l2合并到l3中,自定义合并后的排序顺序 " << endl;
        std::list<Student *> l2(++++l1.begin(), ------l1.end());
        std::list<Student *> l3(l1.size()+l2.size());
        Student *stu3[13];
        merge(l1.begin(), l1.end(), l2.begin(), l2.end(), l3.begin(), Compare(2, 2));
        show_list(l3.begin(), l3.end());

        cout << "\n调用l1的merge函数,将l2合并到自己空间中,使用自定义排序函数 " << endl;
        l1.merge(l2, Compare(2, 2));
        show_list(l1.begin(), l1.end());

        cout << "\n比较*l1.begin(), *(++++l1.begin()谁最小,使用自定义比较函数比较"<<endl;
        Student *p = min(*l1.begin(), *(++++l1.begin()), Compare(2, 2));
        cout << p->getname()<<"   "<<p->getnum()<<endl;

        cout << "\n比较*l1.begin(), *(++++l1.begin()谁最大,使用自定义比较比较"<<endl;
        p = max(*l1.begin(), *(++++l1.begin()), Compare(2, 2));
        cout << p->getname()<<"   "<<p->getnum()<<endl;

        return 0;
}

相关文章

网友评论

      本文标题:标准模版STL-算法

      本文链接:https://www.haomeiwen.com/subject/rflsmqtx.html