不使用vector<bool>的原因和替代方法
vecotr不是容器,至少,不是标准意义上的容器。 vector的名称有点让人误解,因为其内部元素实际上并不是标准的bool值,标准的bool值至少与char拥有一样的大小,从而可以被“正常”使用。 然而C++标准对于vecotr值有其特殊的实现方法。目的是为了减小空间的耗用。特殊版本内部只使用一个bit来存储一个元素,所以通常要比一般的bool值小8倍之多。
·
vector<bool>不是容器,至少,不是标准意义上的容器。
vector<bool>的名称有点让人误解,因为其内部元素实际上并不是标准的bool值,标准的bool值至少与char拥有一样的大小,从而可以被“正常”使用。
然而C++标准对于vector<bool>值有其特殊的实现方法。目的是为了减小空间的耗用。特殊版本内部只使用一个bit来存储一个元素,所以通常要比一般的bool值小8倍之多。
对于vector<bool>值来说,并不适用。
除此之外,由于vector<bool>通过代理对象进行存取访问时需要执行逐位处理,访问速度通常比int之类的普通类型操作要慢很多。
因此,对vecotr<bool>的使用需慎重考虑以下几点:
(1)是否需要牺牲速度来获取空间上的优化
(2)算法中会否有对vecotr地址进行解引用操作的可能。
如果不满足以上条件,建议使用deque<bool>来取代vector<bool>,功能基本相同,但deque<bool>未对其进行特殊处理。
vector<bool>的名称有点让人误解,因为其内部元素实际上并不是标准的bool值,标准的bool值至少与char拥有一样的大小,从而可以被“正常”使用。
然而C++标准对于vector<bool>值有其特殊的实现方法。目的是为了减小空间的耗用。特殊版本内部只使用一个bit来存储一个元素,所以通常要比一般的bool值小8倍之多。
但是这里就带来了一个小麻烦,C++的最小可寻址值通常以byte为单位,所以上述的vector<bool>特殊版本的references和iterators经过了特殊的处理,并不是bool值的实际地址,而是一个“代理对象”。这样,对于一般类可以使用的以下操作:
T* p = &v.front对于vector<bool>值来说,并不适用。
除此之外,由于vector<bool>通过代理对象进行存取访问时需要执行逐位处理,访问速度通常比int之类的普通类型操作要慢很多。
因此,对vecotr<bool>的使用需慎重考虑以下几点:
(1)是否需要牺牲速度来获取空间上的优化
(2)算法中会否有对vecotr地址进行解引用操作的可能。
如果不满足以上条件,建议使用deque<bool>来取代vector<bool>,功能基本相同,但deque<bool>未对其进行特殊处理。
更多推荐
已为社区贡献1条内容
所有评论(0)