[英]how to define and access custom iterator
我试图做一个自定义的迭代器,我在如何定义/声明并最终访问它的语法中苦苦挣扎。 以下是我的尝试,导致以下错误:
Error C2440 'initializing': cannot convert from 'int' to 'int *'
如果有人可以指出正确的定义/声明方式,那就太好了,因为我认为我的访问方法是标准的。
宣言
template <typename T>
class ddeque
{
public:
typedef T* iterator;
T& begin();
T& end();
}
定义
template<typename T>
T& ddeque<T>::begin()
{
iterator = &(this->unified_array());
return iterator;
}
template<typename T>
T& ddeque<T>::end()
{
iterator = &(this->unified_array + this->size());
return iterator;
}
访问部分-in est.cpp文件
//比较自定义模板和标准模板中的值
typename ddeque<T>::iterator itt = a.begin();
typename deque<T>::iterator ittg = g.begin();
while ((itt != a.end()) && (ittg != g.end()))
{
if (display)
{
cout << *itt << " ";
}
++itt;
++ittg;
}
PS:我刚刚保留了迭代器的相关部分-如果需要其他代码段,请告诉我。
一般来说:
如何定义和访问自定义迭代器
您应该创建一个容器类和一个迭代器类。 后者应从std :: iterator <>派生。 您必须指定迭代器标记,返回值等。 根据迭代器标记,您应该实现运算符(递增,递减等)。 (或者更好的方法是,尽可能实现对数复杂度最高的方法,然后设置最佳的迭代器标签。)
因此,开始和结束应该返回您的迭代器。 看一下一些stl容器实现,它们并不难读。
在你的代码中
ou已经做了typdef T* iterator;
。 该行为指向T类型的指针起了另一个名字。 为了提高可读性,并使以后更改变得更容易,您应该返回带有begin和end的迭代器,因此:
iterator begin();
iterator end();
在上述函数的定义中,您不能为迭代器类型分配值,我建议返回指针(或迭代器),例如在end()中:
return this->unified_array + this->size();
我认为unified_array
是一个指针,所以我用了这种方式。
正如SO成员АндрейБеньковский所指出的那样,我返回的是引用,而不是指针的正确定义解决方案(是什么使它起作用)
宣言:
template <typename T>
class ddeque
{
public:
typedef T* iterator;
iterator begin();
iterator end();
}
定义模板T * ddeque :: begin(){迭代器=&(this-> unified_array()); 返回迭代器; }
template<typename T>
T* ddeque<T>::end()
{
iterator = &(this->unified_array + this->size());
return iterator;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.