54 lines
1.3 KiB
C
54 lines
1.3 KiB
C
|
|
/**
|
||
|
|
* @file mix_cc/algorithm/nearest_index.h
|
||
|
|
* @brief 找到容器内与元素值最相近的索引,无需容器有序
|
||
|
|
* @author Cat (null.null.null@qq.com)
|
||
|
|
* @version 0.1
|
||
|
|
* @date 2021-07-06
|
||
|
|
* 找到容器内与元素值最相近的索引
|
||
|
|
* Company: Baosight Co. Ltd.
|
||
|
|
* DO NOT COPY/USE WITHOUT PERMISSION
|
||
|
|
*
|
||
|
|
*/
|
||
|
|
|
||
|
|
#pragma once
|
||
|
|
#include <algorithm>
|
||
|
|
#include <cstddef>
|
||
|
|
#include <limits>
|
||
|
|
#include <queue>
|
||
|
|
#include <vector>
|
||
|
|
|
||
|
|
namespace mix_cc {
|
||
|
|
/**
|
||
|
|
* @brief 找到容器内与元素值最相近的索引,无需容器有序
|
||
|
|
* @tparam Tp
|
||
|
|
* @tparam Container
|
||
|
|
* @param seq 序列容器
|
||
|
|
* @param values 元素
|
||
|
|
* @return std::vector<size_t>
|
||
|
|
*/
|
||
|
|
template <typename Tp, typename Container>
|
||
|
|
std::vector<size_t> nearset_index(Container seq,
|
||
|
|
std::initializer_list<Tp> values) {
|
||
|
|
std::vector<Tp> mins(values.size(), std::numeric_limits<Tp>::max());
|
||
|
|
std::vector<size_t> index(values.size(), seq.size() - 1);
|
||
|
|
int i = 0;
|
||
|
|
int j = 0;
|
||
|
|
for (auto x : seq) {
|
||
|
|
auto diff = fabs(x - *(values.begin() + i));
|
||
|
|
if (diff <= mins[i]) {
|
||
|
|
mins[i] = diff;
|
||
|
|
j++;
|
||
|
|
} else {
|
||
|
|
if (i < values.size()) {
|
||
|
|
index[i] = j;
|
||
|
|
i++;
|
||
|
|
}
|
||
|
|
if (i == values.size()) {
|
||
|
|
return index;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return index;
|
||
|
|
}
|
||
|
|
} // namespace mix_cc
|