对于一般的集合求解交集,我们直接使用std::set_intersection即可,但是float和double都有精度问题,如果直接求交集,会认为比如0.9999和1.0001是两个数,造成并没有真正取得交集,其实这个函数实现也很容易,那么我在这里分享其模板实现。
//author:autumoon
//邮箱:9506@163.com
//日期:2023-07-05
template <typename T>
std::set<T> MyValueIntersection(const std::set<T>& sValuesF, const std::set<T>& sValuesS, double dTolerance = 1e-6)
{
std::set<T> sDstValues;
//对于每一个元素,如果两边同时包含,则添加,需要考虑误差
for (auto it_f = sValuesF.begin(); it_f != sValuesF.end(); ++it_f)
{
const T& vF = *it_f;
for (auto it_s = sValuesS.begin(); it_s != sValuesS.end(); ++it_s)
{
const T& vS = *it_s;
if (fabs(vF - vS) < dTolerance)
{
bool bExist = false;
//遍历每一个元素,如果不存在则添加,因为精度问题,不能直接添加
for (auto it_d = sDstValues.begin(); it_d != sDstValues.end(); ++it_d)
{
const T& vD = *it_d;
if (fabs(vF - vD) < dTolerance)
{
bExist = true;
break;
}
}
if (!bExist)
{
sDstValues.insert(vF);
}
}
}
}
return sDstValues;
}
欢迎交流与讨论。