Стандартные типы сортировки библиотек и пользовательские типы

Если я хочу сортировать вектор 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? Благодарю.

Можно использовать стандартную функцию, если ваш тип реализует "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); 

Это полезно в следующих ситуациях:

  1. вы не хотите внедрять оператор "<" по какой-либо причине,
  2. вам нужно отсортировать контейнер со встроенными или указательными типами, для которых вы не можете перегружать операторов.
  3. вы хотите отсортировать последовательность, используя разные порядки. 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 после оператора не является строго необходимым. Тем не менее, я считаю его хорошим стилем). Это оставляет неопределенным универсальное средство сравнения; поэтому, если какой-то код хочет использовать их без вашего ведома, компилятор испускает ошибку и информирует вас об этом. Вы можете использовать это или другие компараторы выборочно и явно, где вам нужно сравнение.

  • Как элементы массива C ++ обрабатываются в функциях управления копированием?
  • В чем смысл ключевого слова var?
  • Как конвертировать UTF-8 std :: string в UTF-16 std :: wstring?
  • Как добавить WTL и ATL в visual studio c ++ express 2008
  • C ++ Преобразование строки (или char *) в wstring (или wchar_t *)
  • получение типа T из IEnumerable
  • Зачем нужно прикладывать lambda-выражение при поставке в качестве простого параметра делегата
  • Когда я должен создать деструктор?
  • Почему необходим allocator :: rebind, когда у нас есть параметры шаблона шаблона?
  • (object) является «полем», но используется как «тип»,
  • Как работают classы атрибутов?
  • Давайте будем гением компьютера.