// Требование.
// Целевой контейнер должен содержать достаточное число записей (начиная с dest) для помещения туда результата, т. к. записи в целевой контейнер не добавляются, а заменяются существующие.
// Возвращается новый указатель на конец (т. е. на следующий за последним элемент в целевом контейнере).
// Параметры. 1 и 2 - интервал в исходном контейнере, в котором нужно произвести эту операцию.
// 3 - начало диапазона в целевом контейнере, куда будут записаны результаты.
template <class ElementType, class FwdIter>
FwdIter copy_unique (const FwdIter first, const FwdIter last, const FwdIter dest)
{
std::set<ElementType> elements;
FwdIter return_value = dest;
for (FwdIter current = first; current != last; ++current)
if (elements.count (*current) == 0)
{
elements.insert (*current);
*++return_value = *current;
}
return return_value;
}
STL list
Программа написанная на Builder наполняет контейнер list. В этом контейнере вразброс находятся повторяющиеся записи. Как не меняя порядок записей удалить дубликаты записей?
Цитата:
void unique();
Removes all but the first element in every consecutive group of equal elements. The relative order of elements that are not removed is unchanged, and iterators to elements that are not removed remain valid. This function is linear time: it performs exactly size() - 1 comparisons for equality.
а вот здесь пример (строка 64):
http://www.daniweb.com/code/snippet100.html
В строке 64 метод unique() Он удаляет дубликаты если они находятся рядом. Чтобы удалить все дубликаты надо применить метод sort, но тогда нарушиться порядок.
ну а на вскидку:
Цитата:
1. берем первый элемент, ищем все одинаковые с ним, удаляем их проходясь по списку;
2. берем второй элемент, так же как и в предыдущем пункте;
...
n-1. берем предпоследний элемент, так же как и в предыдущем пункте;
Цитата: lena_ki
Программа написанная на Builder наполняет контейнер list. В этом контейнере вразброс находятся повторяющиеся записи. Как не меняя порядок записей удалить дубликаты записей?
Первый вариант. Воспользуемся set для определения, встречалась ли эта запись в указанном контейнере. Поскольку после удаления элемента итераторы могут стать невалидными, придется вместо модификации исходного контейнера создавать новый.
Код:
Второй вариант, как и предлагал "Тень пса". Ну это уж пусть он сам напишет :)
Сейчас подумал... Можно в принципе переделать первый вариант, чтобы использовался только один контейнер. Элементы сдвигать к началу, если встречаются повторы.
set вроде сортирует все по алфавиту. Думала загрузить все в map, он сам убирет дубликаты, но в этом случае будут храниться дополнительные и не нужные ключи самого контейнера map. Я так понимаю простого способа удалить дубликаты из списка нет, т.е. в STL нет контейнера загрузка строк в который привела бы к тому что дубликаты убирались автоматом и при этом чтобы не было никакой сортировки.
Один из индексов - уникальный, отвечает собственно за уникальность элементов.
Второй - sequenced (см. сам boost).
А насчет того, что "set вроде сортирует все по алфавиту", алгоритм сортировки вы по сути задаете сами, указав бинарный предикат для сравнения значений.