从向量中获取通用双向迭代器

san*_*san 5 c++ iterator stl

在编写一个带有泛型双向迭代器的函数之前,我想测试一下int的向量是如何工作的.

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

这段代码不能编译.g ++抱怨你不能将begin()的返回类型转换iterator<bidirectional_iterator_tag, int>为操作符++并且*没有在其上定义.显然我做错了什么,会很感激帮助.

MvG*_*MvG 6

尽管std::iterator是一个简化新迭代器实现的基类,但并非所有迭代器都是使用它实现的,并非所有迭代器都转换为此迭代器.迭代器类的唯一要求是它提供一组给定的操作.这没有暗示类层次结构,并且大多数容器都会发送它们自己的迭代器类.所以在这种情况下,您应该使用vector<int>::iterator迭代器的类型.或者,如果您使用的是最新的C++ 11标准,则可以使用auto编译器推断出类型.

  • @san,模板怎么样?当然,您必须确保传递的迭代器至少具有您需要的功能. (4认同)
  • STL方法是将迭代器传递给模板.你可以创建一个包装器层次结构,你有一个抽象模板`basic_iterator <int>`提供公共接口,并使用它作为`concrete_iterator <std :: vector <int> :: iterator>`模板的基类来包装STL迭代器.这样做,您就可以将编译时鸭子类型转换为运行时多态性.在大多数情况下,这会降低性能,但可能会节省内存,因为您可能需要更少的专业化.您仍然需要将事物作为引用传递以保留多态性. (2认同)