Как отсортировать вектор <pair <int, pair <int, pair <string, pair <int, int>>>>>?

0

Я участвую в использовании функции сортировки STL, применяя ее к некоторому сложному вектору пар.

У меня есть следующий вектор:

vector< pair< int , pair< int , pair< string , pair< int , int > > > > >

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

если я представляю вышеуказанный тип как:

vector< pair< I , pair< G , pair< S , pair< T , T > > > > >

сначала мне нужно отсортировать их по I, а затем по G. Можно ли это сделать эффективно, просто используя компараторы?

  • 0
    Как выглядит ваш код сортировки? у вас есть какой-нибудь код для обмена?
  • 1
    Я устал повторять это в других ответах. std :: pair осуществляет лексикографическое сравнение. Все, что вам нужно сделать, это вызвать std::sort , и он будет работать из коробки. Вот сила стандартной библиотеки.
Теги:
sorting
vector
stl

2 ответа

1

Вызовите std::sort(RandomIt first, RandomIt last) передав подходящую функцию сравнения как comp. Функция сравнения по умолчанию будет сравнивать элементы так, как вы их заказывали.

  • 0
    Я думаю, что по умолчанию будет делать. std :: pair определяет несколько шаблонных лексикографических операторов сравнения.
  • 0
    Вопрос: «Я хочу использовать std::sort , но как мне написать этот компаратор?» Ответ: «Вызов std::sort с подходящим компаратором».
Показать ещё 4 комментария
0

Для вашего конкретного случая будет использоваться сравнение по умолчанию в 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);
  • 0
    Мне нужен компаратор структуры для этого не имею C ++ 11 со мной
  • 0
    Что ты уже испробовал. Написание собственного оператора сравнения - очень распространенный вопрос для SO.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню