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

时间:2018-01-22 01:35:03

标签: c++ c++11 search vector

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

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)中的每个数字,我想知道最近的 GREATER 号码是什么在矢量'左侧和右侧'。如果没有更大的号码,请返回最近的 SMALLER 号码。

// 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。

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

另一种方法是什么?

1 个答案:

答案 0 :(得分:1)

您正在寻找使用自定义比较器的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;
}

Demo