2015-12-15 78 views
2

假设一个类定义如下:快速模糊搜索在C++容器

class Test 
{ 
public: 
    Test(int arg) 
    { 
     x = arg; 
    } 

    bool fuzzyEqual(const Test& other) const { 
     if (abs(x - other.x) < FUZZY_EQUAL) 
      return true; 
     else return false; 
    } 

    int x; 

private: 
    static const int FUZZY_EQUAL = 5; 
}; 

现在假设我们有很多元素的std::vector<Test>

给定一个新的Test对象,是线性搜索以找到在载体中第一元素是“模糊”等于(类似于)给它的最快的方法?

此外,是否有一个像std::map一样工作的容器,但它接受相似性而不是相等的概念?

至于为什么我问: 我表示一些其他物体几个值(在我的情况下,一个整数表示的图像),以及类似的图像会导致类似的值。在一个容器中一次插入一个值时,如果已经存在类似的值,我想避免添加一个值。我不关心在不同容器中插入结果的不同顺序。

+1

将'=='重载为非传递是不好的做法,请使用'bool isSimilar(const Test&)'或其他方法。 –

+0

@MooingDuck固定,谢谢! – Banex

+0

我觉得隐藏在无意义的立面背后隐藏着一个非常明智的问题。也许如果你告诉我们你真的想做什么,我们可以给出解决方案。 – Veedrac

回答

1

您可以对矢量进行排序并使用二进制搜索来查找距离点最近的位置。

例如std::lower_bound为您提供最小值> =您的初始值O(log(n))。而前一个元素--std::lower_bound是您的初始值的最大元素<。如果存在模糊值,即相等,则这两个找到的值中的一个是搜索到的值。

+1

我想你需要'std :: next(std :: lower_bound)'而不是FWIW。 – Veedrac