2017-04-04 2 views
2

문제는 다음과 같습니다. 오브젝트 묶음에 대한 참/거짓 정보를 유지하려면 비트 맵 (일련의 바이너리 플래그)을 만들어야합니다. 객체의 수는 선험적으로 알려지지 않기 때문에 비트 맵 생성 중에 런타임에 충분한 플래그를 할당해야합니다.바이너리 플래그를 유지하는 C++ 비트 맵

을 감안할 때 max_num_elements 요소는, 내 첫 번째 생각은 ((num_elements/8)+1)*sizeof(char) 비트의 배열을 할당하는 것이었다하십시오 char는 8 비트이기 때문에 길이가 8 개 진 플래그를 처리 할 수있는, 그래서 최대로, char의의 minimun 수 num_elements 플래그를 잡아 얻을 7bits의 메모리 낭비.

진짜 문제는/체크 플래그를 설정하는 것입니다 : 내가 좋아하는 N

flag_n = (flag_array>>n)&0d1 

을 플래그를 얻을 수있는 비트에 의해 다음 전체 배열에 약간의 bitshifting을 할 문질러서하지만 제대로 이해되면, 이동 작업은 첫 번째 요소 인 전체 배열에 영향을 미치지 않습니다.

어떻게하면됩니까?

+0

내가 뭔가를 놓치지 않는 한, 왜 비트 맵 대신 오히려 길지 않은가? 첫 번째 비트는 일부 속성에 대해 참/거짓, 다른 속성에 두 번째 비트 등을 포함합니다. – Eugene

답변

1

std::vector<bool>은 정확히 이것을 달성하는 데 특화되어 있습니다.

It is actually a problem in many cases 요소에 대한 액세스가 bool&이 아닌 프록시 객체를 반환하기 때문에 다른 모든 컨테이너처럼 작동하지 않지만 원하는 경우 사용자에게 적합하다고 판단됩니다.

+0

대단히 감사합니다.이 전문화에 대해 몰랐습니다. 매우 도움이 될 것입니다. 그러나 링크를 읽고 나는 [std :: bitset] (http://en.cppreference.com/w/cpp/utility/bitset/bitset)을 발견 했으므로 나의 필요에 가장 잘 맞습니다. 내 프로젝트. – fudo