假设我有一个这样的矢量:
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。
另一种方法是什么?
答案 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;
}