今天在做leetcode每日一题时需要找到vector容器中的最大值,因此顺便整理一下最大值和最小值迭代器和索引的查找方法。
迭代器的查找方法
max_element和min_element函数
template <class ForwardIterator>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last);
该函数返回查找范围内的最大值的迭代器,查找区间前闭后开。
自定义比较函数的函数原型为:
template <class ForwardIterator, class Compare>
ForwardIterator max_element (ForwardIterator first, ForwardIterator last,
Compare comp);
查找范围内最小元素函数为min_element。
示例:
#include <iostream> // std::cout
#include <algorithm> // std::min_element, std::max_element
bool myfn(int i, int j) { return i<j; }
struct myclass {
bool operator() (int i,int j) { return i<j; }
} myobj;
int main () {
int myints[] = {3,7,2,5,6,4,9};
// using default comparison:
std::cout << "The smallest element is " << *std::min_element(myints,myints+7) << '\n';
std::cout << "The largest element is " << *std::max_element(myints,myints+7) << '\n';
// using function myfn as comp:
std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myfn) << '\n';
std::cout << "The largest element is " << *std::max_element(myints,myints+7,myfn) << '\n';
// using object myobj as comp:
std::cout << "The smallest element is " << *std::min_element(myints,myints+7,myobj) << '\n';
std::cout << "The largest element is " << *std::max_element(myints,myints+7,myobj) << '\n';
return 0;
}
The smallest element is 2
The largest element is 9
The smallest element is 2
The largest element is 9
The smallest element is 2
The largest element is 9
索引的查找方法
max_element与min_element函数
上面已经介绍了max_element与min_element函数的作用,我们可以通过先找到最值迭代器,然后再减去begin()即可得到最值的索引:
int indexOfMax=max_element(vec.begin(),vec.begin()+n)-vec.begin();
distance函数
该函数计算迭代器之间元素的个数
函数原型为:
template<class InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance (InputIterator first, InputIterator last);
#include <iostream> // std::cout
#include <iterator> // std::distance
#include <list> // std::list
int main () {
std::list<int> mylist;
for (int i=0; i<10; i++) mylist.push_back (i*10);
std::list<int>::iterator first = mylist.begin();
std::list<int>::iterator last = mylist.end();
std::cout << "The distance is: " << std::distance(first,last) << '\n';
return 0;
}
我们可以这样来找到索引:
auto maxIter=max_element(vec.begin(),vec.begin()+n);
int indexOfMax=distance(vec.begin(),maxIter);