本文共 8345 字,大约阅读时间需要 27 分钟。
template< class T >const T& max( const T& a, const T& b );template< class T, class Compare >const T& max( const T& a, const T& b, Compare comp );template< class T >T max( std::initializer_listilist );template< class T, class Compare >T max( std::initializer_list ilist, Compare comp );
返回a、b中较大的一个;返回ilist中最大一个。
std::initializer_list 和 vector 类似,不同的是,initializer_list对象中的元素永远是常量值,我们无法改变initializer_list对象中元素的值。#include#include #include int main(){ std::cout << "larger of 1 and 9999: " << std::max(1, 9999) << '\n' << "larger of 'a', and 'b': " << std::max('a', 'b') << '\n' << "longest of \"foo\", \"bar\", and \"hello\": " << std::max( { "foo", "bar", "hello" }, [](const std::string& s1, const std::string& s2) { return s1.size() < s2.size(); }) << '\n';}
Output:
larger of 1 and 9999: 9999larger of 'a', and 'b': blongest of "foo", "bar", and "hello": hello
template< class ForwardIt >ForwardIt max_element( ForwardIt first, ForwardIt last );template< class ForwardIt, class Compare >ForwardIt max_element( ForwardIt first, ForwardIt last, Compare comp );
返回[first, last)中最大的元素的位置(迭代器)
#include#include #include #include static bool abs_compare(int a, int b){ return (std::abs(a) < std::abs(b));} int main(){ std::vector v{ 3, 1, -14, 1, 5, 9 }; std::vector ::iterator result; result = std::max_element(v.begin(), v.end()); std::cout << "max element at: " << std::distance(v.begin(), result) << '\n'; result = std::max_element(v.begin(), v.end(), abs_compare); std::cout << "max element (absolute) at: " << std::distance(v.begin(), result);}
Output:
max element at: 5max element (absolute) at: 2
template< class T >const T& min( const T& a, const T& b );template< class T, class Compare >const T& min( const T& a, const T& b, Compare comp );template< class T >T min( std::initializer_listilist );template< class T, class Compare >T min( std::initializer_list ilist, Compare comp );
返回a、b中较小的一个;返回ilist中最小一个。
#include#include #include int main(){ std::cout << "smaller of 1 and 9999: " << std::min(1, 9999) << '\n' << "smaller of 'a', and 'b': " << std::min('a', 'b') << '\n' << "shortest of \"foo\", \"bar\", and \"hello\": " << std::min( { "foo", "bar", "hello" }, [](const std::string& s1, const std::string& s2) { return s1.size() < s2.size(); }) << '\n';}
Output:
smaller of 1 and 9999: 1smaller of 'a', and 'b': ashortest of "foo", "bar", and "hello": foo
template< class ForwardIt >ForwardIt min_element( ForwardIt first, ForwardIt last );template< class ForwardIt, class Compare >ForwardIt min_element( ForwardIt first, ForwardIt last, Compare comp );
返回[first, last)范围内,最小元素的位置(迭代器)
#include#include #include int main(){ std::vector v{ 3, 1, 4, 1, 5, 9}; std::vector ::iterator result = std::min_element(v.begin(), v.end()); std::cout << "min element at: " << std::distance(v.begin(), result);}
Output:
min element at: 1
template< class T >std::pairminmax( const T& a, const T& b );template< class T, class Compare >std::pair minmax( const T& a, const T& b, Compare comp );template< class T >std::pair minmax( std::initializer_list ilist);template< class T, class Compare >std::pair minmax( std::initializer_list ilist, Compare comp );
以std::pair成对返回最小、最大值。
#include#include #include #include #include int main(){ std::vector v { 3, 1, 4, 1, 5, 9, 2, 6}; std::srand(std::time(0)); std::pair bounds = std::minmax(std::rand() % v.size(), std::rand() % v.size()); std::cout << "v[" << bounds.first << "," << bounds.second << "]: "; for (int i = bounds.first; i < bounds.second; ++i) { std::cout << v[i] << ' '; } std::cout << '\n';}
Possible output:
v[2,7]: 4 1 5 9 2
template< class ForwardIt >std::pairminmax_element( ForwardIt first, ForwardIt last ); template< class ForwardIt, class Compare >std::pair minmax_element( ForwardIt first, ForwardIt last, Compare comp );
成对(std::pair)返回[first, last)范围内最小、最大值的位置(迭代器)
#include#include #include int main() { const auto v = { 3, 9, 1, 4, 2, 5, 9 }; const auto [min, max] = std::minmax_element(begin(v), end(v)); std::cout << "min = " << *min << ", max = " << *max << '\n';}
Output:
min = 1, max = 9
templateconstexpr const T& clamp( const T& v, const T& lo, const T& hi );template constexpr const T& clamp( const T& v, const T& lo, const T& hi, Compare comp );
如果v小于lo,返回lo;如果v大于hi,返回hi;否则返回v;即确保返回的值在lo和hi之间。
#include#include #include #include #include int main(){ std::mt19937 g(std::random_device{ }()); std::uniform_int_distribution<> d(-300, 300); std::cout << " raw clamped to int8_t clamped to uint8_t\n"; for(int n = 0; n < 5; ++n) { int v = d(g); std::cout << std::setw(4) << v << std::setw(20) << std::clamp(v, INT8_MIN, INT8_MAX) << std::setw(21) << std::clamp(v, 0, UINT8_MAX) << '\n'; }}
Possible output:
.raw clamped to int8_t clamped to uint8_t168 127 168128 127 128-137 -128 0 40 40 40 -66 -66 0
template< class InputIt1, class InputIt2 >bool equal( InputIt1 first1, InputIt1 last1, InputIt2 first2 );template< class InputIt1, class InputIt2, class BinaryPredicate >bool equal( InputIt1 first1, InputIt1 last1, InputIt2 first2, BinaryPredicate p );
判读两个序列是否相同。
#include#include #include // 判读是否是回文序列bool is_palindrome(const std::string& s){ return std::equal(s.begin(), s.begin() + s.size()/2, s.rbegin());} void test(const std::string& s){ std::cout << "\"" << s << "\" " << (is_palindrome(s) ? "is" : "is not") << " a palindrome\n";} int main(){ test("radar"); test("hello");}
Output:
"radar" is a palindrome"hello" is not a palindrome
template< class InputIt1, class InputIt2 >bool lexicographical_compare( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2 );template< class InputIt1, class InputIt2, class Compare >bool lexicographical_compare( InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2, Compare comp );
按照字典顺序比较第一个序列是否小于第二个序列。
#include#include #include #include int main(){ std::vector v1 { 'a', 'b', 'c', 'd'}; std::vector v2 { 'a', 'b', 'c', 'd'}; std::mt19937 g{ std::random_device{ }()}; while (!std::lexicographical_compare(v1.begin(), v1.end(), v2.begin(), v2.end())) { for (auto c : v1) std::cout << c << ' '; std::cout << ">= "; for (auto c : v2) std::cout << c << ' '; std::cout << '\n'; std::shuffle(v1.begin(), v1.end(), g); std::shuffle(v2.begin(), v2.end(), g); } for (auto c : v1) std::cout << c << ' '; std::cout << "< "; for (auto c : v2) std::cout << c << ' '; std::cout << '\n';}
Possible output:
a b c d >= a b c d d a b c >= c b d a b d a c >= a d c b a c d b < c d a b
转载地址:http://zdmei.baihongyu.com/