본문 바로가기
Programming/Tips(C++,C#)

Algorithm : Non-modifying sequence operation

by 곰네Zip 2011. 10. 11.
참고자료
c++.com : http://cplusplus.com/reference/
일반적프로그래밍과 STL책.

저도 잘 모르는 내용이지만 제 임의대로 제가 기억하려고 올리는 것이므로 태클 환영합니다.

For_each : First - last까지 function f를 반복 수행함. F의 수행이 가장 큰 목적(리턴값 유지할수도있고 아닐수도 있다.)

Function for_eact(InputIterator first, OutputIterator last, Function f)

{

   For( ; first != last ; ++first) f(*first);

   Return f;

}

 

Find : 특정 범위 안에서 값을 찾음 (linear_search)

InputIterator find ( InputIterator first, InputIterator last, const T& value)
{

   For( ; first != last ; ++first) if( *first == value ) break;
   return first;

}

 find의 경우 특정한 값에 대해서만 찾을 수 있다. 만약 어떤 class A가 가지는 값중 하나로만 찾는것이 불가능 하다. 예를 들어, 어떠한 사람을 찾아볼 때, 이름만 가지고는 find를 할 수 없다. 이름이 같은 사람이 한둘이겠는가.


Find-if :
pred의 조건과 일치하는 것을 찾음

InputIterator find_if (InputIterator first, InputIterator last, Predicate pred)

{

   For( ; first != last ; ++first) if( pred( *first ) ) break;

   Return first;

}

find-if의 경우, find를 좀 더 확장한 버전이다. find의 경우 값 자체가 같아야만 찾지만, 이놈은 조건에 부합해야한다. 어떠한 사람을 찾을 때, 이름 및 부서등을 알고 있다면, 그 조건에 맞는 사람을 찾아낼 수 있는 것 아니겠는가.

Find_end :
결과에 가장 맞는 마지막 값을 찾음

First1, last1범위 안에서 first2~last2를 가지는 마지막 index(부분구간)를 찾는다.

ForwardIterator1 find_end (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2)

{

ForwardIterator1 it1, limit, ret;

ForwardIterator2 it2;

 

Limit = first1;

Advance(limit, 1+distance(first1, last1) – distance(first2, last2));

Ret = last1;

 

While( first != limit)

{

  It1 = first; it2 = first2;

 While( *it1 == *it2)

{

   ++it1; ++it2; if( it2 == last2) { ret= first1; break;}

}

++first1;

}

   Return ret;

}

 

Find_first_of : find와 비슷, 그러나 first2-last2 에 있는 값들 중 첫 요소가 나타나는 위치를 찾음

ForwardIterator1 find_first_of ( ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2)

{

   For( ; first1 != last1 ; ++first)

   {

     For(ForwardIterator2 it = first2 ; it!= last2 ; ++it)

     {

        If( *it == *first1)

           Return first1;

     }

   }

   Return last1;

 }


Adjacent_find :  서로 같은 인접한 요소를 찾거나, 특정 조건을 만족하는 인접한 두 요소를 찾음

ForwardIterator adjacent_find(ForwardIterator first, ForwardIterator Last)

{

   If( first != last)

   {

 ForwardIterator next = first; ++next;

 While( next != last)

   If( *first++ == *next++)

     Return first;

   }

   Return last;

}

 

Count : 요소가 몇 개 있나 세줌

Ptrdiff_t count ( InputIterator first, InputIterator last, const T& value)

{

   Ptrdiff_t ret = 0;

   While( first != last) if( *first++ == value) ++ret;

   Return ret;

}

 

Count_if : 조건에 맟는게 몇 개 있나 세줌

Ptrdiff_t count_if (InputIterator first, InputIterator last, Predicate pred)

{

   Ptrdiff_t ret = 0;

   While( first != last) if( pred(*first++) ) ++ret;

   Return ret;

}

 

Mismatch : 두 리스트 중 값이 같지 않은 요소를 리턴

Mismastch(InputIterator1 first1, InputIterator1 last, InputIterator2 first2)

{

   While( first1 != last)

   {

      If( *first1 != *first2) break;

      ++first1; ++first2;

   }

   Return make_pair(first1, first2);

}


Equal : 두 구간이 같은지 비교

Bool equal( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)

{

   While( first1 != last1)

   {

      If (*first1 != *first2) return false;

      ++first1; ++first2;

   }

   Return true;

}

 

Search: find와 비슷하지만 first2-last2의 부분구간 전체를 찾음.

ForwardIterator1 search (ForwardIterator1 first1, ForwardIterator1 last1, ForwardIterator2 first2, ForwardIterator2 last2)

{

   ForwardIterator1 it1, limit;

 ForwardIterator2 it2;

 

 Limit = first1; advance(limit, 1+distance(first1,last1) – distance(first2, last2));

   While( first1 != limit)

   {

      It1 = first1; lt2 = first2;

      While( *it1 == *it2)

      { ++it1; ++it2; if( lt2==last2) return first1;}

      ++first1; ++first2;

   }

   Return last;

}

 


 

Search_n : 구간에서 value n개 나오는 위치를 리턴해줌, , count 0이면 리턴은 true, 값은 0이다.

.. 1,1,2,3,4,5,5 일때… search_n(arr.first(), arr.end(), 2, 5); 이면 5, 5를 찾는다.

ForwardIterator search_n(ForwardIterator first, ForwardIterator last, Size count, const T& value)

{

ForwardIterator it, limit;

Size I;

Limit = first; advance(limit, distance(first, last) – count);

While( first != last){

  It = first; I = 0;

  While( *it == value){ ++it; if( ++I == count) return first; }

  ++first;

}

Return last;

}

 

반응형

댓글