Я участвую в использовании функции сортировки STL, применяя ее к некоторому сложному вектору пар.
У меня есть следующий вектор:
vector< pair< int , pair< int , pair< string , pair< int , int > > > > >
Мне нужно сначала отсортировать элементы на основе первого целого числа в паре, и если окажется, что есть два элемента с одинаковыми значениями, тогда мне нужно отсортировать их на основе целого числа, присутствующего во внутренней паре.
если я представляю вышеуказанный тип как:
vector< pair< I , pair< G , pair< S , pair< T , T > > > > >
сначала мне нужно отсортировать их по I, а затем по G. Можно ли это сделать эффективно, просто используя компараторы?
Вызовите std::sort(RandomIt first, RandomIt last)
передав подходящую функцию сравнения как comp
. Функция сравнения по умолчанию будет сравнивать элементы так, как вы их заказывали.
std::sort
, но как мне написать этот компаратор?» Ответ: «Вызов std::sort
с подходящим компаратором».
Для вашего конкретного случая будет использоваться сравнение по умолчанию в std::pair
.
http://en.cppreference.com/w/cpp/utility/pair/operator_cmp
template< class T1, class T2 >
bool operator<( const pair<T1,T2>& lhs, const pair<T1,T2>& rhs );
Примените это правило с одним шагом рекурсии, чтобы убедиться, что это так:
Если lhs.first <rhs.first, возвращает true. В противном случае, если rhs.first <lhs.first, возвращает false. В противном случае, если lhs.second <rhs.second, возвращает true. В противном случае возвращает false.
В С++ 11, если вам нужно выбрать критерий сортировки во время выполнения, вы можете использовать лямбда для сравнения. Он должен принимать ссылки const на тип и возвращать bool.
Вот как это будет выглядеть.
typedef pair< int , pair< int , pair< string , pair< int , int > > > > MyComplexType;
std::vector<MyComplexType> v;
// fill v
// sort
auto complexLessThan = [](const MyComplexType& left, const MyComplexType& right) -> bool
{
// your sorting criterion here
}
std::sort(v.begin(), v.end(), complexLessThan);
std::sort
, и он будет работать из коробки. Вот сила стандартной библиотеки.