名稱空間
變體
操作

C++ 命名需求: LegacyForwardIterator

來自 cppreference.com
 
 
C++ 命名要求
基本
型別屬性
全庫範圍




Container(容器)
容器元素
迭代器 (Iterator)
LegacyForwardIterator(傳統前向迭代器)
流 I/O
格式化器
隨機數
併發
Ranges(範圍)
多維檢視
其他

 

LegacyForwardIterator 是一種 LegacyIterator,可以從所指向的元素中讀取資料。

LegacyInputIteratorLegacyOutputIterator 不同,它可以在多趟演算法中使用。

如果一個 LegacyForwardIterator it 源自一個 Container,那麼 it 的值型別與容器的值型別相同,因此解引用 (*it) 獲取容器的值型別。

目錄

[編輯] 要求

型別 定義
X 前向迭代器型別
T X值型別(即 std::iterator_traits<X>::value_type
Ref std::iterator_traits<X>::reference
定義
i, j 型別為 Xconst X 的值
r 型別為 X& 的值

如果滿足以下所有條件,則 X 滿足 LegacyForwardIterator

  • X 滿足 LegacyInputIterator
  • X 滿足 DefaultConstructible
  • 如果 X 是一個可變迭代器,則 Ref 是對 T 的引用。
  • 如果 X 是一個常量迭代器,則 Ref 是對 const T 的引用。
  • 型別 X 的物件提供多趟保證
  • 如果 ij 相等,那麼 ij 要麼都可以解引用,要麼都不能解引用。
  • 如果 ij 都可以解引用,那麼 i == j 當且僅當 *i*j 繫結到同一個物件。
  • 以下表達式必須有效並具有其指定的效果
 表示式  型別 效果
r++ 可轉換為 const X&  等價於 X x = r;
++r;
return x;
*i++ Ref

[編輯] 相等域

前向迭代器的 == 是其在相同底層序列上的迭代器。

然而,值初始化的前向迭代器可以比較,並且必須與相同型別的其他值初始化迭代器比較相等。

換句話說,值初始化的前向迭代器表現得好像它們引用了同一個空序列的末尾之外的位置。

(C++14 起)

[編輯] 多趟保證

型別 X 的兩個可解引用迭代器 ab 如果滿足以下所有條件,則提供多趟保證

  • a == b 蘊含 ++a == ++b
  • 滿足以下任何條件:
  • X 是一種指標型別。
  • 表示式 (void)++X(a), *a 等價於表示式 *a

概念

對於 std::iterator_traits 的定義,定義了以下僅用於說明的概念。

template<class It>

concept __LegacyForwardIterator =
    __LegacyInputIterator<It> && std::constructible_from<It> &&
    std::is_reference_v<std::iter_reference_t<It>> &&
    std::same_as<
        std::remove_cvref_t<std::iter_reference_t<It>>,
        typename std::indirectly_readable_traits<It>::value_type> &&
    requires(It it) {
        {  it++ } -> std::convertible_to<const It&>;
        { *it++ } -> std::same_as<std::iter_reference_t<It>>;

    };

其中,僅用於展示的 concept __LegacyInputIterator<T>LegacyInputIterator 中描述。

(C++20 起)

[編輯] 注意

std::forward_iterator 概念不同,LegacyForwardIterator 要求解引用返回一個引用。

[編輯] 缺陷報告

下列更改行為的缺陷報告追溯地應用於以前出版的 C++ 標準。

缺陷報告 應用於 釋出時的行為 正確的行為
LWG 1212
(N3066)
C++98 *i++ 的型別與
LegacyBidirectionalIterator 所要求的 *i-- 的型別不匹配
將型別
更改為 Ref
LWG 1311
(N3066)
C++98 a == b 蘊含 ++a == ++b” 單獨
不提供多趟保證[1]
還要求 “a == b
蘊含 ++a != b[2]
LWG 3798 C++20 __LegacyForwardIterator 要求
std::iter_reference_t<It> 必須是左值引用型別
也允許右值
引用型別
  1. ab 使用相同底層迭代器的情況下,評估表示式 ++a == ++b 實際上會使底層容器自增兩次,但結果仍然是 true
  2. 形式上還要求蘊含 ++b != a

[編輯] 另請參閱

指定input_iterator是前向迭代器,支援相等比較和多趟遍歷
(concept) [編輯]
迭代器庫 為迭代器、迭代器特性、介面卡和實用函式提供定義