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; } |
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; } |
댓글