Страницы

Поиск по вопросам

среда, 18 декабря 2019 г.

Как отсортировать vector<pair<int,pair<int,int>>> по second.second (третий int)?

#cpp


Есть предположение, что возможно провернуть с sort(v.begin(), v.end(), cmp), но не
понимаю, как задействуется/что означает третий параметр (гугл также не внес ясности)
    


Ответы

Ответ 1



В предположении, что вас интересует vector>>, cmp может выглядеть примерно так, например: bool cmp(const pair>& p1, const pair>& p2) { return p1.second.second < p2.second.second; }

Ответ 2



Это ссылка на функцию вида bool foo(const T& a, const T& b), где T — тип элементов сортируемого вектора. Задача этой функции — проверить, упорядочены ли a и b по возрастанию. Иными словами, не превышает ли значение a таковое у b (говоря математическим языком — соблюдается ли условие a < b).

Ответ 3



cmp это любой функциональный объект. Это может быть лямбда, указатель на функцию или объект класса у которого определен operator(). Этот функциональный объект должен принимать два объекта из сортируемого списка, и возвращать bool. Объект должен реализовывать операцию строгого слабого упорядочения. Вот так это будет выглядеть на вашем примере: #include #include #include typedef std::pair> IntIntInt; struct Compare{ inline bool operator()(const IntIntInt &x, const IntIntInt &y) const{ return x.second.second < y.second.second; } }; int main(){ std::vector v; v.push_back(std::make_pair(5, std::make_pair(3, 4))); v.push_back(std::make_pair(1, std::make_pair(9, 0))); v.push_back(std::make_pair(8, std::make_pair(6, 7))); v.push_back(std::make_pair(4, std::make_pair(2, 3))); v.push_back(std::make_pair(3, std::make_pair(1, 2))); std::sort(v.begin(), v.end(), Compare()); } PS: гугл также не внес ясности Не сочтите за рекламу. Есть один замечательный сайт на котором можно подсмотреть описание всех алгоритмов, их аргументы, гарантии исключений, сложность и примеры использования.

Комментариев нет:

Отправить комментарий