Сортировка и фильтр в STL
От: peer  
Дата: 20.01.08 20:49
Оценка:
Всем драсти!

Есть грид с данными.
Грид построен на векторах STL. Может кто-то подсказать где мона порыть или найти алгоритмы сортировки (причем может идти последовательная сортировка, т.е. сначала по одному, потом по второму столбцу) и фильтра (особенно по "частичному совпадению") найти?

22.01.08 09:09: Перенесено модератором из 'MFC' — SchweinDeBurg
Re: Сортировка и фильтр в STL
От: Константин Л. Франция  
Дата: 22.01.08 08:41
Оценка: +1
Здравствуйте, peer, Вы писали:

P>Всем драсти!


P>Есть грид с данными.

P>Грид построен на векторах STL. Может кто-то подсказать где мона порыть или найти алгоритмы сортировки (причем может идти последовательная сортировка, т.е. сначала по одному, потом по второму столбцу) и фильтра (особенно по "частичному совпадению") найти?

std::sort + предикат, std::remove_if + предикат. В чем проблема то?
Re: Сортировка и фильтр в STL
От: Glоbus Украина  
Дата: 22.01.08 08:54
Оценка:
Здравствуйте, peer, Вы писали:

P>Всем драсти!


P>Есть грид с данными.

P>Грид построен на векторах STL. Может кто-то подсказать где мона порыть или найти алгоритмы сортировки (причем может идти последовательная сортировка, т.е. сначала по одному, потом по второму столбцу) и фильтра (особенно по "частичному совпадению") найти?

Порыть можно заголовочник <algorithm> — там много разных сортировок и методов работы с контейнерами. Плюс практически в любом из них можно указывать предикат, описывающий условия сравнения/удаления.
Удачи тебе, браток!
Re: Сортировка и фильтр в STL
От: Юнусов Булат Россия  
Дата: 22.01.08 10:09
Оценка:
Здравствуйте, peer, Вы писали:

P>Грид построен на векторах STL. Может кто-то подсказать где мона порыть или найти алгоритмы сортировки (причем может идти последовательная сортировка, т.е. сначала по одному, потом по второму столбцу)


std::sort по первому столбцу потом std::stable_sort по второму
stable_sort для того и придумана
Re[2]: Сортировка и фильтр в STL
От: CiViLiS Россия  
Дата: 22.01.08 19:36
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>stable_sort для того и придумана

Она не для этого придумана. С этим алгоритмом сохраняется порядок, если сравниваемые значиния одинаковы.
А для вопроса топикстартера, нужно просто написать предикат типа такого:
bool less(const T& a, const T& b)
{
    if(a.column1 < b.column1)
        return true;
    if(a.column1 > b.column1)
        return false;
    if(a.column2 < b.column2)
        return true;
    ....
}
... << RSDN@Home 1.2.0 alpha rev. 784>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[3]: Сортировка и фильтр в STL
От: Юнусов Булат Россия  
Дата: 23.01.08 06:30
Оценка:
Здравствуйте, CiViLiS, Вы писали:

CVL>Она не для этого придумана. С этим алгоритмом сохраняется порядок, если сравниваемые значиния одинаковы.



Он [stable_sort] сохраняет относительный порядок эквивалентных элементов. Если х и у — элементы из диапазона [first, last), такие, что х предшествует у, и если эти элементы эквивалентны (ни один из них "не меньше" другого), то stable_sort имеет дополнительное постусловие кроме постусловий sort: х по прежнему предшествует у.
Гарантия стабильности чрезвычайно важна, потому что при некотором упорядочении два элемента могут быть эквивалентны, не являясь при этом идентичными. Рассмотрим распространенный пример: упорядочение последовательности Ф.И.О по фамилии. Если у двух человек одинаковая фамилия, но разные имена, то их записи эквивалентны с точки зрения сравнения по фамилии (ни одно из них "не меньше" другого), но, тем не менее, они не равны. Это одна из причин по которой stable_sort иногда бывает полезен. Если вы сортируете последовательность записей с несколькими разными полями, то можно отсортировать записи по одному полю, не нарушая порядок, который ранее был достигут при сортировке по другому полю.

Мэтью Г. Остерн. Обобщенное программирование и STL


CVL>А для вопроса топикстартера, нужно просто написать предикат типа такого:

CVL>
CVL>bool less(const T& a, const T& b)
CVL>{
CVL>    if(a.column1 < b.column1)
CVL>        return true;
CVL>    if(a.column1 > b.column1)
CVL>        return false;
CVL>    if(a.column2 < b.column2)
CVL>        return true;
CVL>    ....
CVL>}
CVL>


Самый простой способ не всегда самый верный.
Напоминаю-автор топика ваяет грид.
Было бы интересно посмотреть как ты предлагаешь "просто писать предикат типа такого" — то есть создавать новые типы функциональных объектов по столбцам выбранным в рантайме пользователем.
Re[4]: Сортировка и фильтр в STL
От: CiViLiS Россия  
Дата: 23.01.08 06:58
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Он [stable_sort] сохраняет относительный порядок эквивалентных элементов.

