2015-12-15 133 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