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

📄 algorithm

📁 从FFMPEG转换而来的H264解码程序,VC下编译..
💻
📖 第 1 页 / 共 4 页
字号:
     ++e;
     ++b;
    }
    else if (pivot < b)
    {
     iter_swap(pivot, b);
     pivot = b;
    }
    else
    {
     ++b;
    }

    if (b == e)
    {
     assert(comp(*pivot , *b));
     if (pivot < b)
     {
      iter_swap(pivot, --b);
      return make_pair(b, e);
     }
     assert(pivot > e);
     iter_swap(pivot, b);
     return make_pair(b, b + 1);
    }
   }
  }

  static inline unsigned short rand2(void)
  {
   static unsigned int a = 18000;
   static unsigned int g_PrivateRandom2AlgoSeed = 521288629;
   return (unsigned short)(g_PrivateRandom2AlgoSeed =
    a * (g_PrivateRandom2AlgoSeed & 65535) +
    (g_PrivateRandom2AlgoSeed >> 16));
  }

  template <class Iter,class Compare> Iter SelectPivot(Iter b, Iter e,Compare comp)
  {
   assert(b < e);

   typedef typename iterator_traits<Iter>::difference_type difference_type;
   const size_t size = size_t(e - b);

   assert(size >= 3);
   const size_t innerSize = size - 2;
   const size_t offset = (rand2() * innerSize) >> 16u;
   assert(offset < innerSize);
   const Iter m = b + offset + 1;
   assert(b < m && m < e);

   // Sort in-place b, m, and e
   --e;
   if (comp(*m , *b))
   {
    if (comp(*e , *m))
    {
     // *e < *m < *b
     iter_swap(b, e);
    }
    else
    {
     if (comp(*e , *b))
     {
      // *m <= *e < *b
      iter_swap(b, m);
      iter_swap(m, e);
     }
     else
     {
      // *m < *b <= *e
      iter_swap(b, m);
     }
    }
   }
   else
   {
    if (comp(*e , *b))
    {
     // *e < *b <= *m
     iter_swap(b, e);
     iter_swap(m, e);
    }
    else
    {
     if (comp(*e , *m))
     {
      // *b <= *e < *m
      iter_swap(m, e);
     }
     else
     {
      // *b <= *m <= *e
      // nothing to do
     }
    }
   }

   assert(!(comp(*m , *b)));
   assert(!(comp(*e , *m)));
   return m;
  }

 }

 template <class Iter, class Compare> void unstable_sort(Iter b, Iter e,Compare comp)
 {
  assert(e >= b);
  // The second branch of Quicksort's recursion is implemented through
  //      iteration, hence the following loop
  size_t length;
  while ((length = static_cast<size_t>(e - b)) > 1)
  {
   enum { threshold = 8 };
   if (length <= threshold)
   {
    //InsertionSorter<Iter, threshold, 1>::Run(b, length);
    SortPrivate::SelectionSorter<Iter, threshold,Compare>::Run(b, length, comp);
    return;
   }
   const pair<Iter, Iter> midRange = SortPrivate::Partition(b, e, SortPrivate::SelectPivot(b, e, comp), comp);
   assert(midRange.second - midRange.first > 0);
   assert(b <= midRange.first);
   assert(midRange.second <= e);
   if (midRange.first - b < e - midRange.second)
   {
    unstable_sort(b, midRange.first,comp);
    b = midRange.second;
   }
   else
   {
    unstable_sort(midRange.second, e,comp);
    e = midRange.first;
   }
  }
	}

	template<class RandomAccessIterator> void stable_sort(RandomAccessIterator first, RandomAccessIterator last){
		less<typename iterator_traits<RandomAccessIterator>::value_type> c;
		stable_sort(first, last, c);
	}

	template<class RandomAccessIterator, class Compare> _UCXXEXPORT
		void stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp)
	{
		//FIXME - bubble sort
		RandomAccessIterator temp;
		--last;
		while(last - first > 0){
			temp = last;
			while(temp != first){
				if( comp( *temp, *(temp-1) ) ){
					iter_swap( temp-1, temp);
				}
				--temp;
			}
			++first;
		}
	}

	template<class RandomAccessIterator> _UCXXEXPORT
		void partial_sort(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last)
	{
		less<typename iterator_traits<RandomAccessIterator>::value_type> c;
		partial_sort(first, middle, last, c);
	}
	template<class RandomAccessIterator, class Compare> _UCXXEXPORT
		void partial_sort(RandomAccessIterator first, RandomAccessIterator middle,
			RandomAccessIterator last, Compare comp)
	{
		//Fixme - partial bubble sort
		RandomAccessIterator temp;
		--last;
		while(first < middle){
			temp = last;
			while(temp != first){
				if( comp(*temp, *(temp -1 ) ) ) {
					iter_swap( temp-1, temp);
				}
				--temp;
			}
			++first;
		}
	}
	template<class InputIterator, class RandomAccessIterator> _UCXXEXPORT
		RandomAccessIterator
		partial_sort_copy(InputIterator first, InputIterator last,
			RandomAccessIterator result_first, RandomAccessIterator result_last)
	{
		less<typename iterator_traits<RandomAccessIterator>::value_type> c;
		return partial_sort_copy(first, last, result_first, result_last, c);
	}
	template<class InputIterator, class RandomAccessIterator, class Compare> _UCXXEXPORT
		RandomAccessIterator
		partial_sort_copy(InputIterator first, InputIterator last,
			RandomAccessIterator result_first, RandomAccessIterator result_last, Compare comp)
	{
		size_t output_size = last-first;
		size_t temp_size = result_last - result_first;
		if(temp_size < output_size){
			output_size = temp_size;
		}

		RandomAccessIterator middle = result_first + output_size;
		RandomAccessIterator temp = result_first;

		while(temp != middle){
			*temp = *first;
			++temp;
			++first;
		}
		sort(result_first, middle, comp);

		while( first != last){
			if( comp( *first, *(middle-1) ) ){
				*(middle-1) = *first;
				sort(result_first, middle, comp);
			}
			++first;
		}

		return middle;
	}
	template<class RandomAccessIterator> _UCXXEXPORT
		void nth_element(RandomAccessIterator first, RandomAccessIterator nth, RandomAccessIterator last)
	{
		less<typename iterator_traits<RandomAccessIterator>::value_type> c;
		nth_element(first, nth, last, c);
	}
	template<class RandomAccessIterator, class Compare> _UCXXEXPORT
		void nth_element(RandomAccessIterator first, RandomAccessIterator nth,
			RandomAccessIterator last, Compare comp)
	{
		partial_sort(first, nth, last, comp);
	}

	template<class ForwardIterator, class T> _UCXXEXPORT
		ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
			const T& value)
	{
		less<typename iterator_traits<ForwardIterator>::value_type> c;
		return lower_bound(first, last, value, c);
	}

	template<class ForwardIterator, class T, class Compare> _UCXXEXPORT
		ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last,
			const T& value, Compare comp)
	{
		if(first == last){
			return last;
		}
		//If below or equal to the first element
		if( comp(*first, value) == false){
			return first;
		}
		ForwardIterator middle;

		//If greater than the top element
		middle = first;
		advance(middle, distance(first, last) - 1);
		if( comp(*middle, value) ){
			return last;
		}

		//Now begin the actual search for the begining
		while( distance(first, last) > 1 ){
			//Find middle
			middle = first;
			advance(middle, (distance(first, last)/2) );
			if( !comp(*middle, value) ){
				last = middle;
			}else{
				first = middle;
			}
		}

		if( !comp(*first, value) ){
			return first;
		}
		return last;
	}

	template<class ForwardIterator, class T> _UCXXEXPORT
		ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
			const T& value)
	{
		less<typename iterator_traits<ForwardIterator>::value_type> c;
		return upper_bound(first, last, value, c);
	}


	template<class ForwardIterator, class T, class Compare> _UCXXEXPORT
		ForwardIterator upper_bound(ForwardIterator first, ForwardIterator last,
			const T& value, Compare comp)
	{
		if(first == last){
			return last;
		}
		//If below the first element
		if( comp(value, *first) == true){
			return first;
		}

		ForwardIterator middle;

		//If greater than the top element
		middle = first;
		advance(middle, distance(first, last) - 1);
		if( comp(*middle, value) ){
			return last;
		}

		//Now begin the actual search for the end
		while( distance(first, last) > 1 ){
			//Find middle
			middle = first;
			advance(middle, (distance(first, last)/2) );
			if( comp(value, *middle) ){
				last = middle;
			}else{
				first = middle;
			}
		}

		if( comp(value, *first) ){
			return first;
		}
		return last;
	}


	template<class ForwardIterator, class T> _UCXXEXPORT
		pair<ForwardIterator, ForwardIterator>
		equal_range(ForwardIterator first, ForwardIterator last, const T& value)
	{
		less<typename iterator_traits<ForwardIterator>::value_type> c;
		return equal_range(first, last, value, c);
	}

	template<class ForwardIterator, class T, class Compare> _UCXXEXPORT
		pair<ForwardIterator, ForwardIterator>
		equal_range(ForwardIterator first, ForwardIterator last, const T& value, Compare comp)
	{
		pair<ForwardIterator, ForwardIterator> retval;
		retval.first = lower_bound(first, last, value, comp);
		//Reuse retval.first in order to (possibly) save a few comparisons
		retval.second = upper_bound(retval.first, last, value, comp);
		return retval;

	}

	template<class ForwardIterator, class T> _UCXXEXPORT
		bool binary_search(ForwardIterator first, ForwardIterator last,
			const T& value)
	{
		less<typename iterator_traits<ForwardIterator>::value_type> c;
		return binary_search(first, last, value, c);
	}

	template<class ForwardIterator, class T, class Compare> _UCXXEXPORT
		bool binary_search(ForwardIterator first, ForwardIterator last,
			const T& value, Compare comp)
	{
		if( distance(first, last) == 0){
			return false;
		}

		ForwardIterator middle;

		while( distance(first, last) > 1 ){
			//Set middle between first and last
			middle = first;
			advance(middle, distance(first, last)/2 );

			if( comp(*middle, value ) == true){
				first = middle;
			}else{
				last = middle;
			}
		}

		if( !comp(*first, value) && !comp(value, *first) ){
			return true;
		}
		if( !comp(*last, value) && !comp(value, *last) ){
			return true;
		}

		return false;
	}

	// _lib.alg.merge_, merge:
	template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT
		OutputIterator
		merge(InputIterator1 first1, InputIterator1 last1,
			InputIterator2 first2, InputIterator2 last2, OutputIterator result)
	{
		less<typename iterator_traits<InputIterator1>::value_type> c;
		return merge(first1, last1, first2, last2, result, c);
	}
	template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT
		OutputIterator
		merge(InputIterator1 first1, InputIterator1 last1,
			InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp)
	{
		while( first1 != last1 && first2 != last2){
			//If in this order so first1 elements which are equal come first
			if( comp(*first2, *first1) ){
				*result = *first2;
				++first2;
			}else{
				*result = *first1;
				++first1;
			}
			++result;
		}
		//Clean up remaining elements
		while(first1 != last1){
			*result = *first1;
			++first1;
			++result;
		}
		while(first2 != last2){
			*result = *first2;
			++first2;
			++result;
		}
		return result;
	}
	template<class BidirectionalIterator> _UCXXEXPORT
		void inplace_merge(BidirectionalIterator first,
			BidirectionalIterator middle, BidirectionalIterator last)
	{
		less<typename iterator_traits<BidirectionalIterator>::value_type> c;
		inplace_merge(first, middle, last, c);
	}
	template<class BidirectionalIterator, class Compare> _UCXXEXPORT
		void inplace_merge(BidirectionalIterator first,
			BidirectionalIterator middle, BidirectionalIterator last, Compare comp)
	{
		//FIXME - using a bubble exchange method
		while(first != middle && middle !=last){
			if( comp(*middle, *first) ){
				BidirectionalIterator temp(middle);
				while( temp != first){
					iter_swap(temp, temp-1);
					--temp;
				}
				++middle;
			}
			++first;
		}
	}

	// _lib.alg.set.operations_, set operations:
	template<class InputIterator1, class InputIterator2> _UCXXEXPORT
		bool includes(InputIterator1 first1, InputIterator1 last1,
			InputIterator2 first2, InputIterator2 last2)
	{
		less<typename iterator_traits<InputIterator1>::value_type> c;
		return includes(first1, last1, first2, last2, c );
	}

	template<class InputIterator1, class InputIterator2, class Compare> _UCXXEXPORT
		bool includes(InputIterator1 first1, InputIterator1 last1,
			InputIterator2 first2, InputIterator2 last2, Compare comp)
	{
		while(first2 != last2){
			//Advance the large set until no longer smaller than the element we are looking for
			while( comp(*first1, *first2) ){
				++first1;
				//If we are at the end of the list, we don't have the desired element
				if(first1 == last1){
					return false;
				}
			}
			//If we are past the element we want, it isn't here
			if( comp(*first2, *first1) ){
				return false;
			}
			++first2;	//Move to next element
		}
		return true;
	}

	template<class InputIterator1, class InputIterator2, class OutputIterator> _UCXXEXPORT
		OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
			InputIterator2 first2, InputIterator2 last2, OutputIterator result)
	{
		less<typename iterator_traits<InputIterator1>::value_type> c;
		return set_union(first1, last1, first2, last2, result, c);
	}

	template<class InputIterator1, class InputIterator2, class OutputIterator, class Compare> _UCXXEXPORT
		OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -