Алгоритм сортировки для вектора

Suares

Ребята у меня есть структура типа:
struct Set
{
    int row;    //строка в матрице
    int value;  //значение, которое повторяется
    int count; //количество повторений значения
    ...
};
Это структура для хранения повторяющихся значений в строке матрицы. Я хочу отсортировать весь вектор данных значений по полю count. Подскажите алгоритм из STL или boost для сортировки. А то через for уже не хочется
9 ответов

Suares

Suares, Вы можете имплементировать свою функцию сравнения и использовать sort


Suares

Вы можете имплементировать свою функцию сравнения
во у Вас и термины, может проще сказать "ввести предикат"?


Suares

во у Вас и термины, может проще сказать "ввести предикат"?
имплеменировать функцию-предикат. Что Вас не устраивает?


Suares

имплеменировать функцию-предикат. Что Вас не устраивает?
да это мой страный юмор был, в общем для "имплементации" в программировании есть русское слово "реализовывать", да собственно оно тут лесом, если просто освоить понятие предиката, в STL и ООП предикат нужная вещь


Suares

Можно использовать boost::bind:
#include <boost/bind.hpp>
#include <boost/range/algorithm/sort.hpp>
 
// ...
 
using namespace boost::placeholders;
boost::sort(vector, boost::bind(&Set::count, _1) < boost::bind(&Set::count, _2));


Suares

gray_fox, можно, кст, просто перегрузить оператор сравнения для структуры. вроде бы то же самое будет, или нет?


Suares

metaluga145, можно, но так стоит делать, если только объекты класса действительно так "сравниваются", а не потому что "что бы вот здесь по такому полю отсортировать".


Suares

Можно использовать boost::bind:
А можно ли таким образом отсортировать тип std::map? Вот у меня есть такая таблица:
typedef std::map<std::string, std::string> Row; // first - title of column, second - value of column 
typedef std::map<int, Row> Table; // first - number of row
И я хочу отсортировать значения по любому столцу. т. е. если у меня в 1ом столбце 1ой строки значение больше чем в 1ом столбце 2ой строки, то меняем между собой строки.


Suares

Suares, map уже отсортирован согласно ключу, ключ в паре ключ\значение неизменяем, да и алгоритм sort требует итераторы с произвольным доступом, так что не получиться, если только самому сортировку писать. Не знаю правда, зачем таблицу таким образом представлять, но это уже другой вопрос)Т.е. думаю можно написать сортировку, которая будет работать с двунаправленными итераторами, потом что-нибудь вроде
my_sort(table | boost::adaptors::map_values, boost::bind(&Row::first, _1) < boost::bind(&Row::first, _2));