STL(12)
-
[effective STL] 항목 17 : 용량 바꿔치지 묘수(swap)
예시100000명의 지원자를 담는 백터가 있다고 했을 때,지원자가 줄어들때마다 백터에서 erase된다.10명이 남게 되었을 때, 용량은 그대로 100000이다. 어떻게 해야하는가? 방법swap을 통한 방법이다.복사생성자를 이용하여 나오는 임시객체와 기존 객체를 스왑한다. 1234567891011121314151617181920212223242526272829303132333435363738#include #include #include void printSizeAndCapacity(const std::vector& vec){ std::cout
2015.12.26 -
[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] 항목 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 -
[STL] vector의 at()과 []의 차이
서론같은 역할을 하는데 왜 이렇게 STL에선 두 가지를 지원하는 것일까! 내부를 보자!그러하다.. 내부를 뜯어보니 답이 나왔다. at은 size()를 체크함으로써 속도가 느리긴하지만 안정성이 높고 디버깅에 용이하다.하지만 오퍼레이터[]는 속도는 빠르나 치명적인 에러를 발생시킬 수 있다.
2015.07.11