簡體   English   中英

std :: advance和std :: next有什么區別?

[英]What's the difference between std::advance and std::next?

除了提前還有更多的負數嗎?

std::advance

  • 修改其論點
  • 沒有回報
  • 適用於輸入迭代器或更好(如果給出負距離,則適用於雙向迭代器)

std::next

  • 將其論點保持不變
  • 返回參數的副本,按指定的數量提前
  • 適用於前向迭代器或更好(或者如果給出負距離,則適用於雙向迭代器))

也許最大的實際區別是std::next()僅在C ++ 11中可用。

默認情況下, std::next()將前進一個,而std::advance()需要一個距離。

然后有返回值:

std::next()就像std::advance一樣使用負數,在這種情況下要求迭代器必須是雙向的。 當intent專門向后移動時, std::prev()會更具可讀性。

的std ::提前

函數advance()遞增作為參數傳遞的迭代器的位置。 因此,該函數允許迭代器向前(或向后)多個元素:

#include <iterator>
void advance (InputIterator& pos, Dist n)
  • 允許輸入迭代器pos步驟n元素向前( 或向后 )。
  • 對於雙向和隨機訪問迭代器,n可能為負向后退。
  • Dist是模板類型。 通常,它必須是整數類型,因為調用<,++, - 和與0的比較等操作。
  • 請注意,advance()不會檢查它是否越過序列的end()(它無法檢查,因為迭代器通常不知道它們運行的​​容器)。 因此,調用此函數可能會導致未定義的行為,因為未定義為序列末尾調用operator ++。

std :: next (和C ++ 11中的std::prev new)

#include <iterator>
ForwardIterator next (ForwardIterator pos)
ForwardIterator next (ForwardIterator pos, Dist n)
  • 如果向前移動1或n位置,則產生前向迭代器pos所具有的位置。
  • 對於雙向和隨機訪問迭代器,n可能是負數以產生先前的定位。
  • Dist是類型std :: iterator_traits :: difference_type。
  • 為內部臨時對象調用advance(pos,n)。
  • 請注意,next()不會檢查它是否越過序列的end()。 因此,由調用者決定結果是否有效。

The C++ Standard Library Second Edition引用

它們幾乎相同,除了std::next返回一個副本並且std::advance修改它的參數。 請注意,標准要求std::next的行為類似於std::advance

24.4.4迭代器操作[iterator.operations]

 template <class InputIterator, class Distance> void advance(InputIterator& i [remark: reference], Distance n); 

2.要求:對於雙向和隨機訪問迭代器,n應為負數
3.效果:增量(或負n的減量)迭代器引用i由n。
[...]

 template <class ForwardIterator> ForwardIterator next(ForwardIterator x, [remark: copy] typename std::iterator_traits<ForwardIterator>::difference_type n = 1); 

6.效果:相當於advance(x, n); return x; advance(x, n); return x;

請注意,如果迭代器是輸入迭代器,則它們實際上都支持負值。 另請注意, std::next要求迭代器滿足ForwardIterator的條件,而std::advance只需要一個Input Iterator(如果不使用負距離)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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