簡體   English   中英

符合標准的 transform_iterator

[英]Standard-conforming transform_iterator

我的目標是擁有一個迭代器來迭代T類型的元素,但在我的情況下, T對於我的最終用戶來說並不是真正可用的。 相反,最終用戶應該使用具有更有用接口的包裝器W

為了構造一個W ,我們需要一個T加上一個指向附加數據結構的引用或指針。

問題是我永遠不會將元素存儲為W 相反,元素總是存儲為T並且只按需包裝。 因此,我的用戶必須迭代包含T的數據結構。

我的想法是為這些數據結構編寫一個自定義迭代器,它本身迭代存儲的T ,但在取消引用時將返回W 我開始研究如何實現這一點,並找到了有關該主題的各種信息,包括如何處理迭代器的reference typedef 實際上不是引用。 這包括在這種情況下實現operator->arrow_proxy技巧。

然而,我也試圖閱讀標准以了解它對此類迭代器的看法。 我的資源在 這里,它清楚地指出,一旦我們處理前向迭代器, reference就應該是對value_type的(const)引用。 這個問題支持這一點。

這讓我想知道是否有可能合理地實現這樣一個transform_iterator ,如果打算將其用作forward_iterator或更高版本,它仍然符合標准?

我想出的一種方法是將我的迭代器的value_type聲明為W ,然后保留一個W類型的成員變量,這樣operator*就可以像這樣實現:

class transform_iterator {
    value_type = W;
    reference = W &;
    // ...

    reference operator*() const {
        m_wrapper = W(< obtain current T >, m_struct);
        return m_wrapper;
    }

    mutable W m_wrapper;
    SeparateDataStructure m_truct;
};

但是,這種方法對我來說似乎很老套。 最重要的是,這似乎會顯着增加迭代器的大小,這可能會也可能不會成為問題(從長遠來看)。


注 1:我知道 Boost.iterator 提供了一個transform_iterator ,但我無法完全理解它們實際應用於這些類型的迭代器的迭代器類別的實現。 然而, 他們似乎確實將類別基於所提供的 function 的結果類型(以某種方式),這表明至少在他們的實現中類別可能與input_iterator_tag不同(盡管可能是唯一的其他選項是output_iterator_tag ?)。

注 2:上面鏈接的問題也提出了我在此處勾畫的相同解決方法。 這是否表明沒有更好的方法?


TL;DR:有沒有比在迭代器本身中存儲該類型的成員並在每次取消引用時更新該成員更好的方法來實現例如將取消引用時的迭代類型轉換為不同類型的前向迭代器?

首先,選擇你可以擺脫的最嚴格的迭代器類別:

  • 如果您不需要允許多次通過,請使用InputIterator並按值返回一個臨時W

    這仍然具有所有常用的迭代器方法( operator*operator->operator++等)

  • 如果您確實需要多次傳遞,則需要一個ForwardIterator及其附加要求以返回實際引用。

    正如您所說,這只能通過將W存儲在某處(在迭代器中或放在一邊)來完成。

    最大的問題是可變的前向迭代器:如果i == j ,改變*i也必須影響*j ,這意味着你的W不能是獨立的值類型,而必須是某種直寫代理。 這並非不可能,但您不能簡單地采用某些現有類型並像這樣使用它。

如果您具有 C++20 訪問權限,則僅使用transform_view可能會節省一些精力——盡管將其他所有內容更改為使用范圍而不是原始迭代器的工作可能會抵消這方面的工作。

暫無
暫無

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

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