簡體   English   中英

為什么 std::iterator 不包含 std::prev() 作為成員函數?

[英]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.

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