【发布时间】:2021-09-08 17:31:40
【问题描述】:
当我编写一个有点奇怪的代码时,我有一种感觉,我可能误解了一些东西。
find_less 函数的实现是否比下面提供的更好?
#include <iostream>
#include <set>
using Set = std::set<int>;
Set set{ 0, 1, 3, 7, 9, 10 };
Set::iterator find_less(int val)
{
auto i = set.lower_bound(val);
if (i == set.begin())
{
return set.end();
}
return --i;
}
int main()
{
auto i = find_less(5);
if (i != set.end())
{
//outputs 3
std::cout << *find_less(5) << std::endl;
}
return 0;
}
std::set 有 lower_bound 和 upper_bound 函数查找大于(或等于)给定键的第一个元素,但它没有查找小于(或等于)给定键的元素?
EDIT1:
有
std::lower_bound(set.rbegin(), set.rend(), val)
但看起来它只对随机访问迭代器是对数的,请参阅https://en.cppreference.com/w/cpp/algorithm/lower_bound:std::set 和 std::multiset 迭代器不是随机访问,因此它们的成员函数 std::set::lower_bound (resp. std::multiset::lower_bound) 应该是首选。
【问题讨论】:
-
您正在检查
lower_bound是否返回set.end(),但您可能应该检查它是否返回set.begin()。*find_less(11)将导致未定义的行为,*find_less(0)也是如此。 -
@DrewDormann 更新了帖子。
-
现在您已经更改了问题中的代码,
*find_less(11)将仍然导致未定义行为。它将取消引用 end 迭代器。find_less(0)现在将返回一个 不 小于给定键的迭代器。 -
我对小于、等于、第一、最大值感到困惑……预期的输出是什么? 3 ?
find_less(7)的预期结果是什么? -
这些 cmets 可能会导致回答您的第二个“这不是很奇怪...”问题。 C++ 中的容器支持“结束后一个”迭代器,但不支持“开始前一个”迭代器。
标签: c++