函数描述与 C++ 参考上的可能实现

Function description vs possible implementation on C++ reference

std::lower_bound and std::upper_bound from C++ reference 的两个参考页中,我阅读了

[...] uses operator< to compare the elements, [...]

这对我很有用,因为有了这些信息我知道,即使后面的功能

Returns an iterator pointing to the first element in the range [first, last) that is greater than value

它仍然使用 operator< 来这样做,而不是 operator>,所以前者必须为容器中存储的对象的 class/type 定义。 Possible implementation 部分,行 if (!(value < *it)) {,正好证实了这一点。

但是,例如 std::remove 的参考页,我阅读了

Removes all elements that are equal to value

根本没有提到任何 oparator,所以原则上我不知道哪个 one/ones is/are 假定在存储的对象的 class 中定义在容器中。 可能的实现 使用 operator==(参见 if (!(*i == value)) 行)。

因此我的问题是:某些函数的文档页面是否有意未指定调用该函数的 classes 必须满足的 "requirements"?

虽然 cppreference 一般都很好,但它是一个社区维护的项目;不是官方文档。它还有时会使用稍微模棱两可的措辞来使文本更易于理解。

对于官方的要求,我们必须转向标准。在那里,所有这些要求都明确说明:

来自 [lower.bound]

Let comp be less{} and proj be identity{} for overloads with no parameters by those names.
...
Returns: The furthermost iterator i in the range [first, last] such that for every iterator j in the range [first, i), bool(invoke(comp, invoke(proj, *j), value)) is true.

来自[upper.bound]

Let comp be less{} and proj be identity{} for overloads with no parameters by those names.
...
Returns: The furthermost iterator i in the range [first, last] such that for every iterator j in the range [first, i), !bool(invoke(comp, invoke(proj, *j), value)) is true.

来自 [alg.remove]

Let E be
-- bool(*i == value) for remove,
...
Effects: Eliminates all the elements referred to by iterator i in the range [first, last) for which E holds.

这些描述没有歧义。 std::lower_boundstd::upper_bound 默认使用 std::less 进行比较,而 std::remove 使用 operator==.