[英]std::vector iterator type and permissible operations
以C ++命名的需求:ContiguousIterator將std::vector
的迭代器類型稱為連續的。 但沒有提供該類型的連續迭代器定義在這里 。
std :: vector :: begin將迭代器類型稱為隨機訪問迭代器。
這是否意味着連續的迭代器屬於隨機訪問類型?
[a]連續迭代器是隨機訪問類型的嗎?
是。
將“連續迭代器”定義為(參見N3884 )為
滿足以下要求的隨機訪問迭代器:
std::pointer_from(i) == std::addressof(*i)
(當i
可取消引用時)
std::pointer_from(i + n) == std::pointer_from(i) + n
(當i + n
是有效的迭代器時)
所以
“連續迭代器”意味着“隨機訪問迭代器”
“隨機訪問迭代器”並不意味着“連續迭代器”(有關反例,請參見std::deque
)
對。 cppreference有一個漂亮的圖表 ,可以很清楚地看到ContiguousIterator
包含RandomAccessIterator
功能的超集(它本身是BidirectionalIterator
的超集,它是ForwardIterator
的超集等)。
CPPReference被刻畫迭代器種類和概念帶壞你ContiguousIterator
沒有出現在C ++標准。 C ++ 17將連續性定義為迭代器的屬性,就像可變性一樣。 [iterator.requirements.general] / 6 :
對於整數值
n
和可引用的迭代器值a
和(a + n)
,*(a + n)
等於*(addressof(*a) + n)
的要求進一步被稱為連續迭代器 。
值得注意的是,此屬性與迭代器類別無關。 從理論上講,您可以定義一個滿足連續迭代器要求和任何迭代器類別要求的迭代器。
實際上,我不認為這種靈活性比連續迭代器是對隨機訪問迭代器的改進的設計具有任何表現力。 實際上,標准庫容器要求將連續容器定義為( [container.requirements] / 13 ):
連續容器是支持隨機訪問迭代器的容器,其成員類型
iterator
和const_iterator
是連續迭代器。
這並不與[iterator.requirements.general] / 6的觀點相矛盾,即連續性獨立於迭代器類別,但確實引入了一個不一致,這會引起混亂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.