我想构建一个简单的迭代器,例如 - 在类中:“myVector”:
#include <iostream>
using namespace std;
#define maxSize 10
class myVector {
private:
int *arr;
int sp;
public:
myVector() {
arr = new int[maxSize];
sp = 0;
}
bool add(int num) {
if (sp==maxSize) return 0;
arr[sp] = num;
sp++;
return 1;
}
};
示例中的- 我构建了一个生成myVector类型对象的类。现在我想构建一个带有operator ++的迭代器,以便在向量的私有数组上运行。
非常感谢
答案 0 :(得分:2)
您必须支持std::iterator_traits<YourIterator>
。简单的方法是使用适当的参数继承std::iterator<?>
。
这样做你必须决定一个迭代器类别。这决定了您保证支持的内容,包括操作员明智和行为明智。
现在,boost
有一些辅助类型,使编写迭代器更容易。考虑使用boost
。但是没有它们就不可能写出基本的迭代器。
在上面的特定情况中,指针是您问题的有效迭代器。并且比上述任一选项更容易。将此作为您的第一次迭代:KISS。请注意,指针对免费提供std::iterator_traits
支持。
要使对象可迭代(并支持for(auto&&x:c)
语法),请在与生成迭代器的类相同的命名空间中编写一个空闲的begin
和end
函数,或者添加{{ 1}}和begin()
方法也是如此。我倾向于添加end()
和size
以及empty
和front
,因为我觉得它们很有用。举个例子:
back
答案 1 :(得分:1)
你需要写这样的东西。
class myVector {
class myIterator {
private:
int *position; //operator ++ increment this position
public:
myIterator operator++(){
//increment position here
}
int& operator*(){
//return *pos
}
bool operator==(const myIterator &it)const {
//check that pos and it.pos are the same
}
};
};
这可以工作,但不会是一个符合STL的迭代器,因为你还需要添加几个typedef,例如你的迭代器的类型(在你的情况下你有一个输入迭代器)。如果你想要一个STL迭代器,最简单的方法就是使用boost facade iterator。