gpt4 book ai didi

c++ - 创建一个不可复制的 STL 迭代器是个好主意吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:04 26 4
gpt4 key购买 nike

大多数时候,STL 迭代器是可复制构造的,因为一些 STL 算法需要这样做来提高性能,例如 std::sort

但是,我一直在从事一个包装 FindXFile API ( previously asked about ) 的宠物项目,但问题是不可能围绕此 API 实现可复制的迭代器。不能以任何方式复制查找句柄——DuplicateHandle 特别禁止将这些类型的句柄传递给它。如果您只是维护查找句柄的引用计数,那么任何拷贝的单个增量都会导致所有拷贝的增量——显然这不是拷贝构造的迭代器应该做的。

既然我不能在这里满足迭代器的传统复制构造要求,是否值得尝试创建一个“STL 风格”的迭代器?一方面,创建一些其他枚举方法不会落入正常的 STL 约定,但另一方面,如果用户稍后尝试 CopyConstruct,遵循 STL 约定会使该迭代器的用户感到困惑。

两害相权取其轻?

最佳答案

不是前向迭代器的输入迭代器是可复制的,但您只能“使用”其中一个拷贝:增加其中任何一个会使其他拷贝无效(取消引用其中一个不会使其他拷贝无效)。这允许它被传递给算法,但算法必须通过一次完成。您可以通过检查算法的要求来判断哪些算法是可行的 - 例如 copy 只需要一个 InputIterator,而 adjacent_find 需要一个 ForwardIterator(我找到的第一个)。

在我看来,这似乎描述了您的情况。只需复制句柄(或引用句柄的东西),而不复制它。

用户必须明白它只是一个 InputIterator,但实际上这没什么大不了的。 istream_iterator 是一样的,也是出于同样的原因。

借助 C++11 的后见之明,要求 InputIterators 是可移动的但不要求它们是可复制的几乎是有意义的,因为重复项的使用无论如何都是有限的。但这是“有限使用”,而不是“无用”,而且考虑到有多少代码依赖于现有定义,现在从 InputIterator 中删除功能已经太晚了。

关于c++ - 创建一个不可复制的 STL 迭代器是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2568294/

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