Need iterator when using ranged-based for loops

前端 未结 6 1964
失恋的感觉
失恋的感觉 2020-11-29 19:34

Currently, I can only do ranged based loops with this:

for (auto& value : values)

But sometimes I need an iterator to the value, instea

6条回答
  •  情歌与酒
    2020-11-29 20:04

    I tried myself on this and found a solution.

    Usage:

    for(auto i : ForIterator(some_list)) {
        // i is the iterator, which was returned by some_list.begin()
        // might be useful for whatever reason
    }
    

    The implementation was not that difficult:

    template  struct Iterator {
        T& list;
        typedef decltype(list.begin()) I;
    
        struct InnerIterator {
            I i;
            InnerIterator(I i) : i(i) {}
            I operator * () { return i; }
            I operator ++ () { return ++i; }
            bool operator != (const InnerIterator& o) { return i != o.i; }
        };
    
        Iterator(T& list) : list(list) {}
        InnerIterator begin() { return InnerIterator(list.begin()); }
        InnerIterator end() { return InnerIterator(list.end()); }
    };
    template  Iterator ForIterator(T& list) {
        return Iterator(list);
    }
    

提交回复
热议问题