Вот пусть у нас есть такая табличка:

1 4
1 2

2 3
3 2

4 1

Нужно ее отсортировать сначала по первому столбцу, а потом по второму. По первому я уже отсортировал. Если применить тот же стэйбл сорт для сортировки по второму столбцу, то будет вот такая таблица:

4 1
1 2

3 2
2 3

1 4

Это совсем не то, что имел в виду автор -- не смотря на то, что (1,2) раньше (3,2), то есть порядок не нарушен, первый столбец, перестал быть отсортированным.

ЮБ>Было бы интересно посмотреть как ты предлагаешь "просто писать предикат типа такого" — то есть создавать новые типы функциональных объектов по столбцам выбранным в рантайме пользователем.

а в чем проблема?
class less
{
public:
    less(const std::vector<int>& sortorder)
        : sortorder_(sortorder)
    {}
    
    bool operator()(const T& a, const T&b)
    {
        std::vector<int>::const_iterator itr = sortorder_.begin();
        while(itr != sortorder_.last())
        {
            if(a.column[itr->i] < b.column[itr->i])
                return true;
            if(a.column[itr->i] > b.column[itr->i])
                return false;
            ++itr;
        }
        return false; // элементы равны, а значит а не меньше b
    }
    
    
private:
        std::vector<int> sortorder_;
    
}

Код не компилировал, но идея должна быть ясна. Можно также использовать lexicographical_compare, но тут прийдется делать новый итератор.
... << RSDN@Home 1.2.0 alpha rev. 784>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[5]: Сортировка и фильтр в STL
От: Chorkov Россия  
Дата: 23.01.08 08:30
Оценка:
Здравствуйте, CiViLiS, Вы писали:

CVL>Здравствуйте, Юнусов Булат, Вы писали:


...

CVL>а в чем проблема?

CVL>
CVL>class less
CVL>{
CVL>public:
CVL>    less(const std::vector<int>& sortorder)
CVL>        : sortorder_(sortorder)
CVL>    {}
    
CVL>    bool operator()(const T& a, const T&b)
CVL>    {
CVL>        std::vector<int>::const_iterator itr = sortorder_.begin();
CVL>        while(itr != sortorder_.last())
CVL>        {
CVL>            if(a.column[itr->i] < b.column[itr->i])
CVL>                return true;
CVL>            if(a.column[itr->i] > b.column[itr->i])
CVL>                return false;
CVL>            ++itr;
CVL>        }
CVL>        return false; // элементы равны, а значит а не меньше b
CVL>    }
    
    
CVL>private:
CVL>        std::vector<int> sortorder_;
    
CVL>}
CVL>

CVL>Код не компилировал, но идея должна быть ясна. Можно также использовать lexicographical_compare, но тут прийдется делать новый итератор.


Я тоже сперва подумал, что правильный путь — созданием сложного оператора сравнения строк.
Но, применительно именно к таблице, как к элементу GUI это потребует усложнения кода, по сравнению с использованием stable_sort.
Когда пользователь говорит "а отсортируй ка мне по этой колонке ..." подразумевается, что для эквивалентных (по этой колонке строк) порядок сохранится, что соответствует логике stable_sort.
Со сложным оператором нужно не только помнить текущий порядок сортировки, но и правильно обрабатывать его модификацию:
(Например, если пользователь несколько систематически переключался между двумя колонками, вектор с порядком сравнений, не должен расти до бесконечности ....).
В общем, реализация со stable_sort, МНОГО проще. (Именно для grid-а, а не для абстрактной сортировки по нескольким колонкам.)
Re[5]: Сортировка и фильтр в STL
От: Юнусов Булат Россия  
Дата: 23.01.08 09:25
Оценка:
Здравствуйте, CiViLiS, Вы писали:

CVL>Это совсем не то, что имел в виду автор -- не смотря на то, что (1,2) раньше (3,2), то есть порядок не нарушен, первый столбец, перестал быть отсортированным.


Неплохо бы автора спросить что он имел в виду.

ЮБ>>Было бы интересно посмотреть как ты предлагаешь "просто писать предикат типа такого" — то есть создавать новые типы функциональных объектов по столбцам выбранным в рантайме пользователем.

CVL>а в чем проблема?
В том что столбцов по которым сортируем не обязательно два, их может быть любое неизвестное на момент написания кода число.

Если предполагается сортировать тыкая к примеру по хедерам столбцов, то stable_sort самое то.

А если автор хочет что то типа
order by a asc
order by b desc
order by с asc
order by d desc
order by e desc
...

То это задача не грида, (найди пример грида в котором у столбцов выставляетя приоритет сортировки), а источника данных.
Re[5]: Сортировка и фильтр в STL
От: Sergey Россия  
Дата: 23.01.08 09:37
Оценка:
"CiViLiS" <19808@users.rsdn.ru> wrote in message news:2807973@news.rsdn.ru...
> Здравствуйте, Юнусов Булат, Вы писали:
>
> ЮБ>Он [stable_sort] сохраняет относительный порядок эквивалентных элементов.
> Вот пусть у нас есть такая табличка:
>

