2014-02-16 3 views
0

Проблема заключается в том, как реализовать алгоритм пользовательской сортировки, который работает для любого типа данных (точный алгоритм сортировки здесь не имеет значения). В Java вы создаете общий контейнер, например. List<T>, где T необходимо реализовать интерфейс Comparable. Это гарантирует, что любые два элемента типа T можно сравнить с помощью метода compareTo и, основываясь на нем, вы можете применить общий порядок к элементам списка.Произвольный тип сортировки в C++ по сравнению с Java-генераторами

Java имеет дженерики и C++ имеет шаблоны. В любом случае, C++ вообще не использует интерфейсы (только абстрактные классы). Каков рекомендуемый способ хорошего дизайна для реализации сортировки пользовательского типа на C++? Например, у меня есть класс Person, который я хочу отсортировать по возрасту (или что-то еще). Как мне это сделать?

+0

Изучите функцию 'sort' в стандартной библиотеке? –

ответ

0

Ну, есть ожидание, что если тип имеет заказ, его можно сравнить с помощью оператора <. Так, например, если вы хотите, чтобы отсортировать класс/std::sort-структуру с помощью, можно было бы написать что-то вроде этого:

struct foo{ 
    int x, y; 
}; 

inline bool operator< (const foo& lhs, const foo& rhs){ /* do actual comparison */ } 

и ныне std::sort(begin(vec), end(vec) форму std::sort работ. Конечно, есть еще один способ объявить < оператор для структур/классов:

struct foo{ 
    int x, y; 
    bool operator<(const foo& rhs){ 
    /* do comparison */ 
    } 
}; 

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

std::sort(begin(vec), end(vec), [](const foo& lhs, const foo& rhs) { 
    /* do the actual comparison */ 
}); 

(возможно странно выглядящий, что в качестве третьего аргумента является лямбда-функции)

--- Редактировать ---
Надеюсь, я исправил все глупые ошибки, как, если нужно, забыть полуколоны. Я обвиняю вас в том, что ушел с компьютера на прошлой неделе. :-)

+0

Это именно то, о чем я думал. Спасибо за фрагменты кода. – ducin

0

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

Смежные вопросы