【问题标题】:Obtaining a generic bidirectional iterator from a vector从向量中获取通用双向迭代器
【发布时间】:2012-07-17 22:32:54
【问题描述】:

在编写一个采用通用双向迭代器的函数之前,我想测试一下它对整数向量的工作原理。

vector<int> a(10,1);
iterator<bidirectional_iterator_tag, int> i = a.begin();
for (; i != a.end(); ++i) cout << *i;

此代码无法编译。 g++ 抱怨您不能将 begin() 的返回类型转换为 iterator&lt;bidirectional_iterator_tag, int&gt; 并且运算符 ++* 没有在其上定义。显然我做错了什么,希望得到帮助。

【问题讨论】:

标签: c++ stl iterator


【解决方案1】:

虽然std::iterator 是一个基类,它简化了新迭代器的实现,但并非所有迭代器都使用 this 实现,也不是所有迭代器都转换为 this。迭代器类的唯一要求是它提供一组给定的操作。这并不暗示类层次结构,并且大多数容器都提供自己的迭代器类。因此,在这种情况下,您应该使用 vector&lt;int&gt;::iterator 作为迭代器的类型。或者,如果您使用的是最新的 C++11 标准,则可以使用 auto 让编译器推断类型。

【讨论】:

  • 这是否意味着我不能将 vector&lt;&gt;::iterator 传递给接受通用双向迭代器的函数?那将是相当令人失望的。我尝试了投射,但也没有用。
  • @san,模板怎么样?当然,您必须确保传递的迭代器至少具有您需要的功能。
  • @chris 是的,这行得通。我希望通过限制可能的类型,我会得到更多信息丰富的错误消息。
  • STL 方式是将迭代器传递给模板。您可以创建一个包装层次结构,其中有一个抽象模板basic_iterator&lt;int&gt; 提供公共接口,并将其用作concrete_iterator&lt;std::vector&lt;int&gt;::iterator&gt; 模板的基类来包装STL 迭代器。这样做,您会将编译时的鸭子类型转换为运行时的多态性。在大多数情况下,这会降低您的性能,但可能会节省内存,因为您可能需要较少的专业化。您仍然需要将事物作为引用传递以保留多态性。
  • 如果你想检查某个东西是否是一个迭代器,你可以使用iterator_traits 和一种或另一种形式的静态断言。 (C++ 在核心语言中有它们,boost 提供了可移植的机制。)
猜你喜欢
  • 2014-09-19
  • 1970-01-01
  • 2017-03-28
  • 2010-10-14
  • 2019-01-17
  • 1970-01-01
  • 2017-08-29
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多