我需要在容器中插入一些条目,但是,如果条目具有与之前插入的条目之一共有的两个特定属性:它将被视为欺骗。
棘手的部分是,如果我发现任何欺骗,我不希望任何共享这些属性值的条目成为容器的一部分(甚至不是第一个,这不是一个欺骗,因为它是首先发现。)
我正在考虑使用多图,将一对中的两个属性作为键(假设两个属性具有明确定义的运算符==)和指向该条目的指针作为索引所有条目的值。 / 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
答案 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.