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

chapter 7-9. 내용정리

by 곰네Zip 2014. 11. 7.

1. 반복자

 반복자 카테고리와 기능

카테고리

기능

제공자

입력반복자

전방향 읽기

istream

출력반복자

전방향 쓰기

ostream, inserter

전방향반복자

전방향 읽기/쓰기

 

양방향반복자

전/역방향 읽기/쓰기

list, set, multiset, map, multimap

랜덤액세스반복자

랜덤액세스

deque, vector, string, array

 전방향 반복자는 입력/출력반복자의 기능을 포함하고, 양방향 반복자는, 전방향반복자 + 역방향 지원, 랜덤 액세스 반복자는 양방향 반복자에, 랜덤 액세스까지 지원하는 반복자.

 

   * 반복자에서 증가/감소 연산자 사용시, 전위증가(감소)연산자를 사용하는 것이 더 유리하다. 후위증가(감소)연산자의 경우 임시객체를 생성하기에 상대적으로 더 느리다.

 

 1) 보조반복자 함수

   - 랜덤 액세스 반복자만 지원하는 기능을 다른 반복자에서도 사용할 수 있게 지원하는 함수

   i) advance : 반복자 위치 변경에 사용

     advance(pos, dist n)

     n의 값 만큼 반복자를 이동한다. (n이 양수이면 뒤로, 음수이면 앞으로 이동)

 

   ii) distance : 두 반복자 사이의 거리를 계산하는데 쓰임

    distance(pos1, pos2);

    두 반복자 모두 같은 컨테이너에 존재하는 원소를 가리켜야 함.

 

   iii) iter_swap : 두 반복자가 가리키고 있는 값을 교체한다

    iter_swap(pos1, pos2)

    pos1과 pos2의 값을 교체한다. 반복자는 같은 타입일 필요 없지만, 서로 할당 가능하여야 한다.

 

 2) 역방향 반복자

   역순모드로 동작을 위해 기존의 증가/감소를 재정의한 반복자. 역방향 반복자의 경우 위치에서 하나 앞의 값을 가리킨다. 반복자 변환시 문제가 없기 위해서.

   역방향 반복자를 얻기 위해서는 컨테이너에서 rbegin(), rend()를 이용하여 반복자를 얻어오거나, 정방향 반복자를 역방향 반복자로 변환하려면 container::reverse_iterator rpos(pos); 를 이용하여 얻어온다.

   반대로 역방향 반복자를 정방향으로 변환하기 위해서는 rpos.base() 함수를 이용하여 변환한다.

 

  3) 삽입반복자

    전위삽입반복자, 후위삽입반복자, 삽입반복자가 있음.

    front_inserter(원소) : 컨테이너의 앞에 원소를 삽입

    back_inserter(원소) : 컨테이너의 뒤에 원소를 삽입

    inserter(pos, 원소) : 정한 위치에 원소를 삽입.

 

  4) 스트림 반복자

   - 알고리즘의 목적지나 소스에 스트림을 허용하는 반복자. 입/출력시 사용한다.

     출력스트림 예제

 

   입력스트림 예제

 

   5) 사용자정의 반복자

    '반복자 특성 템플릿' (value_type, difference_type, iterator_category, pointer, reference)의 정의를 제공한다.

 

    반복자 사용

 

2. 함수객체

 - 함수 객체는 ()연산자를 정의한 객체. 가지는 장점은 다음과 같다.

  1) 함수객체는 상태를 가질 수 있다. 같은 함수 객체에 대해 동시에 다른 상태를 가질 수 있음

  2) 각각의 함수 객체는 자신만의 타입을 가지므로, 함수 객체의 타입을 템플릿의 인자로 제공가능함.

  3) 함수객체는 함수포인터보다 빠르다.

 

 1) 정렬기준으로서의 함수 객체.

   예를 들어 연관 컨테이너의 정렬 조건으로서 사용하여 다른 정렬 기준을 정의할 수 있다.

 

  2) 내부상태를 가지는 함수객체

   알고리즘에서는 함수객체 내부의 상태를 변경하지 않는다. 이를 변경하고 싶으면 레퍼런스로 정의하거나 for_each문의 반환값을 이용한다.

   for_each문 예제

 

  3) 함수 어댑터

   - 함수-객체를 특정값이나 특정 함수와 결합시킨 함수객체.

   - 미리 정의된 함수 객체는 다음과 같다.

