프로그래밍/Effective STL(29)
-
[effective STL] 항목 27 : const_iterator -> iterator는 distance와 advance를 사용하자.
핵심(우리가 해서는 안 될 짓)const_iterator와 iterator는 서로 다른 클래스이다.string과 complex의 관게보다도 멀다고 한다.한 마디로 캐스팅이 안 된다. 전혀 엉뚱한 클래스를 캐스팅하려 하지 말자. 해결(const_it -> it)과정1. 컨테이너의 첫 요소를 가리키는 iterator를 생성한다.2. const_iterator가 가리키는 곳 까지 iterator가 뛰면 끝! so simple!3. 거리 계산엔 distance와 점프엔 advance가 사용된다. 그럼 이렇게 하면 되는가?1advance(i, distance(it, constIt));cs안 된다고 하신다. distance의 선언문을 보자12template typename ierator_traits::differe..
2016.02.15 -
[effective STL] 항목 26 : 여러 iterator 중 쓸만한 것은 결국 iterator
총 4개의 iterator를 제공한다. iterator, const_iterator, reverse_iterator, const_reverse_iterator 일종의 T*, const T*, 그리고 head 부터인지 tail 부터인지 차이다. iterator의 변환 관계는 다음과 같다. iterator가 좋은 이유 - 어떤 형태의 insert나 erase 멤버 함수는 무조건 iterator만을 넘겨야 한다. - const_iterator를 iterator로 암묵적 변환할 방법이 없다. 방법이 있지만 성능과 안정성이 보장되지 않는다. - reverse_iterator를 iterator로 변환할 수 있지만 변환 후 약간의 조정이 필요하다. const_iterator와 iterator를 동시에 사용할 시 팁 ..
2016.02.10 -
[effective STL] 항목 24 : map에서 []나 insert는 효율 문제에 주의하자.
1234567891011class Widget {public: Widget(); Widget(double weight); Widget& operator=(double weight); ...}; ... map mW;cs double 값을 이용하여 widget을 초기화 할 수 있다. 이렇게 자료구조가 있을 때 두 가지 정도 작업이 있을 수 있다.1. map에 값을 넣으며 초기화.2. map에 들어가 있는 값을 변경하는 작업. 보통은 둘 다 이렇게 사용한다.1mW[1] = 1.50;cs map의 operator[] 연산자의 특징추가 아니면 갱신(add or update) 기능을 수행하도록 설계되어 있다. 1mW[k] = v;cs 키 값 k가 들어 있는지 점검 -> 그렇지 않다면 k와 v를 페어로 묶어 맵에 새..
2016.02.07 -
[effective STL] 항목 23 : 연관 컨테이너 대신 정렬된 벡터를 쓰는 것이 좋을 때도 있다.
일반적으로 빠른 데이터 검색을 지원하는 자료구조가 필요하면?바로 떠오르는 것은 연관 컨테이너다. 표준 연관 컨테이너는 전형적으로 균형 이진 탐색 트리로 되어있다.삽입, 삭제, 탐색이 아무 때나 이루어질 때 유리한 구조.But, 많은 프로그램들이 실제로 이런 극단적으로 혼란스러운 구조를 가지지 않는다. 대개 프로그램에서 자료구조를 사용하는 3단계1. Setup : 자로 구조를 만든다. 데이터 삽입과 삭제가 대부분이며 탐색은 거의 일어나지 않는다.2. Lookup : 셋업이 끝난 자료 구조 중 원하는 정보를 찾는다.3. Reorganize : 자료 구조의 내용물을 바꾼다. 1과 비슷한 일을 하며 작업이 끝나면 2로 진입한다. 이러한 프로그램이라면 벡터가 연관 컨테이너보다 훨씬 나은 수행성능을 제공할 가능성이..
2016.02.07 -
[effective STL] 항목 22 : set과 multiset의 키를 바꾸지 말자.
map과 multimap에 대한 직접적인 키 변경은 불가능하다.(캐스팅만 하지 않으면)set과 multiset은 그것이 가능하다. set과 multiset 내의 데이터 요소가 const가 아닌 이유일반적으로 표준화 위원회의 의도이다.map 종류는 key만 const면 되고 set은 값이 const가 아니어야 된다는 것. 한 마디로 set은 값 자체 또는 객체 내부의 값이 key 값이 된다.나머지 자료는 언제든 변환이 가능해야 된다. map은 key가 이미 있으므로 value 값의 경우 뭐든 상관 없다. 하지만내 환경에선 set으로 설정하면 STL 차원에서 바로 에러를 리턴해줬다.책에서도 어떤 STL에서는 이 코드를 거부한다더니 내가 사용하는 STL이 이 어떤 STL이었다. 12345// Error// i..
2016.02.07 -
[effective STL] 항목 21 : 연관 컨테이너용 비교 함수는 ==에 대해선 false를 반환해야 한다.
예제set정의 시 less_equal를 사용하게 되면같은 값 10을 두 번 insert 하게 된다면? less_equal 비교 함수에 의해 표현식이 참인지를 검사한다.!(10
2016.01.03