프로그래밍/Effective STL(29)
-
[effective STL] 항목 20 : 연관 컨테이너에 포인터 넣을 때 비교 함수자 타입을 정해주기
Sourcehttps://github.com/ElementalKiss/Cpp/blob/master/Example/AssociateContainerAndPointer.cpp 간단한 예제123456789 std::set ssp; ssp.insert(new std::string("koko")); ssp.insert(new std::string("love")); ssp.insert(new std::string("elki")); ssp.insert(new std::string("momo")); // 해당 방법으로 출력하며 원하는 순서가 나오지 않는다. // 그냥 넘겨주면 포인터 값으로 정렬하게 된다. std::for_each(ssp.begin(), ssp.end(), print);cs 결과는 koko, love,..
2015.12.27 -
[effective STL] 항목 18 : vector<bool> 쓰지마
서론vector은 STL 컨테이너로서 두 가지가 부실하다.- 첫째는 STL 컨테이너가 아니다.- 둘째는 bool을 담고 있지도 않다. 실제로 vector은 bool을 압축시킨 데이터 표현 방식으로 구현되어 있다.한 바이트에 여덟 개의 bool을 담을 수 있게 구현.(이게 무슨 짓이지?)프록시 객체라고 불리는 패턴을 쓰고 있다. 실제로 안 되는 예시123 std::vector boolVec; bool* pb = &boolVec[0]; //error C2440: 'initializing' : cannot convert from 'std::_Vb_reference *' to 'bool *'cs 그럼 정확한 bool을 담는건 뭐야?deque, bitset을 사용하면 된다.
2015.12.26 -
[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] 항목 16 : 기존 C API에 vector와 string 넘기기
Sourcehttps://github.com/ElementalKiss/Cpp/blob/master/Example/VectorAndStringUsingCAPI.cpp 서론기존에 잘 구현되어 있는 C API를 사용하는데 vector와 string을 쓰는데 뭔가 깨림찍한게 있다. vector - &vec[0]을 통해 포인터를 넘긴다.string - str.c_str() 함수를 통해 문자열 포인터를 넘긴다. begin?begin()은 엄연히 반복자를 반환하므로 헷갈리면 안된다. 굳이 사용하겠다면 &*vec.begin() 형태로....(이건 좀 아닌듯) string은 왜 함수를 사용하는가?- string의 데이터 자체가 연속 메모리에 저장되도록 규정되어 있지 않다.(아닐수도 있다는 이야기)- string의 내부 ..
2015.12.26 -
[effective STL] 항목 15 : string은 여러 가지 방식으로 구현되어 있다.
정리string의 문자열 값은 참조 카운팅일 수 있다.- 많은 라이브러리가 참조 카운팅을 사용한다.- 물론 참조 카운팅 기능을 끌 수 있는 방법도 대개 제공한다. string 객체 자체의 크기는 다양할 수 있다. 문자열을 새로 생성할 때 필요한 메모리 할당 회수는 0~2번이 될 수 있다. 둘 이상의 string 객체가 문자열 크기나 용량 정보를 함게 가질 수도 있고, 그렇지 않을 수도 있다. 문자 버퍼를 위해 할당하는 메모리의 최소량에 대한 정책은 모두 다르다. string 객체 구현에 일반적인 요소들필수문자열 크기, 용량, 문자열 선택할당자, 참조 카운트 이건 뭐 지 맘대로 다 구현되어 있으니.. 잘 보고 잘 써란 소리.
2015.12.17 -
[effective STL] 항목 14 : 재할당 방지 reserve
STL의 컨테이너는 프로그래머가 신경쓰지 않고 요소를 늘릴 수 있다. 제약 - 최대 크기를 넘지 않는 하. 컨테이너 최대 크기를 넘으면?- 컨테이너의 현재 용량의 배 수(보통 2배)를 늘린다.- 새 메모리에 객체를 복사한다.- 기존 메모리의 객체를 소멸시키고 메모리를 해제한다. reserve 멤버 함수는 사용할 메모리를 미리 할당해 둠으로써 재할당 회수를 최소화시킨다. STL 맨들이 알아야 할 네 가지 함수* 이 네 가지를 모두 지원하는 컨테이너는 vector와 string이다. size() - 컨테이너에 들어 있는 요소의 개수.capacity() - 할당된 메모리로 담을 수 있는 요소의 개수.resize(size_t n) - 컨테이너가 담을 수 있는 요소의 개수를 n개로 무조건 만든다.reserve(s..
2015.12.17