> 1 4
> 1 2
> 2 3
> 3 2
> 4 1

> Нужно ее отсортировать сначала по первому столбцу, а потом по второму. По первому я уже отсортировал. Если применить тот же стэйбл сорт для сортировки по второму столбцу, то будет вот такая таблица:
>

> 4 1
> 1 2
> 3 2
> 2 3
> 1 4

> Это совсем не то, что имел в виду автор -- не смотря на то, что (1,2) раньше (3,2), то есть порядок не нарушен, первый столбец, перестал быть отсортированным.

Ну так а в чем проблема отсортировать ее сначала по второму столбцу, а потом по первому? Получится как раз то, что вы хотите.
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re[6]: Сортировка и фильтр в STL
От: CiViLiS Россия  
Дата: 23.01.08 10:06
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>В общем, реализация со stable_sort, МНОГО проще. (Именно для grid-а, а не для абстрактной сортировки по нескольким колонкам.)

Она не проще, оно решает другую задачу, вернее частную. Если автору нужно сортировка одновременно по нескольким столбцам, то ему стэбл сорт никоим образом не поможет. И естественно пользователю не понравится, когда при добавлении новой строки, ранее добавленные элементы с одинаковым ключом, вдруг поменяются местами..
... << RSDN@Home 1.2.0 alpha rev. 778>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[6]: Сортировка и фильтр в STL
От: CiViLiS Россия  
Дата: 23.01.08 10:06
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>Здравствуйте, CiViLiS, Вы писали:


ЮБ>В том что столбцов по которым сортируем не обязательно два, их может быть любое неизвестное на момент написания кода число.

А я что написал? У меня разве в коде где-то есть какое-то ограничение?

ЮБ>Если предполагается сортировать тыкая к примеру по хедерам столбцов, то stable_sort самое то.

Стейб сорт никак не поможет при одновременном упорядочевании по двум столбцам сразу.

ЮБ>То это задача не грида, (найди пример грида в котором у столбцов выставляетя приоритет сортировки), а источника данных.

Excel подойдет?
... << RSDN@Home 1.2.0 alpha rev. 778>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[7]: Сортировка и фильтр в STL
От: CiViLiS Россия  
Дата: 23.01.08 10:31
Оценка:
Здравствуйте, CiViLiS, Вы писали:

ЮБ>>Если предполагается сортировать тыкая к примеру по хедерам столбцов, то stable_sort самое то.

CVL>Стейб сорт никак не поможет при одновременном упорядочевании по двум столбцам сразу.
Хотя не... поможет..
... << RSDN@Home 1.2.0 alpha rev. 778>>
"Бог не терпит голой сингулярности" -- Роджер Пенроуз
Re[7]: Сортировка и фильтр в STL
От: Юнусов Булат Россия  
Дата: 23.01.08 10:57
Оценка:
Здравствуйте, CiViLiS, Вы писали:

ЮБ>>В том что столбцов по которым сортируем не обязательно два, их может быть любое неизвестное на момент написания кода число.

CVL>А я что написал? У меня разве в коде где-то есть какое-то ограничение?
Я не сомневаюсь в твоей возможности решить эту задачу, но пока там и функционала то особо не видно,
а ведь у столбца в контекте сортировки кроме приоритета сортировки должно быть и направление {None, Asc, Desc}, что в свою очередь тоже несколько поменяет логику.
Думаешь, то что получится подойдет под определение "нужно просто написать что то типа"?

ЮБ>>Если предполагается сортировать тыкая к примеру по хедерам столбцов, то stable_sort самое то.

CVL>Стейб сорт никак не поможет при одновременном упорядочевании по двум столбцам сразу.
Аминь, только я вроде специально разделил на два разных юскейза, а ты снова их путаешь.

ЮБ>>То это задача не грида, (найди пример грида в котором у столбцов выставляетя приоритет сортировки), а источника данных.

CVL>Excel подойдет?
Ексел много больше чем просто грид, при всем возможном уважении к топикстартеру я сильно сомневаюсь что кто то напишет второй Ексел.
Re[2]: Сортировка и фильтр в STL
От: MasterZiv СССР  
Дата: 23.01.08 17:04
Оценка: :)
Юнусов Булат wrote:
> std::sort по первому столбцу потом std::stable_sort по второму
> stable_sort для того и придумана

Нет, это неправильно. Так не отсортируется.
Надо писать предикат, куда передавать
критерий сортировки — список полей, по кот. сортируется,
и этот предикат уже внутри должен сравнивать не
одно, а N полей.
Что касается взаимодействия с STL — там все элементарно просто.
Posted via RSDN NNTP Server 2.1 beta
Re[6]: Сортировка и фильтр в STL
От: Roman Odaisky Украина  
Дата: 26.01.08 23:17
Оценка:
Здравствуйте, Юнусов Булат, Вы писали:

ЮБ>То это задача не грида, (найди пример грида в котором у столбцов выставляетя приоритет сортировки), а источника данных.


Почтовики это часто умеют.
До последнего не верил в пирамиду Лебедева.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.