簡體   English   中英

任何矢量保證 <bool> 迭代器?

[英]Any guarantees with vector<bool> iterators?

cppreferencevector<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM