Стандартные типы сортировки библиотек и пользовательские типы
Если я хочу сортировать вектор UDT одним из двух типов переменных, которые он выполняет, возможно ли это для стандартной сортировки библиотеки или мне нужно написать свою собственную функцию сортировки.
Например, если бы вы
struct MyType{ int a; int b; }; vector moo; // do stuff that pushes data back into moo sort(moo.begin(), moo.end()) // but sort it by lowest to highest for a, not b
Так можно ли использовать сортировку stdlib? Благодарю.
- c # словарь один ключ многие значения
- Перегрузка оператора в C ++ как int + obj
- Scanf пропускает любой другой цикл while в C
- Почему class System.Random не статичен?
- Внедрить общий тайм-аут C #
- Windows Phone 8.1 Universal App завершается при переходе со второй страницы?
- Существуют ли практические применения для динамического каста для указателя пустоты?
- В WPF можно фильтровать CollectionViewSource без кода?
- Адрес указателя в многомерном массиве C
- Как я могу вызвать событие рисования?
- Ошибка: переход к метке case
- Шаблоны C ++, которые принимают только определенные типы
- Откройте файл с помощью Блокнота в C #
Можно использовать стандартную функцию, если ваш тип реализует "bool operator < (...) const"
и конструктор копирования (сгенерированный компилятором или пользовательский).
struct MyType { int a; int b; bool operator < (const MyType& other) const { ... // a meaningful implementation for your type } // Copy constructor (unless it's a POD type). MyType(const MyType &other) : a(other.a), b(other.b) { } // Some other form of construction apart from copy constructor. MyType() : a(0), b(0) { } };
Кроме того, вы можете передать функцию упорядочения (или функтор) в качестве третьего аргумента для sort()
вместо реализации оператора "<"
.
bool type_is_less(const MyType& t1, const MyType& t2) { ... } ... std::sort(c.begin(), c.end(), type_is_less);
Это полезно в следующих ситуациях:
- вы не хотите внедрять оператор
"<"
по какой-либо причине, - вам нужно отсортировать контейнер со встроенными или указательными типами, для которых вы не можете перегружать операторов.
- вы хотите отсортировать последовательность, используя разные порядки. ex: иногда вам нужна структура с именами / фамилиями, отсортированными по имени, а иногда и по имени. две разные функции (или функторы) делают такие параметры тривиальными.
Существует три способа сделать это:
Вы можете перегрузить operator<
для своего classа:
bool operator<(const MyType& lhs, const MyType& rhs) {return lhs.a
Это имеет тот недостаток, что, если вы когда-нибудь захотите отсортировать их по b
, вам не повезло.
Вы также можете специализировать std::less
для своего типа. Это делает std::sort
работы (и другие вещи, например, использование типа в качестве ключа на карте) без захвата operator<
для этого значения. Тем не менее, он по-прежнему захватывает синтаксис сравнения общего назначения для a
, в то время как в других местах вашего кода вы можете сравнить свой тип в соответствии с b
.
Или вы можете написать свой собственный компаратор следующим образом:
struct compare_by_a { bool operator()(const MyType& lhs, const MyType& rhs) const {return lhs.a
(Примечание: const
после оператора не является строго необходимым. Тем не менее, я считаю его хорошим стилем). Это оставляет неопределенным универсальное средство сравнения; поэтому, если какой-то код хочет использовать их без вашего ведома, компилятор испускает ошибку и информирует вас об этом. Вы можете использовать это или другие компараторы выборочно и явно, где вам нужно сравнение.