簡體   English   中英

STL填充和轉發迭代器

[英]STL fill and forward iterator

根據大多數C ++引用,例如cplusplus.com, 前向迭代器不需要可賦值(我的意思是,引用左值)。 但是,對於需要寫入值的幾個STL算法,例如std::fill (也是std::generate等),規范使用了前向迭代器:

template <class ForwardIterator, class T>
  void fill (ForwardIterator first, ForwardIterator last, const T& val);

而等效行為需要左值取消引用:

template <class ForwardIterator, class T>
  void fill (ForwardIterator first, ForwardIterator last, const T& val)
{
  while (first != last) {
    *first = val;
    ++first;
  }
}

因此,它實際上是使用一個可變的前向迭代器和一次傳遞。

現在的問題是:

(1)為什么不明確這些情況下使用的前向迭代器是否可變?

(2) 更新 :我發現以下問題是愚蠢的:我暫時忘記了輸出迭代器不需要支持相等比較。 無論如何,上述問題仍然存在。

為什么使用正向迭代器而不是std::fillstd::generate等的輸出迭代器,而實際上它們不需要多次傳遞? (例如, std::copy只需要輸出迭代器。基本原理是什么?)

從簽名

template <class ForwardIterator, class T>
void fill (ForwardIterator first, ForwardIterator last, const T& val);

你無法推斷ForwardIterator是一個在前向迭代器中描述的迭代器 但是,如果您閱讀參數說明,您會發現firstlast必須是

將迭代器轉發支持被賦予類型T值的元素序列中的初始位置和最終位置。

(我強調)。 因此,前向迭代器只能滿足前向迭代器的要求,它不是一個有效的參數。

考慮到fill的規范是(解除引用的)迭代器可以從T賦值,它對我來說似乎並不十分奇怪。 輸出迭代器是不夠的,因為它無法與確定范圍結束相比,因此選擇了具有需求的forward_iterator

您將注意到fill_n 確實使用輸出迭代器,因為不需要迭代器比較來確定要填充的序列的結尾。

暫無
暫無

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

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