내가 STL에 조예가 깊어서 글을 남기는 것이
아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면
지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다. - 최익필
이제부터 알고리즘(Algorithm)에 대해서 효율적인 사용 방법에 대해서 이야기 한다. STL 에 있어 알고리즘은 .. Containers 만큼이나 중요하다. 기본 제공되는것만도 100가지가 남지만, 이중 제일 많이 쓰이는 부분과 좋은 알고리즘(Algorithm)이지만 소개받지 못했던 부분에 대해서 이야기 한다고 하니, 눈 딱 크게 뜨고, 봐야 할 것같다.
이번 항목의 주제는 "알고리즘을 이용하여 데이터를 넣을 때, 컨테이너의 공간을 크게 잡고 넣는게 더 효율적이다." 란 것에 초점을 두고 있다.
이 이야기는 표준 Sequence Containers 중 vector, string, deque 에만 한정된다. 왜냐하면 이 Containers 는 "용량" 이란 개념이 있기 때문이다.
vector 나 string deque 같은 경우, 항목 13 ~ 항목 18까지 자세하게 설명되어져 있다.(deque 는 없지만 이 범주에 든다.) .. 이러한 특성 때문에 "범위로 기록"하는 알고리즘은 데이터가 많이 들어 간다. 이것은 vector, string, deque 에게 있어, 성능에 영향을 미칠 수 있다는 이야기이다.
미리 reserve() 나 resize() 를 호출하여, 공간을 확보하면, 이 문제는 해결 된다.
그러면, 이제 범위로 기록 Algorithm 중, transform() 에 대해서 알아보자.
transform() 은 오버로딩 되어 두가지가 있는데, 그 원리는 같으니, 하나만 코드로 보여 준다.
다른 하나(transform()의..)는 Dest의 범위를 지정하는 iterator 가 들어가면 된다. STL 보면, 자세히 나와 있으니 생략하고, 위의 코드 중에 조심해야 할것이 있다.
위의 코드 중에
출력 시작점은 Dest.begin() 으로 iterator 로 넣었는데, 이런 경우 컨테이너는 넣고자 하는 용량만큼 있다는 전제가 깔린다. 그것이 확실하지 않다면, back_inserter() 나 front_inserter(), 혹은 inserter() 를 호출하여, 밀어넣기용 iterator를 만들어서 사용 하면 된다.
이 back_inserter() 는 끝에 밀어 넣는 back_iterator 를 반환해주고 back_iterator 는 push_back() 함수를 호출하여, 넣는다. 그러므로 front_inserter() 는 push_front(), inserter() 는 insert() 를 지원하는 컨테이너에서만 사용 가능하다.
마지막으로 이 transform() 알고리즘은 선형시간 비용을 지불한다.
이것만은 잊지 말자
1. 알고리즘을 이용하여 범위 기록을 할경우, 충분히 크게 잡아 두자.
관련링크
http://www.cplusplus.com/reference/algorithm/ <-- STL Algorithm , 영문이다.
http://blog.naver.com/lhk3832/10013884530 <-- transform 사용 법
http://alones.kr/blog/673 <-- transform 타입 확인 할수 있음(대개 이런 타입이다.)
http://www.winapi.co.kr/clec/cpp4/42-2-5.htm <-- 마찬가지
이제부터 알고리즘(Algorithm)에 대해서 효율적인 사용 방법에 대해서 이야기 한다. STL 에 있어 알고리즘은 .. Containers 만큼이나 중요하다. 기본 제공되는것만도 100가지가 남지만, 이중 제일 많이 쓰이는 부분과 좋은 알고리즘(Algorithm)이지만 소개받지 못했던 부분에 대해서 이야기 한다고 하니, 눈 딱 크게 뜨고, 봐야 할 것같다.
이번 항목의 주제는 "알고리즘을 이용하여 데이터를 넣을 때, 컨테이너의 공간을 크게 잡고 넣는게 더 효율적이다." 란 것에 초점을 두고 있다.
이 이야기는 표준 Sequence Containers 중 vector, string, deque 에만 한정된다. 왜냐하면 이 Containers 는 "용량" 이란 개념이 있기 때문이다.
vector 나 string deque 같은 경우, 항목 13 ~ 항목 18까지 자세하게 설명되어져 있다.(deque 는 없지만 이 범주에 든다.) .. 이러한 특성 때문에 "범위로 기록"하는 알고리즘은 데이터가 많이 들어 간다. 이것은 vector, string, deque 에게 있어, 성능에 영향을 미칠 수 있다는 이야기이다.
미리 reserve() 나 resize() 를 호출하여, 공간을 확보하면, 이 문제는 해결 된다.
그러면, 이제 범위로 기록 Algorithm 중, transform() 에 대해서 알아보자.
transform() 은 오버로딩 되어 두가지가 있는데, 그 원리는 같으니, 하나만 코드로 보여 준다.
다른 하나(transform()의..)는 Dest의 범위를 지정하는 iterator 가 들어가면 된다. STL 보면, 자세히 나와 있으니 생략하고, 위의 코드 중에 조심해야 할것이 있다.
위의 코드 중에
출력 시작점은 Dest.begin() 으로 iterator 로 넣었는데, 이런 경우 컨테이너는 넣고자 하는 용량만큼 있다는 전제가 깔린다. 그것이 확실하지 않다면, back_inserter() 나 front_inserter(), 혹은 inserter() 를 호출하여, 밀어넣기용 iterator를 만들어서 사용 하면 된다.
이 back_inserter() 는 끝에 밀어 넣는 back_iterator 를 반환해주고 back_iterator 는 push_back() 함수를 호출하여, 넣는다. 그러므로 front_inserter() 는 push_front(), inserter() 는 insert() 를 지원하는 컨테이너에서만 사용 가능하다.
마지막으로 이 transform() 알고리즘은 선형시간 비용을 지불한다.
이것만은 잊지 말자
1. 알고리즘을 이용하여 범위 기록을 할경우, 충분히 크게 잡아 두자.
관련링크
http://www.cplusplus.com/reference/algorithm/ <-- STL Algorithm , 영문이다.
http://blog.naver.com/lhk3832/10013884530 <-- transform 사용 법
http://alones.kr/blog/673 <-- transform 타입 확인 할수 있음(대개 이런 타입이다.)
http://www.winapi.co.kr/clec/cpp4/42-2-5.htm <-- 마찬가지
'책 정리 > Effective STL' 카테고리의 다른 글
항목 35 : 대소문자를 구분하지 않는 문자열 비교는 mismatch 아니면 lexicographical_compare를 써서 간단히 구현할 수 있다. (0) | 2008.09.03 |
---|---|
항목 34 : 정렬된 범위에 대해 동작하는 알고리즘이 어떤 것들인지 파악해 두자 (0) | 2008.09.03 |
항목 33 : remove와 비슷한 알고리즘을 포인터의 컨테이너에 적용할 때에는 각별히 조심하자. (0) | 2008.09.02 |
항목 32 : 요소를 정말로 제거하고자 한다면 remove 류의 알고리즘에는 꼭 erase를 붙여 사용하자. (0) | 2008.09.02 |
항목 31 : 정렬시의 선택 사항들을 제대로 파악해 놓자. (0) | 2008.09.02 |
항목 29 : 문자 단위의 입력에는 istreambuf_iterator의 사용도 적절하다. (0) | 2008.07.27 |
항목 28 : reverse_iterator에 대응되는 기점 반복자(base iterator)를 사용하는 방법을 정확하게 이해하자. (1) | 2008.07.27 |
항목 27 : const_iterator를 iterator로 바꾸는 데에는 distance와 advance를 사용하자. (0) | 2008.07.27 |
항목 26: const_iterator나 reverse_iterator, const_reverse_iterator도 좋지만 역시 쓸만한 것은 iterator이다 (0) | 2008.07.26 |
항목 25: 현재는 표준이 아니지만, 해쉬 컨테이너에 대해 충분히 대비해 두자 (0) | 2008.07.26 |
최근댓글