⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 algorithm

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻
📖 第 1 页 / 共 4 页
字号:
			InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
	{
		while( first1 != last1 && first2 != last2){
			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 + -