Удалить повторяющиеся записи

Мне нужно вставить некоторые записи в контейнер, но в случае, если запись имеет два общих атрибута с одной из ранее вставленных записей: она будет считаться дублированием.

Сложность состоит в том, что в случае, если я нахожу какой-либо обман, я не хочу, чтобы какая-либо запись, разделяющая значения этих атрибутов, вообще была частью контейнера (даже не первой, которая не была обманом, как она была обнаружена впервые) ,

Я думал об использовании мультикарты с двумя атрибутами в паре в качестве ключа (при условии, что два атрибута имеют четко определенный оператор ==) и указателем на запись в качестве значения для индексации всех записей.

После того, как я отсканировал все записи и выполнил свою мультикарту, я бы перебрал всю мультикарту и с помощью добавлений 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

Решение

Я хотел бы использовать карту (не мультикарту), как это:

карта mymap;
для (все записи)
{
pair :: iterator, bool> res = mymap.insert (entry);
если (! res-> секунда)
{
// Значение не вставлено, дубликат уже должен быть здесь.
// Помечаем дубликат, обнуляя указатель записи
iter-> first-> second = NULL;
}
}
// Теперь удаляем все элементы из mymap с нулевым указателем, и у вас есть карта с уникальными записями.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]