删除重复的条目

时间:2012-11-22 17:24:05

标签: c++ stl indexing complexity-theory multimap

我需要在容器中插入一些条目,但是,如果条目具有与之前插入的条目之一共有的两个特定属性:它将被视为欺骗。

棘手的部分是,如果我发现任何欺骗,我不希望任何共享这些属性值的条目成为容器的一部分(甚至不是第一个,这不是一个欺骗,因为它是首先发现。)

我正在考虑使用多图,将一对中的两个属性作为键(假设两个属性具有明确定义的运算符==)和指向该条目的指针作为索引所有条目的值。 / p>

一旦我扫描了所有条目并完成了我的多图,我就会遍历多图,并在输出容器中添加了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

1 个答案:

答案 0 :(得分:1)

我会使用地图(不是多图),如下所示:

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.