2017-08-14 52 views
0

的名單,我有以下結構的列表結構獨特

struct Element 
{ 
    int id; 
    int groupID; 

    }; 

我想知道有多少獨特的羣體有

例如

list<Element> myElements; 
    Element e; 
    e.id = 0; 
    e.groupID = 2; 
    myElements.push_back(e); 

    e.id = 1; 
    e.groupID = 0; 
    myElements.push_back(e); 

    e.id = 2; 
    e.groupID = 2; 
    myElements.push_back(e); 

    e.id = 3; 
    e.groupID = 1; 
    myElements.push_back(e); 

這裏有4種元素但只有3個唯一的組ID ids 0,1,2

我試圖尋找一種有效的方式來做到這一點因爲我的名單越來越大。

我想這

struct groupID_unique { 
    bool operator() (Element first, Element second) 
    { return (first.groupID != second.groupID); } 
    }; 

    myElements.unique(groupID_unique()); 

但這返回到我2未重複IDS 0.1

+0

'unique'是錯誤的方式去更多的原因。它只對有序列表非常有用(只有連續的重複被認爲是重複的)並且具有破壞性(它刪除了它找到的重複項) – user4581301

回答

2

使用一組存儲項目(臨時)。一組將只存儲唯一的項目。該集合的大小是唯一項目的數量。

添加相等比較的對象:

struct Element { 
    bool operator==(Element const& rhs) const { 
    return id == rhs.id && groupId == rhs.groupId; 
    } 
}; 

使用set

std::set<Element> elementSet{elementList.begin(), elementList.end()}; 
size_t const numUniqueElements = elementSet.size(); 

請注意,在構建set時會有一些成本(時間和空間複雜度)。如果你想保留重複用於其他目的,那麼你可以用list繼續,否則,你可以從listset所以切換,你總是有現成的獨特的計數(通過.size()