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 컨테이너가 아니므로 반복자를 지원하지 않음
'C++ > Effective STL' 카테고리의 다른 글
Effective STL 항목 20 포인터를 저장하는 연관 컨테이너에 대해서는 적합한 비교(비교 함수자) 타입을 정해주자 (0) | 2025.01.03 |
---|---|
Effective STL 항목 19 상등 관계(equality)와 동등 관계(equivalence)의 차이를 파악하자 (0) | 2025.01.02 |
Effective STL 항목 16 기존의 C API에 vector와 string을 넘기는 방법을 알아 두자 (0) | 2024.12.30 |
Effective STL 항목 15 잊지 말자! string은 여러 가지 방식으로 구현되어 있다는 사실을 (0) | 2024.12.29 |
Effective STL 항목 14 reserve는 필요 없이 메모리가 재할당되는 것을 막아 준다 (0) | 2024.12.27 |