![](/img/trans.png)
[英]Why `std::prev` does not fire an error with an iterator of `std::unordered_set`?
[英]Why does std::iterator not contain std::prev() as a member function?
it++; // OK : Widely used expression for moving iterator.
it_prev = it-1; // ERROR : What I expected; + - operators never existed
it_prev = std::prev(it) // OK
it_next3 = it+3; // ERROR : also, nothing like this exists
it_next3 = std::next(it,3) // OK
為什么 Iterator 類沒有 + - 運算符作為成員函數?
或者std::prev()
作為成員函數來做到這一點?
it_prev = it.prev() // nothing like this
在迭代器外部定義prev
函數是否有特殊原因?
如果prev()
是一個成員函數而不是一個自由函數,那么它的通用性就會降低,因為它不可能使用內置類型(例如,指針)作為迭代器:
int *ptr = ...
// ...
ptr.prev() // <-- Pointers don't have member functions!!
而對於非成員函數模板,例如std::prev()
,它與指針一起工作所需要的只是一個處理指針的特化:
int *ptr = ...
// ...
std::prev(ptr); // <-- OK
指針還支持遞增和遞減運算符(即++
和--
),因此在迭代器類中定義它們不會妨礙泛型編程。 同樣的推理適用於二元運算符+
和-
。
隨機訪問迭代器確實有operator+
重載。 但其他人沒有,因為像it + n
這樣的東西會具有線性復雜性,而且大多數人並不期望這一點,特別是考慮到迭代器對於 STL 容器來說也應該是類似指針的。 這也是為什么他們沒有名為prev
的成員函數的原因,因為指針是有效的迭代器實現非常方便、高效和需要。 如果您想推進迭代器並且不介意復雜性,您可以使用std::advance
明確地做到這一點:
標准::提前
[...]
給迭代器它增加 n 個元素。
如果 n 為負,則迭代器遞減。 在這種情況下,InputIt必須滿足的要求LegacyBidirectionalIterator ,否則該行為是不確定的。
[...]
復雜
線性。
但是,如果InputIt另外符合要求LegacyRandomAccessIterator ,復雜性是恆定的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.