2017-01-14 38 views
4

我需要創建stl :: set結構。我寫如何創建std :: set結構

stl::set <Point> mySet; //Point - name of structure 

但後來我嘗試添加結構實例MYSET

Point myPoint; 
mySet.insert(myPoint); 

有幾個編譯錯誤(錯誤C2784,C2676錯誤)。 有人可以提供建議嗎?

1> C:\ Program Files文件(x86)的\微軟的Visual Studio 10.0 \ VC \包括\ xfunctional(125):錯誤C2784:布爾的std ::操作<(常量的std ::矢量< _Ty,_AX > &,常量性病::矢量< _Ty,_AX> &):未能從 「常量點」 把參數傳遞給模板 「常量性病::矢量< _Ty,_AX> &」

1> C: \ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ include \ xfunctional(125):error C2676:binary「<」:「const Point」未定義此運算符或轉換爲集成可接受的類型d運算符

+0

那麼,它的'std :: set'。 'C2784'和'C2676'沒有任何意義。我們需要實際的信息。另外,你確定'struct Point'是否實現'operator <'? 'std :: set'需要它。 – DeiDei

+1

爲'Point'結構定義'operator <'。 – void

回答

7

std::set模板提供了一個關聯容器,其中包含一組經過排序的唯一對象。關鍵詞有排序唯一。爲了支持排序,接下來會有一些可能性,但最終都必須導致符合strict weak ordering

std::set的第二個模板參數是比較類型。缺省值std::less<Key>由標準庫提供,其中Key是您在容器中存儲的對象類型(在您的案例中爲Point)。該默認值僅使用支持密鑰類型的任何允許的可用operator <生成比較。這意味着一種方式或其他象這樣的,如果你使用的是默認比較(std::less<Point>你的情況),那麼你的類必須假設操作:

Point pt1(args); 
Point pt2(args); 

if (pt1 < pt2) // <<=== this operation 
    dosomething(); 

做低於這個出現的多種方法提供一個成員operator <

到目前爲止做到這一點最簡單的方法是爲您的Point類提供一個成員operator <。這樣做pt1 < pt2變得有效,然後std::less<Point>然後很高興。假設你的類是傳統的X,Y點,它應該是這樣的:

struct Point 
{ 
    int x,y; 

    // compare for order.  
    bool operator <(const Point& pt) const 
    { 
     return (x < pt.x) || ((!(pt.x < x)) && (y < pt.y)); 
    } 
}; 

提供自定義比較類型

另一種方法是提供自定義比較類型,而不是依靠std::less<Point>。其中最大的優點是能夠定義幾個可能意味着不同的事物,並根據需要在容器或算法中使用它們。

struct CmpPoint 
{ 
    bool operator()(const Point& lhs, const Point& rhs) const 
    { 
     return (lhs.x < rhs.x) || ((!(rhs.x < lhs.x)) && (lhs.y < rhs.y)); 
    } 
}; 

有了這一點,你現在就可以宣佈你std::set這樣的:

std::set<Point,CmpPoint> mySet; 

值得考慮使用這種方法:該類型是不是Point一部分,所以私有成員變量或函數的任何訪問必須通過朋友們來進行會計處理。


提供無功能operator <

另一較不常見的機構被簡單地提供全球自由功能,提供operator <。這不是一個成員函數。在此過程中,再次默認std::less<Point>將生成有效的代碼。

bool operator <(const Point& lhs, const Point& rhs) 
{ 
    return (lhs.x < rhs.x) || ((!(rhs.x < lhs.x)) && (lhs.y < rhs.y)); 
} 

這看起來可能是自定義比較器和成員運算符的混合,事實上許多優點和缺點都會出現。例如:與會員operator <一樣,您可以使用默認的std::less<Point>。與自定義比較器一樣,這是非類功能,因此必須通過好友或訪問者提供對私人成員的訪問權限。


摘要

您的需求,我會去用簡單的方法;只需成爲會員operator <。有機會,你總是想要以這種方式訂購你的Point。如果不是,請使用自定義比較器。在或者 case make sure你尊重嚴格的弱排序。