STL算法总结之查找算法示例

Posted 学霸的一天

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL算法总结之查找算法示例相关的知识,希望对你有一定的参考价值。

STL算法总结之查找算法示例


1.adjacent_find:

 // 所有容器适用(线性的)
 adjacent_find(begin,end);
 adjacent_find(begin,end,Predicate);

  在范围[first,last)之间寻找第一次出现的两个连续相等的元素,如果存在,则返回指向第一个元素迭代器,否则返回last.还可以使用自己定义的二元断言(就是自定义的判断方法)

#include<vector>
#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
/**
  自定义的方法,判断的相等的条件是
  i=j*2
*/
bool myfunction (int i, int j){
    return (i==j*2);
}
/**
  //所有容器适用(线性的)
  adjacent_find(b,e);
  adjacent_find(b,e,p);

  在范围[first,last)之间寻找第一次出现的两个
  连续相等的元素,如果存在,则返回指向第一个元素迭代器,否则返回last.
  还可以使用自己定义的判断方法
*/
int main(){
    int myints[] = {10,20,30,30,40,20,10,20};
    //将数组中的元素录入myvector
    vector<int> myvector (myints,myints+8);
    vector<int>::iterator it;//迭代器

    printf("初始元素\n");
    for(it=myvector.begin();it!=myvector.end();++it)
        cout<<*it<<" ";
    cout<<endl;

    //使用默认的比较方法
    it = adjacent_find (myvector.begin(), myvector.end());

    if (it!=myvector.end())
        cout << "第一个连续的元素是: " << *it << endl;

    //使用自定义的比较方法
    it = adjacent_find (myvector.begin(), myvector.end(), myfunction);

    if (it!=myvector.end())
        cout << "第二个连续的元素是: " << *it << endl;

    return 0;
}
/*****
Output
    初始元素
          10 20 30 30 40 20 10 20
          第一个连续的元素是: 30
          第二个连续的元素是: 40
*/

2.binary_search和includes:

binary_search()  //二分查找,返回bool值,
binary_search(begin,end,value);
binary_search(begin,end,value,cmp);

includes()  //包含查找,判断容器是否是包含关系,返回bool值。
includes(begin1,end1,begin2,end2);
includes(begin1,end1,begin2,end2,cmp);
binary_search():如果在[first,end)范围内存在任一元素和val相等,则返回true,
否则返回false.必须是已经排序的容器

includes():两个区间必须已经排序,判断区间1是否包含区间2,范围同样是[first,end)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<algorithm>
using namespace std;
/**
//所有容器适用(O(log(n)))
已序区间查找算法
binary_search()  //二分查找,返回bool值,
binary_search(begin,end,value);
binary_search(begin,end,value,cmp);

includes()  //包含查找,判断容器是否是包含关系,返回bool值。
includes(begin1,end1,begin2,end2);
includes(begin1,end1,begin2,end2,cmp);
*/
bool myfunction (int i,int j){
     return (i<j);
}
int main(){
    int myints[] = {1,2,3,4,5,4,3,2,1};
    vector<int> v(myints,myints+9);  // 1 2 3 4 5 4 3 2 1

    //使用默认的比较
    sort (v.begin(), v.end());

    cout << "查找 3...  ";
    if (binary_search (v.begin(), v.end(), 3))
    cout << "发现!\n"; else cout << "没有发现.\n";

    //使用自定义的比较
    sort (v.begin(), v.end(), myfunction);

    cout << "查找 6... ";
    if (binary_search (v.begin(), v.end(), 6, myfunction))
        cout << "发现!\n"; else cout << "没有发现.\n";
    cout<<endl;
/**----------------------------includes()容器包含查找---------------------------**/
    int container[] = {5,15,10,25,20,35,30,50,45,40};
    int continent[] = {40,30,20,10};

    sort (container,container+10);
    sort (continent,continent+4);

    //使用默认的比较
    if ( includes(container,container+10,continent,continent+4) )
        cout << "容器container 包含容器continent!" << endl;

    //使用自定义的比较
    if ( includes(container,container+10,continent,continent+4, myfunction) )
        cout << "容器container 包含容器continent!" << endl;

    return 0;
}

/**
Output
    查找 3...  发现!
    查找 6... 没有发现.

    容器container 包含容器continent!
    容器container 包含容器continent!
*/

