大多数情况下,STL迭代器都是CopyConstructable,因为有几种STL算法需要这样才能提高性能,例如std::sort
。
但是,我一直在研究一个宠物项目来包装FindXFile API(previously asked about),但问题是围绕这个API实现一个可复制的迭代器是不可能的。无法以任何方式复制查找句柄 - DuplicateHandle
专门禁止将这些类型的句柄传递给它。如果你只是保持对find句柄的引用计数,那么任何副本的单个增量都会导致所有副本的增量 - 显然这不是复制构造的迭代器应该做的。
由于我无法满足迭代器对传统的复制构造要求,是否值得尝试创建“STL样式”迭代器?一方面,创建一些其他枚举方法不会属于正常的STL约定,但另一方面,如果以后STL约定会混淆此迭代器的用户,如果他们稍后尝试CopyConstruct它。
两个邪恶中哪一个较小?
答案 0 :(得分:8)
不是前向迭代器的输入迭代器是可复制的,但是您只能“使用”其中一个副本:递增其中任何一个副本会使其他副本无效(取消引用其中一个不会使其他副本无效)。这允许将其传递给算法,但算法必须通过单次传递完成。您可以通过检查其要求来确定哪些算法正常 - 例如copy
只需要一个InputIterator,而adjacent_find
需要一个ForwardIterator(我找到的第一个)。
听起来好像这描述了你的情况。只需复制句柄(或重新装入句柄的东西),不要重复它。
用户必须明白它只是一个InputIterator,但实际上这并不是什么大问题。 istream_iterator
是相同的,出于同样的原因。
有了C ++ 11后见之明,要求InputIterators可以移动几乎没有意义,但不要求它们是可复制的,因为副本的使用有限。但这是“限制使用”,而不是“没用”,而且现在从InputIterator中删除功能已经为时已晚,考虑到有多少代码依赖于现有定义。