我的迭代器实现不起作用,它有啥问题?

Posted

技术标签:

【中文标题】我的迭代器实现不起作用,它有啥问题?【英文标题】:My iterator implementation don't work, what's wrong with it?我的迭代器实现不起作用,它有什么问题? 【发布时间】:2020-07-04 15:48:07 【问题描述】:

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

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

【问题讨论】:

你为什么经常上课final?继承通常用于多态以外的目的,因此将它们设为final 对于想要对它们做某事的人来说有点粗鲁。另外,为什么你的“迭代器”有范围功能(begin/end)? inter&lt;int&gt;* 没有它们,beginend 不应该返回指针。 回复:I wrote begin() and end() function。这不会解决问题,因为这首先不是问题。你看,它不知道如何迭代 Iter 类型的对象。在基础上,for-each 循环基本上是一个普通的 for 循环。 (它实际上将converted 变为一)。因此,最好自己编写 for 循环 另外,++-- 应该修改和返回迭代器,而不是你迭代的元素。您应该更仔细地研究标准迭代器。 尝试使用您的迭代器编写一个“常规”循环,您会注意到它不像普通迭代器那样工作。花时间明确说明类型,而不依赖于auto 【参考方案1】:

对于您的问题 - make_shuffle 返回一个指向 iter&lt;T&gt; 类的指针,这意味着为了迭代此实例,您需要获取指针值:

for (auto i : *shuffle_a)
    std::cout << i << " ";

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

inline size_t size()  return (end_ - current_) / sizeof(end_); 

【讨论】:

【参考方案2】:

C++ 中的 for each 循环只是普通 for 循环的掩码,它从给定的相同类型对象列表的开始到结束。它甚至将converted 变为一。因此,在您的情况下,编译器不知道如何处理 for-each 循环。如果您改为使用普通的 for 循环会更好。比如:

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>

足够了

【讨论】:

以上是关于我的迭代器实现不起作用,它有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

检查数组中是不是存在迭代器时,array.includes 不起作用[重复]

C++:使用迭代器替换部分字符串不起作用

如何在 Visual Studio 即时窗口中获取迭代器的元素值? *迭代器不起作用[关闭]

C++ 迭代器/向量在发布版本中不起作用

Laravel:array_push 在 collection->each() 迭代器中不起作用

fbounds 检查不起作用,有啥替代品吗?