函数描述与 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 一般都很好,但它是一个社区维护的项目;不是官方文档。它还有时会使用稍微模棱两可的措辞来使文本更易于理解。
对于官方的要求,我们必须转向标准。在那里,所有这些要求都明确说明:
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
.
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_bound
和 std::upper_bound
默认使用 std::less
进行比较,而 std::remove
使用 operator==
.
在 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 thanvalue
它仍然使用 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 一般都很好,但它是一个社区维护的项目;不是官方文档。它还有时会使用稍微模棱两可的措辞来使文本更易于理解。
对于官方的要求,我们必须转向标准。在那里,所有这些要求都明确说明:
Let
comp
beless{}
andproj
beidentity{}
for overloads with no parameters by those names.
...
Returns: The furthermost iteratori
in the range[first, last]
such that for every iteratorj
in the range[first, i)
,bool(invoke(comp, invoke(proj, *j), value))
istrue
.
Let
comp
beless{}
andproj
beidentity{}
for overloads with no parameters by those names.
...
Returns: The furthermost iteratori
in the range[first, last]
such that for every iteratorj
in the range[first, i)
,!bool(invoke(comp, invoke(proj, *j), value))
istrue
.
来自 [alg.remove]
Let E be
--bool(*i == value)
forremove
,
...
Effects: Eliminates all the elements referred to by iteratori
in the range[first, last)
for which E holds.
这些描述没有歧义。 std::lower_bound
和 std::upper_bound
默认使用 std::less
进行比较,而 std::remove
使用 operator==
.