我的迭代器实现不起作用,它有啥问题?
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<int>*
没有它们,begin
和 end
不应该返回指针。
回复:I wrote begin() and end() function
。这不会解决问题,因为这首先不是问题。你看,它不知道如何迭代 Iter++
和 --
应该修改和返回迭代器,而不是你迭代的元素。您应该更仔细地研究标准迭代器。
尝试使用您的迭代器编写一个“常规”循环,您会注意到它不像普通迭代器那样工作。花时间明确说明类型,而不依赖于auto
。
【参考方案1】:
对于您的问题 - make_shuffle
返回一个指向 iter<T>
类的指针,这意味着为了迭代此实例,您需要获取指针值:
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 不起作用[重复]
如何在 Visual Studio 即时窗口中获取迭代器的元素值? *迭代器不起作用[关闭]