[英]Any guarantees with vector<bool> iterators?
cppreference說vector<bool>
的迭代器是實現定義的,並且很多不支持像ForwardIterator
(因此也是RandomAccessIterator
)這樣的特性。
cplusplus增加了一個神秘的“最”:
容器使用的指針和迭代器類型不一定既不是指針也不是符合迭代器,盡管它們應模擬大多數預期的行為。
我無法訪問官方規范。 vector<bool>
迭代器是否保證了任何迭代器行為?
更具體地說,如何編寫符合標准的代碼以在vector<bool>
的中間插入項目? 以下是我嘗試過的幾個編譯器的工作原理:
std::vector<bool> v(4);
int k = 2;
v.insert(v.begin() + k, true);
會永遠嗎?
vector<bool>
迭代器的根本問題在於它們不是ForwardIterators。 C ++ 14 [forward.iterators] / 1要求ForwardIterators的reference
類型為T&
或const T&
,視情況而定。
任何在T
s范圍內采用前向迭代器的函數都允許這樣做:
T &t = *it;
t = //Some value.
但是, vector<bool>
的reference
類型不是bool&
; 它們是一個可轉換為bool
並可從bool
轉發的代理對象。 他們就像一個bool
,但他們不是一個bool
。 因此,此代碼是非法的:
bool &b = *it;
它將嘗試獲取對代理對象創建的臨時值的左值引用。 這是不允許的。
因此,您不能在任何采用ForwardIterators或更高版本的函數中使用vector<bool>
的迭代器。
但是,您的代碼不一定要關心它。 只要你控制了傳遞那些vector<bool>
迭代器的代碼,並且你沒有做任何違反它們行為的事情,那么你就沒事了。
就它們的接口而言,它們的行為類似於RandomAccessIterators,除非它們沒有(見上文)。 因此,您可以使用具有恆定時間復雜度的整數來抵消它們,等等。
vector<bool>
很好,只要你不把它當成包含bool
s的vector
。 您的代碼將起作用,因為它使用了vector<bool>
自己的接口,它顯然接受了它。
如果你將一對vector<bool>
迭代器傳遞給std::sort
,它將無法工作。
C ++ 14 [vector.bool] / 2:
除非下面描述,否則所有操作都具有與主
vector
模板相同的要求和語義,除了處理容器存儲和allocator_traits::construct
(20.7.8.2)中的bool
值類型映射到位值的操作不用於構造這些價值觀。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.