工作中往往有這樣的場景:選出一個容器,或是范圍內的最大值、最大元素、最小值和最小元素。很普通的做法就是,我們用一個for循環進行遍歷,然後達到我們的效果。
其實stl的算法中就提供了一些關於最大和最小的操作,我們往往忽略他們。
這篇博客也是關於C++11中新增加的算法最後一次博客了。
還是先介紹幾個在C++11之前就存在的,但是與本博客息息相關的算法。
首先是:
min和max
由於很簡單,所以直接上代碼:
#include // std::cout
#include // std::min
int main () {
std::cout << "min(1,2)==" << std::min(1,2) << '\n';
std::cout << "min(2,1)==" << std::min(2,1) << '\n';
std::cout << "min('a','z')==" << std::min('a','z') << '\n';
std::cout << "min(3.14,2.72)==" << std::min(3.14,2.72) << '\n';
std::cout << "max(1,2)==" << std::max(1,2) << '\n';
std::cout << "max(2,1)==" << std::max(2,1) << '\n';
std::cout << "max('a','z')==" << std::max('a','z') << '\n';
std::cout << "max(3.14,2.73)==" << std::max(3.14,2.73) << '\n';
return 0;
}
接下來是C++11新增的:
minmax
我們從字面上就可以有所把握。
返回的是一個pair 。
Returns a pair with the smallest of a and b as first element, and the largest as second. If both are equivalent, the function returns make_pair(a,b).
看代碼:
#include // std::cout
#include // std::minmax
int main () {
auto result = std::minmax({1,2,3,4,5});
std::cout << "minmax({1,2,3,4,5}): ";
std::cout << result.first << ' ' << result.second << '\n';
return 0;
}
至此,你肯定意猶未盡,好像欠缺了點什麼。上面提到的min和max沒有用於range。
min_element和max_element
#include // std::cout
#include // std::min_element, std::max_element
bool myfn(int i, int j) { return i
效仿minmax,同樣是C++11新增的內容:
minmax_element
Returns a pair with an iterator pointing to the element with the smallest value in the range [first,last) as first element, and the largest as second.
#include // std::cout
#include // std::minmax_element
#include // std::array
int main () {
std::array foo {3,7,2,9,5,8,6};
auto result = std::minmax_element (foo.begin(),foo.end());
// print result:
std::cout << "min is " << *result.first;
std::cout << ", at position " << (result.first-foo.begin()) << '\n';
std::cout << "max is " << *result.second;
std::cout << ", at position " << (result.second-foo.begin()) << '\n';
return 0;
}