gpt4 book ai didi

c++ - 底层集合的抽象迭代器

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:30:34 25 4
gpt4 key购买 nike

所以基本上我想做的是让一个纯虚拟方法返回一个迭代器到一个具体类型的任意集合,例如在伪代码中:

virtual Iterator<T> getIterator() const = 0;

这个类的使用者实际上并不关心子类使用什么实现。它可以是集合、 vector 、列表、数组等。

我知道 std::iterator类,但我找不到正确指定它以便使用简单 vector 的方法。

virtual std::iterator<std::random_access_iterator_tag,T> getIterator() const = 0;

myVector.begin() // compilation error in implementation

定义std::iteratorconst T因为类型参数也不起作用。我也试过离开 T而是将指针和引用类型定义为 const T*const T& .

通过查看 std::vector实现,我发现std::vector::const_iterator实际上源自 _Iterator012源自 _Iterator_base .

在 std 中没有任何方法可以处理任意集合,这真的让我很烦恼。将我的类实现为模板,如 <algorithm>由于两个原因,这对我来说不是一个选择:

  • 无法控制实际值类型
  • 我只是不想让我的类模板使我的设计变得非常复杂并降低灵 active 。

使用的类型参数T只是为了演示,实际上这是一个具体的类型。

最佳答案

这是使用类型删除的基本且非常基本的框架方法。不过,您必须填写很多遗漏的详细信息!

#include <memory>

template <typename T>
class TEIterator
{
struct TEImplBase
{
virtual ~TEImplBase() { }
virtual std::unique_ptr<TEImplBase> clone() const = 0;
virtual void increment() = 0;
virtual T & getValue() = 0;
T * getPointer() { return std::addressof(getValue()); }
};

template <typename Iter>
struct TEImpl
{
Iter iter;

TEImpl(Iter i) : iter(i) { }

virtual T & getValue()
{ return *iter; }

virtual std::unique_ptr<TEImplBase> clone() const
{ return std::unique_ptr<TEImplBase>(new TEImpl<Iter>(*this)); }

virtual void increment()
{ ++iter; }
};

std::unique_ptr<TEImplBase> impl;

public:

template <typename T>
TEClass(T && x)
: impl(new TEImpl<typename std::decay<T>::type>(std::forward<T>(x)))
{
}

TEClass(TEClass && rhs) = default;

TEClass(TEClass const & rhs) : impl(rhs.impl.clone()) { }

TEIterator & operator++()
{
impl->increment();
return *this;
}

T & operator*() { return impl->getValue(); }
T * operator->() { return impl->getPointer(); }
};

用法:

std::vector<int> v;
std::deque<int> dq;

TEIterator<int> a = v.begin(), b = dq.end();

关于c++ - 底层集合的抽象迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13670671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com