簡體   English   中英

創建迭代器包裝器 class 以取消引用存儲在 std 容器中的指針

[英]create iterator wrapper class for dereferencing pointers stored in a std container

using HT = std::unordered_map<int, int*>;
class ITERATOR_PROXY
{
    public:
    ITERATOR_PROXY(HT& container) : m_container(container) { }

    auto begin() const  { return HT_ITERATOR_WRAPPER(std::begin(m_container)); }
    auto end() const    { return HT_ITERATOR_WRAPPER(std::end(m_container)); }
    auto cbegin() const { return HT_ITERATOR_WRAPPER(std::cbegin(m_container)); }
    auto cend() const   { return HT_ITERATOR_WRAPPER(std::cend(m_container)); }

    private:
    struct HT_ITERATOR_WRAPPER
    {
        HT_ITERATOR_WRAPPER(HT::const_iterator iter_) : iter(iter_) {}
        bool operator!=(const HT_ITERATOR_WRAPPER& other) const { return iter != other.iter; }
        auto& operator*()
        {
            //const int& key=iter->first;
            //int& val = *(iter->second);
            // how to return (key, val) which would allow possible modification? 
        }
        void operator++() {  ++iter; }
        HT::const_iterator iter;
    };
    HT& m_container;
};

int main()
{
    HT ht;
    std::array<int, 5> val = {0,1,2,3,4} ;
    for (int i=0;i<5;++i) ht[i]=&val[i];
    ITERATOR_PROXY htw(ht);
    for(auto& x : htw)
    {
        // ok, changes the values in val array
        x.second += 100;
    }
    for(const auto& x : htw)
    {
        // I should expect a compile error in this case
        x.second += 100;
    }
}

我想有一些方法使用 unordered_map 容器進行基於范圍的 for 循環,它將循環內的原始值類型從 int* 更改為 int& ( main() 中的預期用例)。 我在實現 HT_ITERATOR_WRAPPER::operator * 時遇到了一些困難。 在這種情況下它應該返回什么? 我的感覺是我需要將取消引用的元素存儲在某個地方並讓 *operator 返回對它的引用,但我不知道如何使它工作。

它應該return *iter;

auto& operator*(){
    return *iter;
}

暫無
暫無

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

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