// iterator class is parametrized by pointer type
template <typename PointerType> class MyIterator {
// iterator class definition goes here
};
typedef MyIterator<int*> iterator_type;
typedef MyIterator<const int*> const_iterator_type;
template<typename blDataType>
class blCustomContainer
{
public: // The typedefs
typedef blRawIterator<blDataType> iterator;
typedef blRawIterator<const blDataType> const_iterator;
typedef blRawReverseIterator<blDataType> reverse_iterator;
typedef blRawReverseIterator<const blDataType> const_reverse_iterator;
.
.
.
public: // The begin/end functions
iterator begin(){return iterator(&m_data[0]);}
iterator end(){return iterator(&m_data[m_size]);}
const_iterator cbegin(){return const_iterator(&m_data[0]);}
const_iterator cend(){return const_iterator(&m_data[m_size]);}
reverse_iterator rbegin(){return reverse_iterator(&m_data[m_size - 1]);}
reverse_iterator rend(){return reverse_iterator(&m_data[-1]);}
const_reverse_iterator crbegin(){return const_reverse_iterator(&m_data[m_size - 1]);}
const_reverse_iterator crend(){return const_reverse_iterator(&m_data[-1]);}
.
.
.
// This is the pointer to the
// beginning of the data
// This allows the container
// to either "view" data owned
// by other containers or to
// own its own data
// You would implement a "create"
// method for owning the data
// and a "wrap" method for viewing
// data owned by other containers
blDataType* m_data;
};
9条答案
按热度按时间inn6fuwd1#
std::iterator
与random_access_iterator_tag
这些基类定义STL所需所有类型定义并执行其他工作请注意
iterator_type
和const_iterator_type
类型定义:它们是非常量和常量迭代器的类型。另请参阅:standard library reference
**EDIT:**从C++17起,
std::iterator
已过时。请参阅相关讨论here。wswtfjt72#
我将向你展示如何为你的自定义容器轻松定义迭代器,但只是为了以防万一,我已经创建了一个c++11库,它允许你为任何类型的容器轻松创建具有自定义行为的自定义迭代器,无论是连续的还是非连续的。
你可以找到它on Github
以下是创建和使用自定义迭代器的简单步骤:
1.创建“自定义迭代器”类。
typedef blRawIterator< Type > iterator;
typedef blRawIterator< const Type > const_iterator;
iterator begin(){return iterator(&m_data[0]);};
const_iterator cbegin()const{return const_iterator(&m_data[0]);};
最后,关于定义我们的自定义迭代器类:
**注意:**定义自定义迭代器时,我们从标准迭代器类别派生,以使STL算法知道我们创建的迭代器的类型。
在这个例子中,我定义了一个随机访问迭代器和一个反向随机访问迭代器:
1.
现在,在自定义容器类中的某个位置:
3qpi33ja3#
他们经常忘记
iterator
必须转换为const_iterator
,而不是相反。在上面的例子中,注意
IntrusiveSlistIterator<T>
如何转换为IntrusiveSlistIterator<T const>
。如果T
已经是const
,则不会使用此转换。laximzn54#
Boost提供了一些帮助:Boost.Iterator程式库。
更准确地说,本页:boost::iterator_adaptor。
非常有趣的是教程示例,它从头开始展示了一个自定义类型的完整实现。
正如已经提到的,要点是使用单个模板实现和
typedef
它。r8xiu3jd5#
我不知道Boost是否有任何帮助。
我喜欢的模式很简单:取一个等于
value_type
的模板参数,可以是const限定的,也可以不是。如果需要,也可以是一个节点类型。然后,一切就都就绪了。只要记住参数化(模板化)所有需要的东西,包括复制构造函数和
operator==
。eivnm1vs6#
有很多好的答案,但我创建了一个我使用的template header,它相当简洁,易于使用。
要向类中添加迭代器,只需编写一个小类,用7个小函数来表示迭代器的状态,其中2个是可选的:
然后,您可以像预期的那样从STL迭代器中使用它:
希望能帮上忙。
gpnt7bae7#
我偶然看到这篇文章,很惊讶这里没有提到一个简单的方法。使用std::iterator描述的指向值的指针显然是一个非常通用的方法。但是你可能可以使用一些更简单的方法。当然,这是一个过于简单的方法,可能并不总是足够的,但是如果它是足够的,我会把它发布给下一个读者。
最有可能的情况是,类中的底层类型是一个STL容器,它已经为你定义了迭代器。如果是这种情况,你可以简单地使用他们定义的迭代器,而不需要真正地自己定义。
下面是一个示例:
kjthegm68#
我很想知道这有多正确,但是看起来像一个滚动自己的迭代器到内部数据存储
然后我只是把这些添加到我的类中,似乎和预期的一样工作。
唯一的问题是,要使用
std::cbegin()
、std::rcbegin()
、std::cend()
和std::rcend()
函数创建它,我必须扩展std
命名空间:drnojrws9#
检查下面的代码,它的工作