【问题标题】:Is it possible to create an "external" iterator class (ie: without access to the original data type)是否可以创建一个“外部”迭代器类(即:不访问原始数据类型)
【发布时间】:2022-01-15 08:50:36
【问题描述】:

我正在开展一个项目,在该项目中为 MFC 类 CArray 创建迭代器类型会很有用。

由于CArray 是 MFC 库的一部分,我无权访问此对象。

我还没有完全了解创建迭代器,但据我所知,通常会创建一个迭代器类型作为迭代器对应的类类型的成员。换句话说,需要访问类本身。

是否可以为类创建“外部”迭代器。即:CArray 类的外部。

【问题讨论】:

  • CArray 是一个连续的内存区域,不是吗?如果是这样,指向其元素 的指针就是 一个随机访问迭代器。无需做任何额外的工作。
  • CArray 应该非常简单地包装在迭代器中:您所需要的只是对原始 CArray 对象的引用,以及迭代器的当前索引。

标签: c++ iterator mfc


【解决方案1】:

CArray 是一个连续的容器。因此,一个简单的指针就是这个容器的随机访问迭代器:

template<class ...Ts>
auto begin(CArray<Ts...>& arr) noexcept { return &arr[0]; }

template<class ...T>
auto begin(CArray<Ts...> const& arr) noexcept { return &arr[0]; }

template<class ...T>
auto end(CArray<Ts...>& arr) noexcept { return begin(arr) + arr.GetSize(); }

template<class ...T>
auto end(CArray<Ts...> const& arr) noexcept { return begin(arr) + arr.GetSize(); }

【讨论】:

  • 那么你将如何在begin/end之间进行迭代?
  • @AndrewTruckle 像任何其他迭代器一样。这些是随机访问迭代器。
  • @AyxanHaqverdili:这会返回指针。指针是连续数组的迭代器。这是故意的——迭代器的定义是指针的泛化。
  • @MSalters 是的,确实如此。这正是我想说的。
猜你喜欢
  • 1970-01-01
  • 2022-01-10
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多