C++ set find value 更小但更接近 x

Dav*_*mes 4 c++ set

我看了看lower_bound,并upper_bound在C ++ STL的<set>。但是,我找不到一种方法来获得最接近(从下面)到集合中另一个值的值。有没有一种简单的方法来获得它,或者我是否必须迭代该集合?

例如,假设我的集合包含以下整数3 4 7 9,然后closest(6) = 4closest(4) = 4

Rak*_*111 5

std::upper_bound 返回一个大于给定值的元素,因此在您的情况下,您必须将其递减以获得之前的值。

//Returns value of element before 'num'
int closest = *--set.upper_bound(num);
Run Code Online (Sandbox Code Playgroud)

我会想到closest(6) = 7,因为比7更接近。如果您想获得,则必须计算相邻值之间的差异并进行比较。647

//Calculate closest value to 'num' in a std::set<int>
int closest(std::set<int>& set, int num)
{
    //Get iterator to element greater than 'num'
    auto it = set.upper_bound(num);

    //Check if 'it' is the 'end' iterator
    if (it == std::end(set))
        return 0;

    int valueLeft = *it--; //Get value of the greater element
    int valueRight = *it; //Get value of the element before (due to post-decrement)

    //Compare diffence between value less and num, and value greater and num
    if (valueLeft - num > num - valueRight)
        return valueRight;
    else
        return valueLeft;
}

std::set<int> set{ 3, 4, 7, 9 };

int a = closest(set, 6); //Returns '7'
int b = closest(set, 4); //Returns '4'
Run Code Online (Sandbox Code Playgroud)

  • `std::upper_bound` 在集合上效率低下。您可以改用 `std::set::upper_bound`。 (5认同)