std::vector<bool>
std::vector (공간 효율적인 bool 전용 벡터)
bool 타입을 위한 std::vector의 공간 효율적인 특수화예요. 각 원소가 sizeof(bool) 바이트 대신 단일 비트를 차지하도록 압축되는 최적화가 가능해요.
출처: cppreference
본문
<vector> 헤더에 정의돼 있고, std::vector의 bool 특수화예요.
template<
class Allocator
> class vector<bool, Allocator>;
std::vector<bool>은 bool 타입을 위한 std::vector의 (다소) 공간 효율적 특수화예요. std::vector<bool>이 공간 효율적으로 만들어지는 방식(최적화되는지 여부 포함)은 구현 정의예요. 한 가지 잠재적 최적화는 원소를 압축해 각 원소가 sizeof(bool) 바이트 대신 단일 비트를 차지하게 하는 거예요.
std::vector<bool>은 std::vector와 비슷하게 동작하지만, 공간 효율을 위해 다음과 같이 달라요.
- 원소를 반드시 연속 배열로 저장하지는 않아요.
- 클래스
std::vector<bool>::reference를 개별 비트에 접근하는 방법으로 노출해요. 특히operator[]가 이 클래스의 객체를 값으로 반환해요. - 비트 값을 구성할 때
std::allocator_traits::construct를 사용하지 않아요. - 같은 컨테이너 안의 서로 다른 원소가 서로 다른 스레드에서 동시에 수정될 수 있다는 것을 보장하지 않아요.
멤버 타입
value_type=bool,allocator_type=Allocator,size_type·difference_type·pointer·const_pointer·iterator·const_iterator는 구현 정의.reference: 단일bool에 대한 참조를 나타내는 프록시 클래스 (class).const_reference=bool.reverse_iterator=std::reverse_iterator<iterator>,const_reverse_iterator=std::reverse_iterator<const_iterator>.
멤버 함수
생성자, 소멸자, operator=, assign, assign_range(C++23), get_allocator, at, operator[], front, back, begin/cbegin, end/cend, rbegin/crbegin, rend/crend, empty, size, max_size, reserve, shrink_to_fit, clear, insert, emplace, erase, push_back, emplace_back, pop_back, resize, swap, 그리고 std::vector<bool>에 특화된 flip(모든 비트 반전) 멤버가 있어요.
비멤버 함수
operator==, operator!=, std::swap(std::vector<bool>) 등이 있어요. std::vector<bool>::reference 덕분에 프록시 객체를 통해 개별 비트를 읽고 쓸 수 있어요. 다만 참조가 프록시 타입이므로 일반적인 bool 참조와 미묘하게 다를 수 있다는 점에 주의해야 해요.