c++ STL常用查找函数count find 二分法查找

count 和 find 查找数组中有几个满足条件的指定元素

查找数组第一个指定条件的元素在哪里
这两个查找都是循序查找

查找返回满足条件的元素个数 查找返回满足条件的首个元素位置
count(first,last,比较的值) find(first,last,比较的值)
count_if(first,last,函数返回1则为满足) find_if(first,last,函数返回1则满足)
0 find_first_of(v1.first,v1.last,v2.first,v2.last)
二分查找的方法 返回的值
binary_search(first,last,比较的值) 在一个前闭后开的区间中查找是否有元素返回false true
lower_bound(first,last,比较的值) 返回满足条件的值的位置,如果没有则返回第一个不小于value的值
upper_bound
equal_range
int cmd(int x)
{
    if (x >= 5) return 1;
    else return 0;
}

int main()
{
    vector<int> vi;
    cout << "第一个vector数组vi的所有元素" << endl;
    for (int i = 0; i < 10; i++)
    {   
        vi.push_back(i+10);
        cout << i+10 << " ";
    }
    cout << endl;
    vector<int> vj{ 15,16,17 };
    cout << "第二vector类型有数据 15 16 17 三个数据" << endl;

1   count函数 查找 等于 给定数的元素的个数
//count 在数组类型中查找 等于 给定数的元素的个数
    int x = count(vi.begin(), vi.end(), 5);
    cout << "数组vector中有几个5:" << x << "个" << endl;                   //输出有几个 5 

2   //count_if 在数组类型中查找 满足自定义函数条件 的元素的个数
    x = count_if(vi.begin(), vi.end(), cmd);
    cout << "数组中有几个大于等于5的元素:" << x << "个" << endl;          //输出有几个数大于等于 5
    find函数查找给定数据出现的位置

1 //find 查找给定数据出现的位置
    vector<int>::iterator fr = find(vi.begin(), vi.end(), 16);  //输出vector数组中第一个等于6的元素
    if (fr == vi.end()) cout << "没有这个数存在" << endl;          //如果没有这个元素则 fr==vi.end()
    else cout << "16这个数在数组中哪个位置出现:" << (fr - vi.begin()) << endl;               
//输出的时候要 fr-vi.bgein() 才是当前元素

2   //find_if 查找满足条件的数据第一次出现的位置
    fr = find_if(vi.begin(), vi.end(), cmd);
    cout << "第一个大于等于5的数是数组中第" << fr - vi.begin() << "个" << endl;

3   //find_first_of 从第一个区间取一个数去第二个区间找相同,然后取第二个找相同,直到找到相同元素为止
    fr = find_first_of(vi.begin(), vi.end(), vj.begin(), vj.end());
    cout << "从第一个迭代区间取一个数,然后在后面的迭代区间比较,如果有相同的则返回位置" << endl;
    cout << "如果取的第一个数没有找到相同,则取第二个数再去比较" << endl;
    cout << "找到的相同的数是第" << endl;
    cout << (fr - vi.begin()) << "个" << endl;

    //find_end 第一个区间 第二个区间,在第一个区间找一个子序列 和第二个区间元素都相同
    //并且找到的是最后一个元素相同的子序列
4   fr = find_end(vi.begin(), vi.end(), vj.begin(), vj.end());
    cout << "第一个区间中从后往前,子序列和第二个区间元素相同的第一个元素在第一个数组中的第" << endl;
    cout << fr - vi.begin() << "个" << endl;

1   //binary_search 在已排序的[first, last)中寻找元素value。如果[first, last)内有等价于value的元素,它会返回true,否则返回false,它不返回查找位置。
    if (binary_search(vi.begin(), vi.end(), 20))
        cout << "有20这个元素";
    else cout << "没有20这个元素";
    cout << endl;

lower_xxxx 二分法查找中的一些函数

//四个二分查找 使用之前要先排序
//binary_search 试图在已排序的[first, last)中寻找元素value。

1   //如果[first, last)内有等价于value的元素,它会返回true,否则返回false,它不返回查找位置。
    cout << endl << "查找数组中有没有指定元素,有则返回1,,没有返回0" << endl;
    if (binary_search(vi.begin(), vi.end(), 20)) cout << "找到了20这个元素" << endl;
    else cout << "没有找到20这个元素" << endl;

2   //lower_bound 它试图在已排序的[first, last)中寻找元素value。
    //如果[first, last)具有等价于value的元素,lower_bound返回一个iterator指向其中第一个元素。
    //如果没有这样的元素存在,它便返回假设这样的元素存在的话,会出现的位置。即指向第一个不小于value的元素。
    //如果value大于[first, last)的任何一个元素,则返回last。
    cout << endl << "lower_bound函数,我也不知道有没有这个元素" << endl;
    fr = lower_bound(vi.begin(), vi.end(), 15);
    if (*fr != 15) cout << "找到了15这个元素,第一个不小于15的数在指针指向的位置"<else cout << "找到了15这个元素" << endl;

3   //upper_bound 它试图在已排序的[first, last)中寻找value,返回可安插value的最后一个合适的位置。
    //如果value存在,lower_bound 返回的是指向该元素的iterator。相较之下upper_bound并不这么做,它返回value可被安插的最后一个合适位置。
    //如果value存在,那么它返回的iterator将指向value的下一个位置,而非value自身。
    cout << endl << "upper_bound返回可以安插指定元素的第一位置" << endl;
    fr = upper_bound(vi.begin(), vi.end(), 15);
    if (fr != vi.end()) cout << "指针指向比15大的最小的数,在数组中第" << fr - vi.begin() << "个" << endl;
    else cout << "指定元素比数组中的所有数都大" << endl;

4   //equal_range 的返回值本质上结合了 lower_bound和upper_bound两者的返回值。
    //其返回值是一对iterator i 和 j, 其中i是value可安插的第一个位置,j则是value可安插的最后一个位置。
    //可以推演出:[i,j)中的每个元素都等价于value,而且[i, j)是[first, last)之中符合上述性质的一个最大子区间。  
    //算法lower_bound返回该range的第一个iterator,
    //算法upper_bound返回该range的past - the - end iterator,算法 equal_range 则是以 pair 的形式将两者都返回。
    vector <int> vecInt;
    pair<vector<int>::iterator, vector<int>::iterator> iter;
    iter = equal_range(vi.begin(), vi.end(), 15);
    cout << "第一个等于指定元素的值,指针指向这个值" << *iter.first << "  第一个比指定元素大的元素,指针指向这个值" << *iter.second << endl;
    cout << "第一个等于指定元素的元素,是数组中第" << iter.first-vi.begin() << "  第一个比指定元素大的元素,指针指向这个值" << iter.second-vi.begin() << endl;
    cout << endl << "------------------------------------------------------------------------------------------" << endl;
    cout << "pr是一个指针,*pr是一个整数,pr-vi.begin()表示pr指向数组中第几个数"<return 0;
}

你可能感兴趣的:(c++ STL常用查找函数count find 二分法查找)