2012-11-22 201 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.