프로그래밍/Effective STL(29)
-
맴버 함수는 단일 요소 단위 보단 요소의 범위 단위로 (effective STL 05)
돌발퀴즈!두 개의 백터 v1과 v2가 있다. v1의 내용을 v2의 뒤쪽 반과 똑같이 만드는 가장 빠른 방법이 뭘까? 답1v1.assign(v2.begin() + v2.size()/2, v2.end());cs 퀴즈의 의미첫번째 의미는 assign이라는 멤버 함수가 있다는 사실을 알려주기 위해. 아주 편리한 녀석!- 표준 시퀀스 컨테이너라면 모두 사용 가능(vector, string, deque, list)- 프로그래머들은 컨테이너의 내용을 완전히 교체하고 싶다라고 생각하면 먼저 떠오르는건 대입(assignment)- 컨테이너에 어떤 값의 집합을 한꺼번에 채우려 할 때 operator=가 원하는 대로 동작하지 않는다. 두 번째 의미는 제목의 실 예를 보여주는 것. 왜 범위 멤버 함수가 더 좋은가?- 범위 멤..
2015.08.27 -
size() == 0? empty()!! (effective STL 04)
empty()는 인라인함수! (상수시간)list의 size()는 선형 시간에 수행되는 경우가 꽤 많다. list에서 왜 문제가 되는가?size() vs splice()- splice()는 리스트를 중간에 잘라 붙이는 함수이다.- size()와 splice()는 하나는 상수 시간, 다른 하나는 선형 시간일 수 밖에 없다.- splice()가 잘려서 넘어갈 때 이것을 셀 것인가? 에 대해 작성 방식에 따라 다르다.- splice()를 세어 총 크기에 더해주면 splice()는 선형, size()는 상수- splice()를 세지 않고 붙여주면 splice()는 상수, size()는 선형
2015.08.25 -
복사는 컨테이너 안의 객체에 맞게 비용 최소화, 동작은 정확히(effective STL 03)
STL의 방식copy in, copy out!컨테이너에서 넣거나 뺄 때 복사. 복사가 왜?STL에서 복사는 거의 모든 순간에 일어난다.- 큰 객체를 컨테이너에 넣을 때에 단순히 객체를 컨테이너에 넣으면수행 성능의 병목현상을 일으킨다는 것.- 상속된 객체의 경우 복사 동작 중에 데이터가 잘리기도 한다.(복사 손실) 포인터를 넣으면?포인터만 복사하므로 뒤의 문제가 생기지 않는다.하지만.. 이것도 STL의 골칫거리다.(뒤의 장에서 자세히 다루지만 대충 remove 계열 함수에서 메모리 누수나 다른쪽을 가리키는 현상 등등)해결은 스마트 포인터가 괜찮은 방법 배열 vs 백터STL은 일반적으로 "불필요한"복사를 피하도록 설계되어있다.12Widget w[size];vector ww;cs line1은 size개의 Wi..
2015.08.25 -
컨테이너 독립적인코드라는 환상 조심!(effective STL 02)
STL은 일반화(generalization)에 기초를 두고 만든 프로그래밍 장치.데이터 집합 - 컨테이터(데이터의 타입은 매개 변수화) 일반화함수 - 알고리즘(반복자의 타입은 매개 변수화) 일반화포인터 - 반복자(포인터가 가리키는 객체의 타입은 매개 변수화) 일반화 컨테이너 타입은 시퀀스와 연관 컨테이너로 일반화.표준 연속 메모리 컨테이너 - 임의 접근 반복자를 쓸 수 있다.노드 기반 컨테이너 - push_back, push_front 지원.연관 컨테이너 - 로그 시간 복잡도를 가진 lower_bound, upper_bound, equal_range 지원. 반복자, 포인터, 참조자를 무효화시키는 방식이 컨테이너마다 다르다.독립적인 코드라고 좋은 것이 아니다. STL 컨테이너는 각자 자신만의 장점과 약점을..
2015.08.25 -
적재적소 알맞은 컨테이너(effective STL 01)
종류를 알아보자.Sequence Container : vector, string, deque, listAssociative Container : set, multiset, map, multimap비표준 Sequence : slist(single linked list), rope(대용량 string).비표준 Associative Constainer : hash_set, hash_multiset, hash_map, hash_multimap.String 대신 사용되는 vector : 간혹 이렇게 쓰면 괜찮을 때가 있다.표준 연관 컨테이너 대신 사용되는 vector : vector가 수행 속도나 크기 면에서 표준 연관 컨테이너보다 더 나은 경우가 있다.STL에 속하지 않는 표준 컨테이너 : 배열(C++ 배열),..
2015.08.25