STL 源码剖析 算法 stl_algobase.h
2014-07-16 17:33
513 查看
本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie
1.iter_swap
描述:将两个 ForwardIterator 所指的对象对调
源码:
2.min, max
描述:求两个对象的最大(小)值
源码:
3.fill, fill_n
描述:将 [first, last) 内的所有元素或前 n 个元素改填新值
源码:
4.mismatch
描述:用来平行比较两份我,指出两者之间的第一个不匹配,返回一对迭代器,分别指向两序列中的不匹配点。
源码:
5.equal
描述:如果两个序列在 [first, last) 区间内相等,返回 true
源码:
6.lexicographical_compare
描述:以"字典排列方式"对两个序列 [first1, last1) 和 [first2, last2) 进行比较。
源码:
1.iter_swap
描述:将两个 ForwardIterator 所指的对象对调
源码:
//version 1 template <class ForwardIterator1, class ForwardIterator2, class T> inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, T*) { T tmp = *a; *a = *b; *b = tmp; } //version 2 template <class ForwardIterator1, class ForwardIterator2> inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) { __iter_swap(a, b, value_type(a)); } //version 3 template <class T> inline void swap(T& a, T& b) { T tmp = a; a = b; b = tmp; }
2.min, max
描述:求两个对象的最大(小)值
源码:
template <class T> inline const T& min(const T& a, const T& b) { return b < a ? b : a; } template <class T> inline const T& max(const T& a, const T& b) { return a < b ? b : a; } template <class T, class Compare> inline const T& min(const T& a, const T& b, Compare comp) { return comp(b, a) ? b : a; } template <class T, class Compare> inline const T& max(const T& a, const T& b, Compare comp) { return comp(a, b) ? b : a; }
3.fill, fill_n
描述:将 [first, last) 内的所有元素或前 n 个元素改填新值
源码:
template <class ForwardIterator, class T> void fill(ForwardIterator first, ForwardIterator last, const T& value) { for ( ; first != last; ++first) *first = value; } template <class OutputIterator, class Size, class T> OutputIterator fill_n(OutputIterator first, Size n, const T& value) { for ( ; n > 0; --n, ++first) *first = value; return first; }
4.mismatch
描述:用来平行比较两份我,指出两者之间的第一个不匹配,返回一对迭代器,分别指向两序列中的不匹配点。
源码:
//version 1 template <class InputIterator1, class InputIterator2> pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) { while (first1 != last1 && *first1 == *first2) { ++first1; ++first2; } return pair<InputIterator1, InputIterator2>(first1, first2); } //version 2 template <class InputIterator1, class InputIterator2, class BinaryPredicate> pair<InputIterator1, InputIterator2> mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred) { while (first1 != last1 && binary_pred(*first1, *first2)) { ++first1; ++first2; } return pair<InputIterator1, InputIterator2>(first1, first2); }
5.equal
描述:如果两个序列在 [first, last) 区间内相等,返回 true
源码:
//version 1 template <class InputIterator1, class InputIterator2> inline bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2) { for ( ; first1 != last1; ++first1, ++first2) if (*first1 != *first2) return false; return true; } //version 2 template <class InputIterator1, class InputIterator2, class BinaryPredicate> inline bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate binary_pred) { for ( ; first1 != last1; ++first1, ++first2) if (!binary_pred(*first1, *first2)) return false; return true; }
6.lexicographical_compare
描述:以"字典排列方式"对两个序列 [first1, last1) 和 [first2, last2) 进行比较。
源码:
//version 1 template <class InputIterator1, class InputIterator2> bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) { for ( ; first1 != last1 && first2 != last2; ++first1, ++first2) { if (*first1 < *first2) return true; if (*first2 < *first1) return false; } return first1 == last1 && first2 != last2; } //version 2 template <class InputIterator1, class InputIterator2, class Compare> bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) { for ( ; first1 != last1 && first2 != last2; ++first1, ++first2) { if (comp(*first1, *first2)) return true; if (comp(*first2, *first1)) return false; } return first1 == last1 && first2 != last2; } //version 3 针对原生指针 inline bool lexicographical_compare(const unsigned char* first1, const unsigned char* last1, const unsigned char* first2, const unsigned char* last2) { const size_t len1 = last1 - first1; const size_t len2 = last2 - first2; const int result = memcmp(first1, first2, min(len1, len2)); return result != 0 ? result < 0 : len1 < len2; } //version 4 inline bool lexicographical_compare(const char* first1, const char* last1, const char* first2, const char* last2) { #if CHAR_MAX == SCHAR_MAX return lexicographical_compare((const signed char*) first1, (const signed char*) last1, (const signed char*) first2, (const signed char*) last2); #else return lexicographical_compare((const unsigned char*) first1, (const unsigned char*) last1, (const unsigned char*) first2, (const unsigned char*) last2); #endif }
相关文章推荐
- STL 源码剖析 算法 stl_algo.h -- equal_range
- STL 源码剖析 算法 stl_algo.h -- pre_permutation
- STL 源码剖析 算法 stl_algo.h -- lower_bound
- STL 源码剖析 算法 stl_algo.h -- merge sort
- STL 源码剖析 算法 stl_algo.h -- partial_sort / partial_sort_copy
- STL 源码剖析 算法 stl_algo.h -- search
- STL 源码剖析 算法 stl_algo.h -- binary_search
- STL 源码剖析 算法 stl_algo.h -- next_permutation
- STL 源码剖析 算法 stl_algo.h -- merge
- STL 源码剖析 算法 stl_algo.h -- includes
- STL 源码剖析 算法 stl_algo.h -- upper_bound
- STL 源码剖析 算法 stl_algo.h -- search_n
- STL 源码剖析 算法 stl_algo.h -- partition
- SGISTL源码探究-stl_algobase.h中的算法
- STL源代码剖析——基本算法stl_algobase.h
- STL 源码剖析 算法 stl_algo.h -- inplace_merge
- STL 源码剖析 算法 stl_algo.h -- random_shuffle
- STL 源码剖析 算法 stl_algo.h -- nth_element
- STL 源码剖析 算法 stl_algo.h -- rotate
- STL源码剖析学习十七:算法之其他算法