2017-08-14 43 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()