C++中STL的各类算法使用及实现总结

算法部分主要由头文件<algorithm>,<numeric>和<functional>组成。
<algorithm>是所有STL头文件中最大的一个(尽管它很好理解),它是由一大堆模版函数组成的,可以认为每个函数在很大程度上都是独立的,其中常用到的功能范围涉及到比较、交换、查找、遍历操作、复制、修改、移除、反转、排序、合并等等。

<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作。

STL中算法大致分为四类:
1)非可变序列算法:指不直接修改其所操作的容器内容的算法。
2)可变序列算法:指可以修改它们所操作的容器内容的算法。
3)排序算法:对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
4)数值算法:对容器内容进行数值计算。
以下对所有算法进行细致分类、标明功能并且实现:
 

#define SIZE 1000
#include<iostream>
#include<vector>
#include<algorithm>
#include<functional>
#include<string>
#include<numeric>
using namespace std;

/***************************************1.查找*************************************************/
//在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator,否则返回last
void Fadjacent_find(vector<int>vec){
    vec.push_back(999);
    vector<int>::iterator it=adjacent_find(vec.begin(),vec.end());
    cout<<"The adjacent_find result:"<<*it<<endl;
}

//在有序序列中查找value,找到返回true
void Fbinary_search(vector<int>vec,int value){
    bool result=binary_search(vec.begin(),vec.end(),value);
    cout<<"The binary_search result:"<<result<<endl;
}

//利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。
void Fcount(vector<int>vec,int value){
    int result=count(vec.begin(),vec.end(),value);
    cout<<"The count result:"<<result<<endl;
}

//利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数
bool cmp1(int num){
    return num%1000;
}
void Fcount_if(vector<int>vec){
    int result=count_if(vec.begin(),vec.end(),cmp1);
    cout<<"The count_if result:"<<result<<endl;
}

//功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound
void Fequal_range(vector<int>vec,int value){
    pair<vector<int>::iterator,vector<int>::iterator> result=equal_range(vec.begin(),vec.end(),value);
    cout<<"The equal_range result:"<<*result.first<<"   "<<*result.second<<endl;
}

//利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的Iterator
void Ffind(vector<int>vec,int value){
    vector<int>::iterator result=find(vec.begin(),vec.end(),value);
    cout<<"The find result:"<<&*result<<endl;
}

//在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一个ForwardIterator,
//否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代替等于操作。
void Ffind_end(){
    string str="aacaabbcddefacss";
    string substr="ac";
    string::iterator result=find_end(str.begin(),str.end(),substr.begin(),substr.end());
    for(int i=0;i<str.length();i++){
        cout<<&str[i]<<" is: "<<str[i]<<endl;
    }
    cout<<"The find_end result:"<<&*result<<" is: "<<*result<<endl;
}

//在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。
//第一个序列中的元素第一次出现在第二个序列中的元素
void Ffind_first_of(){
    string str="mnblkjhgfdsac";
    string substr="ca";
    string::iterator result=find_first_of(str.begin(),str.end(),substr.begin(),substr.end());
    cout<<"The find_first_of result:"<<*result<<endl;
}

//它接收一个函数对象的参数作为参数,并使用它来做更复杂的评价对象是否和给出的查找条件相符。
bool cmp2(int value){
    return value>=996;
}
void Ffind_if(vector<int>vec){
    vector<int>::iterator result=find_if(vec.begin(),vec.end(),cmp2);
    cout<<"The find_if result:"<<*result<<endl;
}

//返回的是第一个不小于给定元素value的位置
void Flower_bound(vector<int>vec,int value){
    vector<int>::iterator result=lower_bound(vec.begin(),vec.end(),value);
    cout<<"The lower_bound result:"<<*result<<endl;
}

//返回的是第一个大于给定元素value的位置
void Fupper_bound(vector<int>vec,int value){
    vector<int>::iterator result=upper_bound(vec.begin(),vec.end(),value);
    cout<<"The upper_bound result:"<<*result<<endl;
}

//search算法在一个序列中找另一个序列的第一次出现的位置
void Fsearch(){
    string str="mnblkjhgfdsca";
    string substr="ca";
    string::iterator result=search(str.begin(),str.end(),substr.begin(),substr.end());
    cout<<"The search result:"<<*result<<endl;
}

//search_n
bool cmp3(int i,int j){
    return i==j;
}
void Fsearch_n(){
    int array[]={1,996,996,996,5,5,996,996,6,6,6,7,8,8,9,10};
    vector<int>vec(array,array+16);
    //search_n(s,e,cnt,num);找区间内[s,e)连续cnt个的num返回的是找到的第一个num的迭代器
    vector<int>::iterator result=search_n(vec.begin(),vec.end(),2,996);
    for(int i=0;i<vec.size();i++){
        cout<<"vec["<<i<<"].address:"<<&vec[i]<<" "<<"the num is:"<<vec[i]<<endl;
    }
    cout<<"The first search_n result:"<<&*result<<"  "<<*result<<endl;
    //search_n(s,e,cnt,num,cmp);找区间内[s,e)连续cnt个的num符合cmp()条件的,返回的是找到的第一个num的迭代器
    result=search_n(vec.begin(),vec.end(), 3, 996, cmp3);
    cout<<"The second search_n result:"<<&*result<<"  "<<*result<<endl;
}

/***************************************2.排序*************************************************/
//inplace_merge(vi.begin(),vi.begin()+5,vi.end()),第一个参数为起始,最后一个为末尾,中间为第一个有序序列的元素个数
void Finplace_merge(){
    vector<int> vi{1,5,8,19,200,1,8,56,74,91,100,101,102,103};
    cout<<"before inplace_merge,vi=";
    for_each(vi.begin(),vi.end(),[](int i){cout<<i<<" ";});
    cout<<endl;
 
    inplace_merge(vi.begin(),vi.begin()+5,vi.end());
    cout<<"after inplace_merge,vi=";
    for_each(vi.begin(),vi.end(),[](int i){cout<<i<<" ";});
    cout<<endl;
 
}
/**merge函数的作用是:将两个已经排好序的序列合并为一个有序的序列。
 * 函数参数:merge(first1,last1,first2,last2,result,compare);
 * firs1t为第一个容器的首迭代器,last1为第一个容器的末迭代器;
 * first2为第二个容器的首迭代器,last2为容器的末迭代器;
 * result为存放结果的容器,comapre为比较函数(可略写,默认为合并为一个升序序列)。 
 */
bool cmp4(int iter1,int iter
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值