我有一个符合双向迭代器要求的自定义迭代器类(但不是随机访问)。但是,两个迭代器的距离也可以在恒定时间内找到。从概念上讲,it2 - it1
是有效的,但it += n
不是(这些运算符重载都没有实际实现)。
重载std::distance()
以允许标准库算法使用此迭代器有效地计算距离是否合理?
我发现有关篡改std
命名空间内容的适当性的相互矛盾的信息。
答案 0 :(得分:3)
关于命名空间的使用,神圣的标准说:
[namespace.std]/1(强调我的):
如果添加声明或者C ++程序的行为是未定义的 命名空间std或命名空间std中的命名空间的定义 除非另有规定。 程序可能会添加模板 专门用于任何标准库模板到命名空间std 如果声明取决于用户定义的类型和 专业化符合标准库的要求 原始模板并未明确禁止。
因此,不允许添加重载,因为它是一个新的声明。我找不到明确的禁止,因此认为在新的迭代器类型上完全专门化std::distance
函数模板应该没问题。只要您满足原始模板的要求即可。主要要求是返回类型必须与std::iterator_traits<InputIt>::difference_type
元函数指定的相同。它可能还需要您专门化std::iterator_traits
。