Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

STL list

343
12 июля 2007 года
lena_ki
282 / / 14.04.2005
Программа написанная на Builder наполняет контейнер list. В этом контейнере вразброс находятся повторяющиеся записи. Как не меняя порядок записей удалить дубликаты записей?
92
12 июля 2007 года
Тень Пса
2.2K / / 19.10.2006
Цитата:

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

343
12 июля 2007 года
lena_ki
282 / / 14.04.2005
В строке 64 метод unique() Он удаляет дубликаты если они находятся рядом. Чтобы удалить все дубликаты надо применить метод sort, но тогда нарушиться порядок.
92
12 июля 2007 года
Тень Пса
2.2K / / 19.10.2006
ах да... извините, не обратил внимания на часть условия. :rolleyes: попробую после работы.

ну а на вскидку:

Цитата:

1. берем первый элемент, ищем все одинаковые с ним, удаляем их проходясь по списку;
2. берем второй элемент, так же как и в предыдущем пункте;
...
n-1. берем предпоследний элемент, так же как и в предыдущем пункте;

350
12 июля 2007 года
cheburator
589 / / 01.06.2006
Цитата: lena_ki
Программа написанная на Builder наполняет контейнер list. В этом контейнере вразброс находятся повторяющиеся записи. Как не меняя порядок записей удалить дубликаты записей?


Первый вариант. Воспользуемся set для определения, встречалась ли эта запись в указанном контейнере. Поскольку после удаления элемента итераторы могут стать невалидными, придется вместо модификации исходного контейнера создавать новый.

Код:
// Требование.
// Целевой контейнер должен содержать достаточное число записей (начиная с 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;
}

Второй вариант, как и предлагал "Тень пса". Ну это уж пусть он сам напишет :)
350
12 июля 2007 года
cheburator
589 / / 01.06.2006
Сейчас подумал... Можно в принципе переделать первый вариант, чтобы использовался только один контейнер. Элементы сдвигать к началу, если встречаются повторы.
343
13 июля 2007 года
lena_ki
282 / / 14.04.2005
set вроде сортирует все по алфавиту. Думала загрузить все в map, он сам убирет дубликаты, но в этом случае будут храниться дополнительные и не нужные ключи самого контейнера map. Я так понимаю простого способа удалить дубликаты из списка нет, т.е. в STL нет контейнера загрузка строк в который привела бы к тому что дубликаты убирались автоматом и при этом чтобы не было никакой сортировки.
350
14 июля 2007 года
cheburator
589 / / 01.06.2006
Для этого есть boost::multi_index_container.
Один из индексов - уникальный, отвечает собственно за уникальность элементов.
Второй - sequenced (см. сам boost).
А насчет того, что "set вроде сортирует все по алфавиту", алгоритм сортировки вы по сути задаете сами, указав бинарный предикат для сравнения значений.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог