📄 algorithm
字号:
if( comp(*first2, *first1) ){ *result = *first2; //Elliminate duplicates InputIterator2 temp = first2; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } }else{ *result = *first1; //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } ++result; } //Clean up remaining elements while(first1 != last1){ *result = *first1; ++result; InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } } while(first2 != last2){ *result = *first2; ++result; InputIterator2 temp = first2; while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } return result; } template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { less<typename iterator_traits<InputIterator1>::value_type> c; return set_intersection(first1, last1, first2, last2, result, c); } template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT OutputIterator set_intersection(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { while( first1 != last1 && first2 != last2){ if( comp(*first2, *first1) ){ ++first2; }else if( comp(*first1, *first2) ) { ++first1; }else{ *result = *first1; ++result; InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } ++first2; } } return result; } template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { less<typename iterator_traits<InputIterator1>::value_type> c; return set_difference(first1, last1, first2, last2, result, c); } template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT OutputIterator set_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { while( first1 != last1 && first2 != last2){ if( comp(*first1, *first2) ){ *result = *first1; ++result; //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } }else if( comp(*first2, *first1) ){ //Elliminate duplicates InputIterator2 temp = first2; while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } }else{ //They are identical - skip //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } } //Clean up remaining elements while(first1 != last1){ *result = *first1; ++result; InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } } return result; } template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { less<typename iterator_traits<InputIterator1>::value_type> c; return set_symmetric_difference(first1, last1, first2, last2, result, c); } template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp) { while( first1 != last1 && first2 != last2){ if( comp(*first1, *first2) ){ *result = *first1; ++result; //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } }else if( comp(*first2, *first1) ){ *result = *first2; ++result; //Elliminate duplicates InputIterator2 temp = first2; while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } }else{ //They are identical - skip //Elliminate duplicates InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } } //Clean up remaining elements while(first1 != last1){ *result = *first1; ++result; InputIterator1 temp = first1; while( first1 != last1 && !comp( *temp, *first1) ){ ++first1; } } while(first2 != last2){ *result = *first2; ++result; InputIterator2 temp = first2; while( first2 != last2 && !comp( *temp, *first2) ){ ++first2; } } return result; } // _lib.alg.heap.operations_, heap operations: template<class RandomAccessIterator> _UCXXEXPORT void push_heap(RandomAccessIterator first, RandomAccessIterator last) { less<typename iterator_traits<RandomAccessIterator>::value_type> c; push_heap(first, last, c); } template<class RandomAccessIterator, class Compare> _UCXXEXPORT void push_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { // *(last - 1) is the last element RandomAccessIterator begin, middle, end; begin = first; end = last - 2; if(last - first < 2){ //Empty heap return; } if ( comp(*(last-1), *end) ){ //Belongs past the end - already in place return; } while(end - begin > 1){ middle = begin + ((end - begin)/2); if( comp(*middle, *(last-1) ) ){ end = middle; }else{ begin = middle; } } if( comp(*begin, *(last-1)) ){ middle = begin; }else{ middle = end; } //Now all we do is swap the elements up to the begining --last; while(last > middle){ iter_swap(last, last-1); --last; } } template<class RandomAccessIterator> _UCXXEXPORT void pop_heap(RandomAccessIterator first, RandomAccessIterator last) { less<typename iterator_traits<RandomAccessIterator>::value_type> c; pop_heap(first, last, c); } template<class RandomAccessIterator, class Compare> _UCXXEXPORT void pop_heap(RandomAccessIterator first, RandomAccessIterator last, Compare) { --last; while(first < last){ iter_swap( first, first+1); ++first; } } template<class RandomAccessIterator> _UCXXEXPORT void make_heap(RandomAccessIterator first, RandomAccessIterator last) { less<typename iterator_traits<RandomAccessIterator>::value_type> c; make_heap(first, last, c); } template<class RandomAccessIterator, class Compare> _UCXXEXPORT void make_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { sort( reverse_iterator<RandomAccessIterator>(last), reverse_iterator<RandomAccessIterator>(first), comp); } template<class RandomAccessIterator> _UCXXEXPORT void sort_heap(RandomAccessIterator first, RandomAccessIterator last) { less<typename iterator_traits<RandomAccessIterator>::value_type> c; sort_heap(first, last, c); } template<class RandomAccessIterator, class Compare> _UCXXEXPORT void sort_heap(RandomAccessIterator first, RandomAccessIterator last, Compare comp) { sort( first, last, comp); } // _lib.alg.min.max_, minimum and maximum: template<class T> _UCXXEXPORT const T& min(const T& a, const T& b) { if(b < a){ return b; } return a; } template<class T, class Compare> _UCXXEXPORT const T& min(const T& a, const T& b, Compare comp) { if( comp(b, a) == true){ return b; } return a; } template<class T> _UCXXEXPORT const T& max(const T& a, const T& b) { if( a < b){ return b; } return a; } template<class T, class Compare> _UCXXEXPORT const T& max(const T& a, const T& b, Compare comp) { if( comp(a, b) ){ return b; } return a; } template<class ForwardIterator> _UCXXEXPORT ForwardIterator min_element(ForwardIterator first, ForwardIterator last) { less<typename iterator_traits<ForwardIterator>::value_type> c; return min_element(first, last, c); } template<class ForwardIterator, class Compare> _UCXXEXPORT ForwardIterator min_element(ForwardIterator first, ForwardIterator last, Compare comp) { ForwardIterator retval = first; ++first; while(first != last){ if( comp( *first, *retval) ){ retval = first; } ++first; } return retval; } template<class ForwardIterator> _UCXXEXPORT ForwardIterator max_element(ForwardIterator first, ForwardIterator last) { less<typename iterator_traits<ForwardIterator>::value_type> c; return max_element(first, last, c); } template<class ForwardIterator, class Compare> _UCXXEXPORT ForwardIterator max_element(ForwardIterator first, ForwardIterator last, Compare comp) { ForwardIterator retval = first; ++first; while(first != last){ if( comp( *retval, *first ) ){ retval = first; } ++first; } return retval; } template<class InputIterator1, class InputIterator2> _UCXXEXPORT bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2) { less<typename iterator_traits<InputIterator1>::value_type> c; return lexicographical_compare(first1, last1, first2, last2, c); } template<class InputIterator1, class InputIterator2, class Compare> _UCXXEXPORT bool lexicographical_compare(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, Compare comp) { while(first1 != last1 && first2 != last2){ if( comp(*first1, *first2) ){ return true; } if( comp(*first2, *first1) ){ return false; } ++first1; ++first2; } return first1==last1 && first2 != last2; } // _lib.alg.permutation.generators_, permutations template<class BidirectionalIterator> _UCXXEXPORT bool next_permutation(BidirectionalIterator first, BidirectionalIterator last) { less<typename iterator_traits<BidirectionalIterator>::value_type> c; return next_permutation(first, last, c); } template<class BidirectionalIterator, class Compare> _UCXXEXPORT bool next_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp) { if(first == last){ return false; // No data } BidirectionalIterator i = last; --i; if(i == first){ return false; //Only one element } BidirectionalIterator ii = i; --ii; //If the last two items are in order, swap them and call it done if( comp(*ii, *i) ){ iter_swap(ii, i); return true; } //This part of the algorithm copied from G++ header files ver. 3.4.2 i = last; --i; for(;;){ ii = i; --i; if ( comp(*i, *ii) ){ BidirectionalIterator j = last; --j; while ( !comp(*i, *j)){ --j; } iter_swap(i, j); reverse(ii, last); return true; } if (i == first){ reverse(first, last); return false; } } } template<class BidirectionalIterator> _UCXXEXPORT bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last) { less<typename iterator_traits<BidirectionalIterator>::value_type> c; return prev_permutation(first, last, c); } template<class BidirectionalIterator, class Compare> _UCXXEXPORT bool prev_permutation(BidirectionalIterator first, BidirectionalIterator last, Compare comp) { if(first == last){ return false; // No data } BidirectionalIterator i = last; --i; if(i == first){ return false; //Only one element } BidirectionalIterator ii = i; --ii; //If the last two items are in reverse order, swap them and call it done if( comp(*i, *ii) ){ iter_swap(ii, i); return true; } //Copied from GNU GCC header files version 3.4.2 i = last; --i; for(;;){ ii = i; --i; if ( comp(*ii, *i)){ BidirectionalIterator j = last; --j; while ( !comp(*j, *i)){ --j; } iter_swap(i, j); reverse(ii, last); return true; } if (i == first){ reverse(first, last); return false; } } }}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -