【发布时间】:2019-11-20 08:24:35
【问题描述】:
我有一组(排序的)未签名的int。我需要找到最接近给定数字的元素。
我正在寻找使用标准库的解决方案,
我的第一个解决方案是使用二进制搜索,但 STL 的实现仅在元素存在时才返回。
这篇 Find Closest Element in a Set 的帖子很有帮助,我实现了一个基于 std::lower_bound 方法的解决方案,
(*假设集合有超过 2 个元素,则不进行空/边界检查):
#include <iostream>
#include<set>
#include<algorithm>
#include<cmath>
int main()
{
std::set<unsigned int> mySet = {34, 256, 268, 500, 502, 444};
unsigned int searchedElement = 260;
unsigned int closestElement;
auto lower_bound = mySet.lower_bound(searchedElement);
if (lower_bound == mySet.end()){
closestElement = *(--lower_bound);
}
std::set<unsigned int>::iterator prevElement = --lower_bound;
bool isPrevClosest = std::abs(*prevElement - searchedElement) > std::abs(*lower_bound - searchedElement);
closestElement = isPrevClosest ? *prevElement : *lower_bound;
std::cout << closestElement << std::endl;
return 0;
}
有没有更简单更标准的解决方案?
【问题讨论】:
-
可能我没看懂问题,但是
find有什么问题?它返回一个迭代器。你只需要移动一步。 -
@ZDF,是的,成员
.find()确实是对数的。但是这里怎么用呢?它查找特定元素,与std::find相比,它不需要谓词(这就是我假设std::find的原因)。 -
我假设 OP 正在寻找集合中的一个元素。我的错。