ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 전문가를 위한 C++ 정리(3)
    @ 16. 1 ~ 17. 1/C++ 2015. 4. 21. 14:52

    50.2. multimap

    multimap은 아래 몇가지 빼고는 map과 같다.

    1. operator[]을 지원하지 않음

    2. map inset()는 pair를 리턴했지만 multimap의 insert는 반복자를 바로 리턴

    3. find메서드도 임의의 항목만 리턴(임의다!!)

     

    50.3 set

    map과의 차이점은 키/값 쌍 대신에 값 자체가 키역활을 함. 그리고 operator[] 지원x

    * multiset도 있다.

     

    51. 비순차 연관 컨테이널 - 해시테이블

    51.1.1 해시 테이블..?

    새로운 컨테이너 항목을 저장할때 정렬을 하지 않는다.

    unordered_map, set, multimap, multiset

     : 테이블 구현시 버킷?이라는 배열을 만들고..해시함수의 키를 이러한 버킷에 인덱스 번호로 매핑..

    키와 연관된 값은 매핑된 버킷에 저장..두개 이상의 키에 대한 결과가 같다? 이것을 해시 충돌이라고 함..

    (STL에서는 특별히 충돌에 알고리즘을 사용하진 않음.)

     

    51.1.2 unordered_map

    template<class key, class T, class hash=hash<key>,

     class Pred=std::equal_to<key>, class Alloc=std::allocator<std::pair<const Key,T>>

     class unordered_map;

    키 타입, 값 타입, 해시 타입, 등호 비교타입, 할당자 타입

     

    52. bitset

    STL 컨테이너가 아님..자유롭게 항목 타입을 지정 못하고 반복자도 지원하지 않음..

    생성자는 2개로 디폴트 생성자는 모든 비트를 0으로 초기화 추가로 문자 0,1로 된 string을 인자로 받아 초기값을 설정하는 생성자도 있음..

    operator[]를 이용해 비트값에 접근할 수 있음.

     

    비트 연산(모든 비트 연산자를 적용할 수 있다)

     

    53. STL 알고리즘 (헤더 : <algorithm>)

    : 일부 예외는 있지만 컨테이너의 종류와 관계없이 상호연동될 수 있는 다양할 종류의 제네릭 알고리즘까지 제공함....(단지 반복자 인터페이스에만 의존하여 동작..)

    이렇게 가능한 이유는..반복자를 매개로 사용하기 떄문임..

     

    53.1. find() find_if()알고리즘

    find()알고리즘은 주어진 반복자 범위 안에서 특저항목을 찾음..(어떤 컨테이너 타입에도 적용)

    find() 성공시 : 해당 항목접근하는 반복자 리턴

            실패시 : 인자로 넘겨받은 종료 반복자 리턴

    find_if() : 단순 항목이 같은지 다른지 비교하는게 아니라 선택용 콜백함수를 인자로 받아 이용한다는 점...

    (선택용 콜백함수 : 사용자가 직접 작성하여 넘겨주는 함수)

     

    53.2 accumulate() 함수(헤더 : <numeric>)

    누적 연산을 지원(그것도 주어진 항목범위에 대해서 산술합계를 구하는것)

    double sum=accumulate(nums.begin(), num.end(), 0); // 이런느낌? 여기서 nums는 vector

    또한 사용자 직접 정의 콜백함수...근데 인자가 두개여야함..

    int product(int num1, int num2){

    return num1* num2;} 이런식으로..

    위의 예를 활용하면

    double sum=accumulate(nums.begin(), num.end(), 1, product); // 1은 초기 셋팅값

     

    54. 람다 표현식

    익명함수를 그 자리에서 인라이닝 할 수 있게 해주는것..을..람다표현식..

    표현식 : [캡처 블록](파라미터 목록) mutable 익셉션_목록 -> 리턴 타입{ 함수 바디}

    생략가능     생략가능  생략가능         생략가능

     

    []{cout << "Hello frome Lambda" << endl;} (); //();는 람다표현식을 즉시 실행시키는 역할을 한다.

    파라미터 목록, 리턴 타입 생략한 단순히 hello frome lambda 출력..

    아래는 string 파라미터와 리턴타입을 사용하는 결과는 result에 저장하는..

    string result=[](const string& str)->string{reurn "Hello frome" + str;}("second Lambda");

    파라미터 사용시

    1. 디폴트 값 지정못함, 가변 크기 허용안함, 이름이 반드시 지정되어야함

    리턴 타입 사용시

    1. 생략하면 자동으로 리턴타입 지정 바디가 {return experssion;}일 경우 expression이 리턴타입임

    그외는 void취급

     

    람다표현식을 함수 포인터에 저장하고 함수 포인터를 통해 실행할수도 있음..

    auto fn=[](const string& str)->string{reurn "Hello frome" + str;};  //여긴 ()없음..

    cout << fn("call 1") << endl; 이런식으로 사용.//()이게 없으니까..

     

    [] 람다표현식이 정의도고 있는 스코프에서 접근가능한 바깥 변수를 람다 표현식의 바디에서 어떻게 접근할지 지정..

    [=] 모든 변수 값으로 복제 [&] 모든변수 참조로..(단 시점에 해당 변수가 유효해야함..)

    [&x]x변수 참조로 다른변수 없음 [&, x] 모든 변수 디폴트 참조 변수 x에 대해선 값으로..

     

    * STL은 함수 객체의 래퍼 클래스 std::function을 지원..함수 포인터와 비슷한 역활

    (헤더 : <functional>) 파라미터와 리턴 타입만 일치한다면..모두 감쌈..

    예:) 리턴 타입 double 두개의 int 파라미터 함수의 래퍼는

    function<double(int,int)> myWrapper;

    그럼 이것을 이용하여.. 람다 표현식을 함수에서 리턴..

    function<int(void)> multiply(int x) //반환값이.. function<int(void)> 그럼? 리턴 int에 파라미터 void

    {

    return [=]()->int{return 2*x}; //갭쳐블록은[=]이고 모두 값..복제 파라미터 목록없고..int리턴 타입

                                             //바디는 return 2*x;

    }

    위의 함수를

    function<int(void)> fn=multiply(5); // auto fn도 됨..

    cout << fn() << endl; 이런식으로 사용가능함..

    근데 저기서 [=] -> [&]가 안되는 이유는 실행시점에 변수가 유효하지 않음..실행시점은 return 때 인데..변수는 그때 이미 사라짐..

     

    ** stl 알고리즘

    count_if() 특정 조건에 합치되는 항목의 개수 확인

    generate() 주어진 반복자 범위를 특정 값으로 셋팅

    for_each() 주어진 반복자 범위의 모든 항목에 대해 특정작업 수행

     

    55. 함수 객체

    stl 알고리즘 이용할때 함수 객체를 함수 포인터 대신 넘겨줄 수 있다.

     

    55.1 함수 객체 어댑터

    표준에서 제공되는 함수 객체를 이용하려다보면 인터페이스상 짝이 맞지 않는 경우가 발생..(인자의 개수등..)

    이럴떄 함수 어댑터는 문제를 해결한다.

     

    56.

     


    13.3 함수 객체는 반드시 다시 읽어봐야함..;

    13.3 ~ 15까지 그냥 넘김..

Designed by Tistory.