vector<bool>은 STL 컨테이너가 아님

STL 컨테이너의 자격을 갖추려면 operator[]가 지원돼야 하므로 아래 코드가 컴파일 돼야 하지만 vector<bool>은 컴파일 되지 않음

T* p = &c[0];
bool* p = &c[0];

 

vector<bool> 구조

bool이 들어 있지 않고 공간을 줄이기 위해 비트 필드를 써서 bool을 저장하고 있는 것처럼 흉내내어 한 개의 비트에 한 개의 bool 값을 저장

 

std::vector<bool>::reference

비트에 대한 참조자처럼 동작하는 프록시 객체

비트 필드를 조작할 수 있도록 설계되어 있으며, bool 값을 읽고 쓸 수 있도록 해줌

template <typename Allocator>
class vector<bool, Allocator>
{
public:
    class reference { ... };
    
    reference operator[](size_type n);
};

 

 

복사 및 할당

복사 및 할당이 가능하며, operator=를 통해 값을 할당할 수 있음

할당 연산자는 실제로는 해당 비트를 설정하거나 변경하는 함수

 

암시적 변환

bool로 암시적으로 변환될 수 있음, 즉, 마치 bool처럼 사용할 수 있지만, 이는 내부적으로 프록시 객체를 통해 해당 비트 값을 가져오는 과정

 

특징

bool을 하나의 비트로 나타내어 한 바이트로 8개의 bool을 담을 수 있게 구현함

bool은 포인터와 참조자를 만들 수 있지만 비트 필드의 각 비트에 대한 포인터와 참조자를 만들 수 없음

 

표준안에 속해 있고, STL 컨테이너 요구사항을 거의 만족하지만 템플릿을 설계할 때 제대로 동작하지 않을 수 있음

 

메모리 측면에서 최적화되었지만, 비트 단위로 조작하기 때문에 성능이 일반적인 std::vector보다 떨어질 수 있음

각 비트에 대한 간접적인 접근 방식을 사용하므로, 다중 스레드 환경에서는 주의 필요

 

대안

deque<bool>

reserve, capacity를 제외한 vector의 거의 모든 것을 할 수 있음

deque가 사용하는 내부 메모리는 연속 메모리가 아님

 

bitset

비트 조작에 관련된 편리한 멤버 함수 제공

STL 컨테이너는 아니지만 표준 C++ 라이브러리에 속함

STL 컨테이너와 달리 비트셋의 크기(요소의 개수)는 컴파일 타임에 고정되기 때문에 삽입하거나 제거할 수 없음

STL 컨테이너가 아니므로 반복자를 지원하지 않음

+ Recent posts

목차