首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >我的迭代器实现不起作用,有什么问题吗?

我的迭代器实现不起作用,有什么问题吗?
EN

Stack Overflow用户
提问于 2020-07-04 23:48:07
回答 2查看 75关注 0票数 0

我尝试编写我的c++迭代器的实现,但遇到了一些问题。当我尝试在基于范围的for中迭代时,得到的错误是我的迭代器没有合适的"begin“函数,并且没有找到。我编写了begin()和end()函数。怎么了?

代码语言:javascript
运行
复制
#include <iostream>
template<typename T>
class iter final {
private:
    T* current_ = nullptr;
    T* end_ = nullptr;
    int n;
public:
    iter(T* first) :current_(first) {};
    iter() {};
    inline T& operator+ (int n) { return *(current_ - n); }
    inline T& operator- (int n) { return *(current_ - n); }

    inline T& operator++ (int) { return *current_++; }
    inline T& operator-- (int) { return *current_--; }
    inline T& operator++ () { return *++current_; }
    inline T& operator-- () { return *current_--; }

    inline bool operator!= (const iter& it) { return current_ != it.current_; }
    inline bool operator== (const iter& it) { return current_ == it.current_; }

    inline T& operator* () { return *current_; }

    inline iter<T>* begin() { return current_; }
    inline iter<T>* end() { return end_ + n; }
    inline void set_current(T* _current) { current_ = _current; }
    inline void set_end(T* _end) { end_ = _end; n = (end_ - current_) / sizeof(_end); }
    inline void set_num(int num) { n = num; }
};
template<typename T>
class shuffle_range final {
public:
    shuffle_range() { it = new iter<T>; };
    ~shuffle_range() { delete it; };
    iter<T>* it;
};
template<typename T>
iter<T>* make_shuffle(T* begin, T* end) {
    static shuffle_range<T> shuffler;

    shuffler.it->set_current(begin);
    shuffler.it->set_end(end);
    shuffler.it->set_num(end - begin);
    return shuffler.it;
}

int main() {
    int a[] = { 0, 4, 5, 2, 8, 1 };
    auto shuffle_a = make_shuffle(a, (a + 5));
    for (auto i : shuffle_a)
        std::cout << i << " ";
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-05 00:35:33

对于你的问题- make_shuffle返回了一个指向iter<T>类的指针,这意味着为了迭代这个实例,你需要获取指针值:

代码语言:javascript
运行
复制
for (auto i : *shuffle_a)
    std::cout << i << " ";

但是,请注意,您的end函数实现还有另一个问题。它检查end_ + n而不是end_current_ + n。我的建议是摆脱其中一个(选择你使用的),并使用一个函数来获得另一个。例如,您可以添加size()成员函数来获取n

代码语言:javascript
运行
复制
inline size_t size() { return (end_ - current_) / sizeof(end_); }
票数 1
EN

Stack Overflow用户

发布于 2020-07-05 00:05:07

C++中的for each循环只是对正常的for循环的掩码,该循环从头到尾遍历相同类型的对象的给定列表。它甚至让converted变成了1。因此,在这种情况下,编译器不知道如何处理for-each循环。如果你使用一个普通的for循环会更好。类似于:

代码语言:javascript
运行
复制
for(auto i = shuffle_a.begin(); i != shuffle_a.end(); i++) { //mind well!!! `end()` must return an iterator pointing to the element after the last element
    <whatever>
}

就足够了

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62731179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档