3.count和count_if:

count:
   count (begin,end,value);
count_if:
   count_if (begin,end,predicate);

关联容器的等效成员函数
    set.count
    multiset.count
    map.count
    multimap.count

 count:这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果
 count_if:返回区间中满足指定条件的元素数目

#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
/**
  奇数
*/
bool IsOdd (int i){
    return i&1;
}
int main(){
    int mycount;

    // 数组计数元素
    int myints[] = {10,20,30,30,20,10,10,20};  //8个元素
    mycount = (int) count (myints, myints+8, 10);
    cout << "10 出现 " << mycount << " 次.\n";

    //新建一个vector
    vector<int> myvector (myints, myints+8);
    mycount = (int) count (myvector.begin(), myvector.end(), 20);//有几个20
    cout << "20 出现 " << mycount  << " 次.\n";

    /****************
    Output:
    10 出现 3 次.
    20 出现 3 次.
    ****************/

    //清除vector
    myvector.clear();
    for (int i=1; i<10; i++) myvector.push_back(i); // myvector: 1 2 3 4 5 6 7 8 9

    cout<<"\nmyvector: 1 2 3 4 5 6 7 8 9 \n";
//    mycount = (int) count_if (myvector.begin(), myvector.end(), IsOdd);
    mycount = (int) count_if (myvector.begin(), myvector.end(), bind2nd(modulus<int>(),2));//表示param1 % 2
    cout << "myvector 包含 " << mycount  << " 奇数元素.\n";//奇数
//  如果求偶数的个数                                            not1,1表示一个参数取反
    mycount = (int) count_if (myvector.begin(), myvector.end(), not1(bind2nd(modulus<int>(),2)));//表示!(param1 % 2)
    cout << "myvector 包含 " << mycount  << " 偶数元素.\n";//偶数
    /****************
    Output:
    myvector 包含 5 奇数元素.
    ****************/
//                                               函数适配器  函数对象
//         bind2nd(op,value);表示绑定第二个数                   param1 > 4  这里表示统计大于4的个数
    mycount=count_if(myvector.begin(),myvector.end(),bind2nd(greater<int>(),4));
    cout<<"有"<<mycount<<"个数大于4"<<endl;
//拓展练习                                                      4 > param2
    mycount=count_if(myvector.begin(),myvector.end(),bind1st(greater<int>(),4));
    cout<<"有"<<mycount<<"个数小于4"<<endl;
//                                                              4 < param2
    mycount=count_if(myvector.begin(),myvector.end(),bind1st(less<int>(),4));
    cout<<"有"<<mycount<<"个数大于4"<<endl;
//                                                              param1 >= 4
    mycount=count_if(myvector.begin(),myvector.end(),bind2nd(greater_equal<int>(),4));
    cout<<"有"<<mycount<<"个数大于等于4"<<endl;
//                                                              param1 <= 4
    mycount=count_if(myvector.begin(),myvector.end(),bind2nd(less_equal<int>(),4));
    cout<<"有"<<mycount<<"个数小于等于4"<<endl;

/****关联容器****/
    multiset<int> ms(myvector.begin(),myvector.end());
    ms.insert(myvector.begin(),myvector.begin()+6);
    ms.insert(myvector.begin(),myvector.begin()+4);
    ms.insert(myvector.begin(),myvector.begin()+2);
    ms.insert(1);

    multiset<int>::iterator ims=ms.begin();
    while(ims!=ms.end()){
        cout<<*ims++<<" ";
    }cout<<endl;

//两种方法求1的个数
    int cnt=count(ms.begin(),ms.end(),1);//所有容器适用但是比较慢些
    cout<<"multiset里有"<<cnt<<"个1."<<endl;

    cnt=ms.count(1);//关联容器专享   set已经排序可以快速计数
    cout<<"multiset里有"<<cnt<<"个1."<<endl;

    return 0;
}




以上是关于STL算法总结之查找算法示例的主要内容,如果未能解决你的问题,请参考以下文章

STL六大组件之算法

STL六大组件之算法

STL之算法总结

❤ 挑战C站最强C++ STL标准库总结(内含大量示例)

万字长文 | STL 算法总结

stl_algorithm算法之二分法查找