표현식

효과

bind1st(op, value)

op(value, param)

bind2nd(op, value)

op(param, value)

not1(op)

!op(param)

not2(op)

!op(param1, param2)

    위 함수 어댑터와 함수객체를 조합하여 사용할 수 있다.

 

  4) 함수 어댑터를 위한 사용자 정의 함수 객체

   - 함수어댑터와 같이 사용하기 위해 함수 객체를 만들수 있다. C++표준 라이브러리에서는 이를 위해 기본이 되는 구조체인 unary_function, binary_function을 제공한다. 이 두 구조체를 상속받아서 구현하면 된다. 아래는 두 구조체 정의

unary function

binary function

template<class Arg, class Result>

struct unary_function{

   typedef Arg argument_type;

   typedef Result result_type;

};

template<class Arg1, class Arg2, class Result>

struct binary_function{

   typedef Arg1 first_argument_type;

   typedef Arg2 second_argument_type;

   typedef Result result_type;

}

  함수객체 정의 예제 

 

 함수객체 사용예제

 

  이후 조립함수 객체 사용 예제는 아래 링크 참조

  http://gomnezip.tistory.com/320

 

3. 알고리즘

 컨테이너의 지정한 범위에 대해 원소를 처리한다. 알고리즘을 호출하는 호출자는 범위의 유효성에 대해서 보장해야 한다. 범위가 유효하지 않으면 예상치 않은 결과를 반환한다.

  1) for_each알고리즘

   - 컨테이너의 원소를 다양한 방법으로 액세스, 처리, 수정하기에 용이하다.

   - for_each를 사용하여 원소를 수정할 수 있는데, 이는 transform으로도 수행할 수 있다. for_each의 경우 수정할 원소의 값을 레퍼런스로 받아와서 처리하고, transform은 수정된 값을 반환한다. transform이 조금 더 느리지만 원본을 보존한다는 점에서 더 유연하다.

 

  2) 원소를 수정하지 않는 알고리즘

    i) 원소의 카운트 : count, count_if. (count_if는 마지막 인자로 조건자를 넣어준다.). 카운트한 결과 반환

    ii) 최대/최소 : min_element, max_element

 

   iii) 원소의 검색

     a) 검색조건과 매치되는 첫 번째 원소 검색. find, find_if. find는 value가 일치하는 첫 번째 원소. find_if는 조건자 op가 참이되는 첫 번째 원소를 찾아서 해당 위치를 반환한다.

     b) 검색조건과 매치되는 원소들이 연속적으로 n회 나타나는 경우 : search_n

    c) 첫 번째 부분범위 검색 : search

      ForwardIterator1 search(ForwardIterator1 beg, ForwardIterator1 end, ForwardIterator2 searchBeg,

                                        ForwardIterator2 searchEnd)

      - [beg,end)범위 내에 [searchBeg, searchEnd) 범위가 완전히 포함되어야 참을 리턴해 줌.

 

    d) 마지막 부분 범위 검색 : find_end

      - 부분 범위 검색이나, [searchBeg, searchEnd)를 포함한 첫 부분이 아닌 마지막으로 포함한  부분을 반환함.

 

    e) 여러개의 원소 검색 : find_first_of. [beg,end)범위 내에 [searchBeg, searchEnd) 범위에 속하는 값들을 검색. find와 비슷하지만, 값이 아닌 범위를 검색한다.

 

    f) 연속 중복원소의 검색 : adjacent_find

     예제)

 

iv)범위 비교

  a) 동일성 검사 : [beg,end)에서 col2[Beg,end)이 범위 안에 포함되어야 한다. (시작 아이템도 match가 되어야 한다.)

 

  b) 두 범위 내에서 다른 값 존재 여부 검색 : mismatch. 조건에 맞지않는 원소의 위치를 반환한다. (반복자)

 

 

   c) 사전식 방법으로 적은지를 판단 : lexicographical_compare

   

 이후 각 알고리즘에 대한 설명은 http://gomnezip.tistory.com/321 참조

 

반응형

댓글