不使用vector的原因和替代方法
阿新 • • 發佈:2019-02-02
vector<bool>不是容器,至少,不是標準意義上的容器。
vector<bool>的名稱有點讓人誤解,因為其內部元素實際上並不是標準的bool值,標準的bool值至少與char擁有一樣的大小,從而可以被“正常”使用。
然而C++標準對於vector<bool>值有其特殊的實現方法。目的是為了減小空間的耗用。特殊版本內部只使用一個bit來儲存一個元素,所以通常要比一般的bool值小8倍之多。
T* p = &v.front
對於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值的實際地址,而是一個“代理物件”。這樣,對於一般類可以使用的以下操作:
對於vector<bool>值來說,並不適用。
除此之外,由於vector<bool>通過代理物件進行存取訪問時需要執行逐位處理,訪問速度通常比int之類的普通型別操作要慢很多。
因此,對vecotr<bool>的使用需慎重考慮以下幾點:
(1)是否需要犧牲速度來獲取空間上的優化
(2)演算法中會否有對vecotr地址進行解引用操作的可能。
如果不滿足以上條件,建議使用deque<bool>來取代vector<bool>,功能基本相同,但deque<bool>未對其進行特殊處理。