在有条件的向量中找到最接近的数字

Find nearest number in vector with conditions

本文关键字:最接近 数字 有条件 向量      更新时间:2023-10-16

假设我有一个这样的向量:

std::vector<int> inputs = {3,2,6,3,7,1,8};
int left = 1; // Number 3
int right = 4; // Numbers 2,6,3,7
int middle = 2; // Numbers 1,8

现在对于">中间"(1,8)中的每个数字,我想找出向量"左侧和右侧"中最接近更大数。如果没有更大的数字,则返回最接近的较小数字。

// Iterating the last two numbers 1, and 8.
for(int i = left+right; i<left+right+middle; i++){
...
}

我尝试使用std::lower_bound获取最近的GREATER 元素,但它总是返回一些数字。即使没有更大或相等的元素。因此,我无法继续...

输出应如下所示:

closest-left, closest-right --> index in vector
3,2 --> index 0,1
3,7 --> index 0,4

输出说明:

{3}左侧最接近 1 的数字是 3,左侧 {2,6,3,7},其 2。

左侧最接近 8 的数字{3}是 3,左侧 {2,6,3,7},是 7。

解决这个问题的另一种方法是什么?

您正在寻找带有自定义比较器的min_element

const std::vector<int> inputs = {3,2,6,3,7,1,8};
int left = 1; // Number 3
int right = 4; // Numbers 2,6,3,7
int middle = 2; // Numbers 1,8
for (int i = left + right; i < left + right + middle; ++i) {
auto as_tuple = [&, i](int e) { return std::make_tuple(e < inputs[i],
std::abs(e - inputs[i]));};
auto comparer = [&, i](int lhs, int rhs){ return as_tuple(lhs) < as_tuple(rhs); };
auto it1 = std::min_element(inputs.begin(), inputs.begin() + left, comparer);
auto it2 = std::min_element(inputs.begin() + left,
inputs.begin() + left + right,
comparer);
// Assuming non-empty ranges: else check left, right with 0
std::cout << *it1 << ", " << *it2
<< " --> index "
<< std::distance(inputs.begin(), it1) << ", "
<< std::distance(inputs.begin(), it2) << std::endl;
}

演示