5 + middle, iArray5 + len, greater<int>());
for_each(iArray5, iArray5 + len, MyPrint);
system("pause");
return 0;
}
9.6 容器区间查找算法
Bound 算法函数,用于查找序列中指定值的边界位置。bound的用法如下:
template<class ForwardIterator, class T>
ForwardIterator lower_bound (ForwardIterator first, ForwardIterator last, const T& value);
template<class ForwardIterator, class T>
ForwardIterator upper_bound (ForwardIterator first, ForwardIterator last, const T& value);
其中,first、last
是迭代器,表示待查找的序列的范围;value
是需要查找的元素的值。lower_bound
函数返回指向序列中第一个不小于value
的元素的迭代器,如果所有元素都小于value
,则返回last;upper_bound
函数返回指向序列中第一个大于value
的元素的迭代器,如果所有元素都不大于value
,则返回last。
读者需要注意,该函数函数执行前,需要保证所输入的序列本身已经是已排序的序列,并且元素类型支持<
运算符。
bound函数使用的是二分查找算法,可以高效地找到指定值的边界位置。lower_bound
函数首先将序列分成若干个小的区间,每个区间内的元素都不大于value;然后在这些区间中继续执行二分查找操作,直到定位到第一个不小于value的元素位置。upper_bound
函数和lower_bound
函数类似,只是在找到不小于value
的元素时,继续向前遍历,直到定位到第一个大于value
的元素位置。
#include <iostream>
#include <algorithm>
using namespace std;
int main(int argc, char* argv[])
{
int iArray[] = { 3, 6, 9, 12, 13, 18, 20, 27, 55, 44};
const int len = sizeof(iArray) / sizeof(int);
// lower_bound 找出不小于某值的有序数组下确界元素
int *result1 = lower_bound(iArray, iArray + len, 16);
cout << "lower_bound = " << *result1 << endl;
// upper_bound 找出大于某值的有序数组上确界元素
int *result2 = upper_bound(iArray, iArray + len, 20);
cout << "upper_bound = " << *result2 << endl;
// equal_range 找出可插入某值的区间元素
pair<int*, int*> range = equal_range(iArray, iArray + len, 5);
cout << "lower_bound = " << *range.first << endl;
cout << "upper_bound = " << *range.second << endl;
system("pause");
return 0;
}
9.7 最大值/最小值算法
min_element和max_element 算法函数,用于查找序列中的最小元素和最大元素。它们的用法如下:
template<class ForwardIterator>
ForwardIterator min_element(ForwardIterator first, ForwardIterator last);
template<class ForwardIterator>
ForwardIterator max_element(ForwardIterator first, ForwardIterator last);
其中,first
和last
是迭代器,表示待查找的序列的范围。min_element
函数返回指向序列中最小元素的迭代器,max_element
函数返回指向序列中最大元素的迭代器。
读者需要注意,min_element
和max_element
函数执行前,需要保证所输入的序列本身已经是已排序的序列。另外,为了实现更高效的运行时间,C++ STL中提供了另一个函数模板来查找最大或最小值。它可以在部分或未排序的序列中查找最大或最小的元素:
template <class ForwardIterator, class Compare>
ForwardIterator min_element(ForwardIterator first, ForwardIterator last, Compare comp);
template <class ForwardIterator, class Compare>
ForwardIterator max_element(ForwardIterator first, ForwardIterator last, Compare comp);
其中,comp是一个可调用函数或函数对象,用于指定元素的比较方法。min_element
和max_element
函数的功能与之前相同,只是增加了一个参数comp,用于指定元素的比较方法。
总之,min_element
和max_element
函数是C++ STL中非常实用的查找函数,可以方便地查找序列中的最小元素和最大元素,并支持自定义的比较方法,实现各种元素查找和排序等操作。
#include <iostream>
#include <algorithm>
#include <list>
using namespace std;
int main(int argc, char* argv[])
{
list<int> ls = { 1, 4, 5, 6, 7, 2, 3, 4, 9, 7, 6 };
// 返回链表最小元素
cout << *min_element(ls.begin(), ls.end()) << endl;
// 返回链表最大元素
cout << *max_element(ls.begin(), ls.end()) << endl;
// 剩余 max /min 比较
cout << max(100, 30) << endl;
cout << min(1, -10) << endl;
system("pause");
return 0;
}
9.8 交