泛型算法,排序的相关操作,lower_boundupper_boundequal_range

Posted meihao1203

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了泛型算法,排序的相关操作,lower_boundupper_boundequal_range相关的知识,希望对你有一定的参考价值。

template< class ForwardIt, class T >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value ); 返回第一个不小于(>=)指定的数的迭代器。如果没找到就返回last  这个版本内部比较默认使用<
template< class ForwardIt, class T, class Compare >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );
这个版本内部比较默认使用comp函数
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
        for(auto elem:ve)
                cout<<elem<<" ";
        cout<<endl;
}
int main()
{
        //容器有序
        int arr[10] = {1,2,3,4,5,6,7,8,9,10};
        vector<int> ve1(arr,arr+10);
        print(ve1);
        auto it = lower_bound(ve1.begin(),ve1.end(),2);
        cout<<*it<<endl;
        auto it2 = lower_bound(ve1.begin(),ve1.end(),11);
        if(it2==ve1.end())
        {
                cout<<"not found!"<<endl;
        }
        //容器无序
        int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
        vector<int> ve2(arr2,arr2+10);
        print(ve2);
        auto it3 = lower_bound(ve2.begin(),ve2.end(),5);
        cout<<*it3<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//2
//not found!
//2 1 4 3 6 8 5 7 9 10
//6
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
        for(auto elem:ve)
                cout<<elem<<" ";
        cout<<endl;
}
bool comp(const int& a,const int& b)
{
        return a<b;  //从小到大
}
int main()
{
        //容器有序
        int arr[10] = {1,2,3,4,5,6,7,8,9,10};
        vector<int> ve1(arr,arr+10);
        print(ve1);
        auto it = lower_bound(ve1.begin(),ve1.end(),2,comp);
        cout<<*it<<endl;
        print(ve1);
        auto it2 = lower_bound(ve1.begin(),ve1.end(),11,comp);
        print(ve1);
        if(it2==ve1.end())
        {
                cout<<"not found!"<<endl;
        }
        //容器无序
        int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
        vector<int> ve2(arr2,arr2+10);
        print(ve2);
        auto it3 = lower_bound(ve2.begin(),ve2.end(),5,comp);
        print(ve2);
        cout<<*it3<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//2
//1 2 3 4 5 6 7 8 9 10
//1 2 3 4 5 6 7 8 9 10
//not found!
//2 1 4 3 6 8 5 7 9 10
//2 1 4 3 6 8 5 7 9 10
//6

template< class ForwardIt, class T >
ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value );
返回第一个大于(>)指定的数的迭代器指针。内部元素之间比较规则采用<
template< class ForwardIt, class T, class Compare >
ForwardIt upper_bound( ForwardIt first, ForwardIt last, const T& value, Compare comp );
内部元素之间比较规则采用comp
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
        for(auto elem:ve)
                cout<<elem<<" ";
        cout<<endl;
}
int main()
{
        //容器有序
        int arr[10] = {1,2,3,4,5,6,7,8,9,10};
        vector<int> ve1(arr,arr+10);
        print(ve1);
        auto it = upper_bound(ve1.begin(),ve1.end(),2);
        cout<<*it<<endl;
        auto it2 = lower_bound(ve1.begin(),ve1.end(),11);
        if(it2==ve1.end())
        {
                cout<<"not found!"<<endl;
        }
        //容器无序
        int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
        vector<int> ve2(arr2,arr2+10);
        print(ve2);
        auto it3 = lower_bound(ve2.begin(),ve2.end(),3);
        cout<<*it3<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//3
//not found!
//2 1 4 3 6 8 5 7 9 10
//4
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
        for(auto elem:ve)
                cout<<elem<<" ";
        cout<<endl;
}
bool comp(const int& a,const int& b)
{
        return a<b;  //从小到大
}
int main()
{
        //容器有序
        int arr[10] = {1,2,3,4,5,6,7,8,9,10};
        vector<int> ve1(arr,arr+10);
        print(ve1);
        auto it = upper_bound(ve1.begin(),ve1.end(),2,comp);
        cout<<*it<<endl;
        print(ve1);
        auto it2 = upper_bound(ve1.begin(),ve1.end(),11,comp);
        print(ve1);
        if(it2==ve1.end())
        {
                cout<<"not found!"<<endl;
        }
        //容器无序
        int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
        vector<int> ve2(arr2,arr2+10);
        print(ve2);
        auto it3 = upper_bound(ve2.begin(),ve2.end(),5,comp);
        print(ve2);
        cout<<*it3<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//3
//1 2 3 4 5 6 7 8 9 10
//1 2 3 4 5 6 7 8 9 10
//not found!
//2 1 4 3 6 8 5 7 9 10
//2 1 4 3 6 8 5 7 9 10
//6

template< class ForwardIt, class T >
std::pair<ForwardIt,ForwardIt>
    equal_range( ForwardIt first, ForwardIt last,
                const T& value );
返回的是两个迭代器指针,第一个迭代器指针相当于lower_bound返回的,第二个相当于upper_bound返回的,内部比较规则,默认<
如果没有不小于指定元素的数,就返回ForwardIt first,同理,后面一个没有满足要求的元素就返回ForwardIt last
template< class ForwardIt, class T, class Compare >
std::pair<ForwardIt,ForwardIt>
    equal_range( ForwardIt first, ForwardIt last,
                const T& value, Compare comp );
内部比较规则,comp
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
        for(auto elem:ve)
                cout<<elem<<" ";
        cout<<endl;
}
int main()
{
        //容器有序
        int arr[10] = {1,2,3,4,5,6,7,8,9,10};
        vector<int> ve1(arr,arr+10);
        print(ve1);
        auto pair = equal_range(ve1.begin(),ve1.end(),5); //返回一个pair<vector<int>::iterator,vector<int>::iterator>,第一个指向第一个不小于5的元素,第二个指向第一个大于5的元素
        for(auto it = pair.first;it<=pair.second;++it)
                cout<<*it<<" ";
        cout<<endl;
        auto pair2 = equal_range(ve1.begin(),ve1.end(),11);
        if(pair2.first==ve1.end() && pair2.second==ve1.end())
                cout<<"not found"<<endl;
        //容器无序
        int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
        vector<int> ve2(arr2,arr2+10);
        print(ve2);
        auto pair3 = equal_range(ve2.begin(),ve2.end(),5);
        for(auto it = pair3.first;it<=pair3.second;++it)
                cout<<*it<<" ";
        cout<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//5 6
//not found
//2 1 4 3 6 8 5 7 9 10
//6 
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
void print(vector<int>& ve)
{
        for(auto elem:ve)
                cout<<elem<<" ";
        cout<<endl;
}
bool comp(const int&a ,const int&b)
{
        return a<b;
}
int main()
{
        //容器有序
        int arr[10] = {1,2,3,4,5,6,7,8,9,10};
        vector<int> ve1(arr,arr+10);
        print(ve1);
        auto pair = equal_range(ve1.begin(),ve1.end(),5,comp); //返回一个pair<vector<int>::iterator,vector<int>::iterator>,第一个指向第一个不小于5的元素,第二个指向第一个大于5的元素
        for(auto it = pair.first;it<=pair.second;++it)
                cout<<*it<<" ";
        cout<<endl;
        auto pair2 = equal_range(ve1.begin(),ve1.end(),11,comp);
        if(pair2.first==ve1.end() && pair2.second==ve1.end())
                cout<<"not found"<<endl;
        //容器无序
        int arr2[10] = {2,1,4,3,6,8,5,7,9,10};
        vector<int> ve2(arr2,arr2+10);
        print(ve2);
        auto pair3 = equal_range(ve2.begin(),ve2.end(),5,comp);
        for(auto it = pair3.first;it<=pair3.second;++it)
                cout<<*it<<" ";
        cout<<endl;
}
//1 2 3 4 5 6 7 8 9 10
//5 6
//not found
//2 1 4 3 6 8 5 7 9 10
//6 

以上是关于泛型算法,排序的相关操作,lower_boundupper_boundequal_range的主要内容,如果未能解决你的问题,请参考以下文章

20165202 week10课下补做

[GeekBand] STL与泛型编程

泛型算法

STL中sort排序算法第三个参数_Compare的实现本质

Java 泛型

Java 泛型