【问题标题】:create iterator wrapper class for dereferencing pointers stored in a std container创建迭代器包装类以取消引用存储在 std 容器中的指针
【发布时间】:2021-12-30 13:31:51
【问题描述】:
using HT = std::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)); }

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)
    {
        //should not be changing val's original values
        x.second += 100;
    }

    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;
    }
}

我想通过某种方式在map 容器中使用基于范围的for 循环,它将循环内的原始值类型从int* 更改为int&amp;(main() 中的预期用例)。

我在实现HT_ITERATOR_WRAPPER::operator* 时遇到了一些困难。在这种情况下它应该返回什么?我的感觉是我需要将取消引用的元素存储在某处并让operator* 返回对它的引用,但我不知道如何使它工作。

编辑: 请注意,我希望运算符 * 返回对 iter->firsts 和 *(iter->second) 的引用。这种对结构实际上是 *iter 将为关联容器返回的内容。

【问题讨论】:

    标签: c++ stl iterator


    【解决方案1】:

    应该是return *iter;:

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

    编辑:如果您想取消引用基础价值,请按照@RemyLebeau 所说的去做:

    int& operator*(){
        return *(iter->second); 
    }
    

    另一个编辑:如果你想要这两个值,那么你将得到的最好的就是这个(注意:我没有尝试过这个):

    std::pair<int&, int&> operator*(){
        return std::make_pair<int&,int&>(iter->first, *iter->second); 
    }
    

    【讨论】:

    • iter 指向一对 这不是我想要的。 HT_ITERATOR_WRAPPER 类的重点是尊重 int* 并公开底层 int。
    • 那你需要auto&amp; operator*(){ return *(iter-&gt;second); }。
    • iter->first 怎么样?它也需要退回。我试图将两者作为一对返回或创建另一个自定义类来保存引用,但这些方法都不适用于 main 中的用例。
    猜你喜欢
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 2012-11-01
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多