Мне нужно вставить некоторые записи в контейнер, но в случае, если запись имеет два общих атрибута с одной из ранее вставленных записей: она будет считаться дублированием.
Сложность состоит в том, что в случае, если я нахожу какой-либо обман, я не хочу, чтобы какая-либо запись, разделяющая значения этих атрибутов, вообще была частью контейнера (даже не первой, которая не была обманом, как она была обнаружена впервые) ,
Я думал об использовании мультикарты с двумя атрибутами в паре в качестве ключа (при условии, что два атрибута имеют четко определенный оператор ==) и указателем на запись в качестве значения для индексации всех записей.
После того, как я отсканировал все записи и выполнил свою мультикарту, я бы перебрал всю мультикарту и с помощью добавлений 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
Я хотел бы использовать карту (не мультикарту), как это:
карта mymap; для (все записи) { pair :: iterator, bool> res = mymap.insert (entry); если (! res-> секунда) { // Значение не вставлено, дубликат уже должен быть здесь. // Помечаем дубликат, обнуляя указатель записи iter-> first-> second = NULL; } } // Теперь удаляем все элементы из mymap с нулевым указателем, и у вас есть карта с уникальными записями.
Других решений пока нет …