equal_range(vs2010)
- 引言
这是我学习总结<algorithm>的第十二篇,equal_range很好理解,也很好用,适合排序以后的存在大量重复的数据。
- 作用
equal_range的作用是
Get subrange of equal elements
Returns the bounds of the subrange that includes all the elements of the range
[first,last)
with values equivalent to
val.
- 原理
template <class ForwardIterator, class T>
pair<ForwardIterator,ForwardIterator>
equal_range (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator it = std::lower_bound (first,last,val);
return std::make_pair ( it, std::upper_bound(it,last,val) );
}
- 实验
对于数据集合
找到 20 的下限和上限,即是 3 和 6
又例如倒序的数据集合
找到 20 的下限和上限,即是 2 和 5
- 代码
test.cpp
#include <iostream> // std::cout
#include <algorithm> // std::equal_range, std::sort
#include <vector> // std::vector
#include <iterator>
bool mygreater (int i,int j)
{
return (i>j);
}
int main ()
{
int myints[] = {10,20,30,30,20,10,10,20};
std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds;
// using default comparison:
std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
bounds = std::equal_range (v.begin(), v.end(), 20); // ^ ^
std::copy(v.begin(), v.end(),std::ostream_iterator<int>(std::cout," "));
std::cout<<std::endl;
std::cout << "bounds at positions " << (bounds.first - v.begin());
std::cout << " and " << (bounds.second - v.begin()) << '\n';
// using "mygreater" as comp:
std::sort (v.begin(), v.end(), mygreater); // 30 30 20 20 20 10 10 10
bounds = std::equal_range (v.begin(), v.end(), 20, mygreater); // ^ ^
std::copy(v.begin(), v.end(),std::ostream_iterator<int>(std::cout," "));
std::cout<<std::endl;
std::cout << "bounds at positions " << (bounds.first - v.begin());
std::cout << " and " << (bounds.second - v.begin()) << '\n';
system("pause");
return 0;
}
- 引言
这是我学习总结<algorithm>的第十二篇,equal_range很好理解,也很好用,适合排序以后的存在大量重复的数据。
- 作用
equal_range的作用是
Get subrange of equal elements
Returns the bounds of the subrange that includes all the elements of the range
[first,last)
with values equivalent to
val.
- 原理
template <class ForwardIterator, class T>
pair<ForwardIterator,ForwardIterator>
equal_range (ForwardIterator first, ForwardIterator last, const T& val)
{
ForwardIterator it = std::lower_bound (first,last,val);
return std::make_pair ( it, std::upper_bound(it,last,val) );
}
- 实验
对于数据集合
找到 20 的下限和上限,即是 3 和 6
又例如倒序的数据集合
找到 20 的下限和上限,即是 2 和 5
- 代码
test.cpp
#include <iostream> // std::cout
#include <algorithm> // std::equal_range, std::sort
#include <vector> // std::vector
#include <iterator>
bool mygreater (int i,int j)
{
return (i>j);
}
int main ()
{
int myints[] = {10,20,30,30,20,10,10,20};
std::vector<int> v(myints,myints+8); // 10 20 30 30 20 10 10 20
std::pair<std::vector<int>::iterator,std::vector<int>::iterator> bounds;
// using default comparison:
std::sort (v.begin(), v.end()); // 10 10 10 20 20 20 30 30
bounds = std::equal_range (v.begin(), v.end(), 20); // ^ ^
std::copy(v.begin(), v.end(),std::ostream_iterator<int>(std::cout," "));
std::cout<<std::endl;
std::cout << "bounds at positions " << (bounds.first - v.begin());
std::cout << " and " << (bounds.second - v.begin()) << '\n';
// using "mygreater" as comp:
std::sort (v.begin(), v.end(), mygreater); // 30 30 20 20 20 10 10 10
bounds = std::equal_range (v.begin(), v.end(), 20, mygreater); // ^ ^
std::copy(v.begin(), v.end(),std::ostream_iterator<int>(std::cout," "));
std::cout<<std::endl;
std::cout << "bounds at positions " << (bounds.first - v.begin());
std::cout << " and " << (bounds.second - v.begin()) << '\n';
system("pause");
return 0;
}