2012-11-22 232 views
1

我需要在容器中插入一些條目,但是,如果條目與先前插入的條目之一具有兩個共同的特定屬性,則它將被視爲重複。刪除重複的條目

棘手的部分是,如果我發現任何欺騙,我不希望任何分享這些屬性值的條目成爲容器的一部分(甚至不是第一個,因爲它不是第一個被首次發現)。

我在考慮使用一個multimap,以一對中的兩個屬性作爲關鍵字(假設兩個屬性有一個定義好的運算符==)和一個指向該條目的指針作爲索引所有條目的值。

一旦我掃描了所有的條目並完成了我的多重映射,我將迭代遍及多重映射,並且在輸出容器中添加了equal_range和std :: distance的幫助,只有我有單一事件。

假設我只想使用標準的stl容器和工具,或者最終增強庫,是否是效率方面最好的方法呢?

typedef std::pair<attribute1,attribute2> key; 
multimap<key, entry*> multimap; 
typedef multimap<key, entry*>::iterator MultimapIter; 

// process all the entries and fullfill the multimap 

MultimapIter iter; 
for(iter = multimap.begin(); iter != multimap.end(); ++iter) 
{ 
    std::pair<MultimapIter,MultimapIter> keyRange = 
      multimap.equal_range(iter->first); 

    if(std::distance(keyRange.first, keyRange.second) != 1) 
     iter = --keyRange.second; 
    else 
     // Fill the output container with the entry 
} 

// Destroy the multimap 
+0

爲什麼不使用'map'代替,並用'find'檢測的發生,並將其標記爲將'entry *'指定爲'nullptr'。 – xiaoyi

回答

1

我會利用地圖的(不multimap)來說,是這樣的:

map mymap; 
for (all entries) 
{ 
    pair::iterator,bool> res = mymap.insert(entry); 
    if (!res->second) 
    { 
    // Value not inserted, a duplicate must already be here. 
    // Mark duplicate by zeroing the entry pointer 
    iter->first->second = NULL; 
    } 
} 
// Now remove all items from mymap with a zero pointer and you have a map with unique entries left over.