C++ 命名要求: LegacyOutputIterator
LegacyOutputIterator 是一個可以寫入所指向元素的 LegacyIterator。
實現 LegacyOutputIterator 型別的例子是 std::ostream_iterator。
當 LegacyForwardIterator、LegacyBidirectionalIterator 或 LegacyRandomAccessIterator 除了滿足其自身要求外,還滿足 LegacyOutputIterator 要求時,它被稱為 mutable。
目錄 |
[編輯] 要求
型別 X 滿足 LegacyOutputIterator,如果
- 型別 X 滿足 LegacyIterator
- X 是一個類型別或指標型別
並且,給定
- o,一個可寫入輸出迭代器的某種型別的值(可能有多種可寫入的型別,例如如果 operator= 可以是模板。沒有像輸入迭代器那樣的
value_type
概念) - r,型別為 X 的左值,
以下表達式必須有效並具有其指定的效果
表示式 | 返回 | 等價表示式 | 前置條件 | 後置條件 | 注意 |
---|---|---|---|---|---|
*r = o | (未使用) | r 是可解引用的 | r 是可遞增的 | 在此操作之後,r 不再需要是可解引用的,r 的任何先前值的副本不再需要是可解引用或可遞增的。 | |
++r | X& | r 是可遞增的 | r 和 ++r 指示相同的迭代器物件,r 是可解引用或尾後迭代器 | 在此操作之後,r 不再需要是可遞增的,r 的任何先前值的副本不再需要是可解引用或可遞增的。 | |
r++ | 可轉換為 const X& | X temp = r; ++r; |
|||
*r++ = o | (未使用) | *r = o; ++r; |
[編輯] 註記
operator* 與輸出迭代器唯一的有效用法是在賦值的左側:operator* 可以返回一個代理物件,該物件定義了一個成員 operator=(該成員可以是一個模板)。
輸出迭代器可能沒有定義相等和不等。即使定義了 operator==,x == y 也無需蘊含 ++x == ++y。
透過同一輸出迭代器值進行賦值只發生一次:輸出迭代器上的演算法必須是單趟演算法。
透過輸出迭代器進行賦值應與遞增交替進行。雙重遞增是未定義行為(C++ 標準目前聲稱支援雙重遞增,這與 STL 文件相悖;這是 LWG issue 2035)。
純輸出迭代器允許將其 iterator_traits<X>::value_type、iterator_traits<X>::difference_type、iterator_traits<X>::pointer 和 iterator_traits<X>::reference 宣告為 void(像 std::back_insert_iterator 這樣的迭代器正是如此,除了 difference_type
,它現在被定義為滿足 std::output_iterator(C++20 起))。
[編輯] 標準庫
以下標準庫迭代器是輸出迭代器,但不是前向迭代器
寫入std::basic_ostream的輸出迭代器 (類模板) | |
寫入std::basic_streambuf的輸出迭代器 (類模板) | |
用於在容器中插入的迭代器介面卡 (類模板) | |
用於在容器末尾插入的迭代器介面卡 (類模板) | |
用於在容器前端插入的迭代器介面卡 (類模板) |
[編輯] 參閱
(C++20) |
指定型別是給定值型別的輸出迭代器,即該型別的值可以寫入其中,並且可以進行前置和後置增量 (概念) |
迭代器庫 | 為迭代器、迭代器特性、介面卡和實用函式提供定義 |