是否有理由使用 std::distance() 而不是 iterator::operator-()?
Is there a reason to use std::distance() over iterator::operator-()?
我不确定为什么同时存在 std::distance(iterator const&, iterator const&)
和 iterator::operator-(iterator const&)
(以及适配器 operator-(iterator const&, iterator const&)
),其中 iterator
是任何迭代器的占位符。应该用一个代替另一个,如果是,在什么情况下?
operator -
不是大多数迭代器类型的成员,因此一般使用它是错误的,除非您的算法仅支持随机访问。
另一方面,std::distance
知道迭代器类别,如果可用,将使用 operator -
,如果不可用,它将使用 N
调用 operator --
来做减法。
嗯,并非所有迭代器都支持减去两个迭代器。对于某些人来说,它甚至没有意义,抛开违反的性能约束(它应该是 O(1),而不是 O(n))。即使是,你为什么认为迭代器是 class 类型?
std::distance()
因此回落到迭代,直到距离被覆盖作为回退,这是一个基本的迭代器操作。
虽然这种退化并不总是可以接受的,如果发生这种情况,距离最好为正,否则会带来 UB 的痛苦。
不过,尤其是在编写泛型代码(或以后可能泛化的代码)时,保持泛型是好的:
写入接口(您需要的最小接口),而不是实现。
我不确定为什么同时存在 std::distance(iterator const&, iterator const&)
和 iterator::operator-(iterator const&)
(以及适配器 operator-(iterator const&, iterator const&)
),其中 iterator
是任何迭代器的占位符。应该用一个代替另一个,如果是,在什么情况下?
operator -
不是大多数迭代器类型的成员,因此一般使用它是错误的,除非您的算法仅支持随机访问。
std::distance
知道迭代器类别,如果可用,将使用 operator -
,如果不可用,它将使用 N
调用 operator --
来做减法。
嗯,并非所有迭代器都支持减去两个迭代器。对于某些人来说,它甚至没有意义,抛开违反的性能约束(它应该是 O(1),而不是 O(n))。即使是,你为什么认为迭代器是 class 类型?
std::distance()
因此回落到迭代,直到距离被覆盖作为回退,这是一个基本的迭代器操作。
虽然这种退化并不总是可以接受的,如果发生这种情况,距离最好为正,否则会带来 UB 的痛苦。
不过,尤其是在编写泛型代码(或以后可能泛化的代码)时,保持泛型是好的:
写入接口(您需要的最小接口),而不是实现。