泛型算法,排序的相关操作,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的主要内容,如果未能解决你的问题,请参考以下文章