프로그래밍/Effective STL(29)
-
[effective STL] 항목 13 : 동적으로 할당된 배열보다는 vector와 string이 낫다.
new는 많은 것을 생각하게 만든다. new는?- 언젠간 메모리를 해제해야 한다.- delete도 메모리 타입에 따라 제대로 써야 한다. 배열?- delete는 new 한번에 꼭 한번만 호출해야 한다. if var == nullptr 문이 생기지 이것때문에.. vector와 string는 메모리의 소멸을 자동으로 해준다.STL 시퀀스 컨테이너의 필수사양을 완벽히 가지고 있다. 문제점string가 참조 카운팅으로 구현된 것이 많다.- 다중 스레드 환경에서 수행 성능의 저하가 만만치 않다. 해결방법- 라이브러리의 참조 카운팅 기능을 끄는 것을 찾는다.- 참조 카운팅을 사용하지 않는 string를 구현한다.....(ㅂㄷㅂㄷ?)- string 대신에 vector를 고려해본다.
2015.10.02 -
[effective STL] 항목 10 : 할당자(allocator)의 일반적인 사항과 제약 사항
정리- 할당자를 템플릿으로 만든다. 템플릿 매개 변수에는 메모리를 할당하고자 하는 객체의 타입을 나타내는 T를 사용한다,- 포인터와 레퍼런스라는 typedef 타입을 제공하되, 항상 포인터는 T*, 레퍼런스는 T&- 할당자에는 객체별 상태를 절대로 주지 않는다. 일반적으로, 할당자는 비정적 데이터 맴버를 가질 수 없다.- 할당자의 allocate 멤버 함수에는 필요한 객체의 개수를 매개 변수로 넘긴다.(바이트 수가 아님) 이 함수는 T* 포인터(포인터라는 typedef 타입을 통해) 반환(비록 T 객체는 아직 생성되지 않았지만)한다.- 표준 컨테이너(연관 컨테이너)에서 필요로 하는 rebind라는 중첩 템플릿을 꼭 제공한다.
2015.09.14 -
[effective STL] 항목 09 : 데이터를 삭제할 때에도 조심스럽게 선택
Erase VS Remove연속 메모리 컨테이너(vector, deque, string)- erase와 remove 합성문이 가장 좋은 방법이다. 양방향 반복자를 지원하는 list에도 통하지만, list는 remove를 사용하는 것이 좋다. 표준 연관 컨테이너일 때에는(set, multiset, map) remove라는 이름을 가진 어떤 것도 소용없다.remove 알고리즘을 사용하면 컨테이너 값을 덮어써서 컨테이너를 변형시킬 수 있다.하여간 안되고, 연관 컨테이너는 erase를 사용한다.(로그시간)*시퀀스 컨테이너에 사용하는 remove 방법은 선형 시간.연관 컨테이너의 erase는 상등성이 아닌 동등성에 기반하고 있다. remove_if조건을 이용하여 해당 요소를 삭제하고 싶을 때 사용한다. 벡터에서 ..
2015.09.07 -
[effective STL] 항목 08 : auto_ptr의 컨테이너는 절대 말들지 말기
문제점auto_ptr의 특징상 소유권이 이전 되면 이전의 포인터가 NULL이 된다.정렬이나 기타 알고리즘을 사용할 때 특히 치명적이다.지역 내에 있던 포인터가 있다면 그 포인터는 지역이 끝날 때 해제가 된다.그러므로 컨테이너의 포인터가 하나 이상의 데이터가 NULL이 된다. 예시sort 함수. 변형된 퀵소트 알고리즘을 사용하고 있다.컨테이너 내의 특정 요소를 '피벗'으로 잡고 선택한 후에 분할정복.피벗은 지역에서 자동 해제된다.(가리키고 있는 원본도) 해결사용하지 말자.
2015.09.06 -
[effective STL] 항목 07 : 포인터를 컨테이너 담을 때 주의
이유컨테이너는 소멸시에 객체의 메모리를 해제하지만 포인터의 소멸자가 아무 일도 하지 않는다.포인터에 대해 delete를 하지 않기 때문!! 예제1234567891011void doSomthing(){ std::vector vwp; for (int i = 0; i
2015.09.06 -
[effective STL] 항목 06 : C++ 컴파일러의 어이없는 컴파일 조심!
예시int 데이터가 들어 있는 파일을 가지고 있고, int를 vector에 복사한다고 가정한다.1234 std::ifstream dataFile("ints.txt"); std::vector data(std::istream_iterator(dataFile), std::istream_iterator());cs 그럼 이런 코드가 생성될 수가 있다.(이렇게 복잡한 코드가...............) 실제로 구현을 해보니 data 자체를 백터로 인식조차 하지 못했다. data라는 이름의 함수로 인식. 이유인 즉슨,첫 번째 매개 변수는 dataFile이란 이름을 가진다. 타입은 istream_iterator이고 dataFile을 둘러싼 괄호는 컴파일러가 무시한다.두 번째 매개 변수는 이름을 가지고 있지 않다. 타입..
2015.09.05