Если у меня есть вектор пар:
std::vector<std::pair<int, int> > vec;
Есть ли простой способ отсортировать список в порядке возрастания на основе второго элемента пары?
Я знаю, что могу написать небольшой функциональный объект, который будет выполнять эту работу, но есть ли способ использовать существующие части STL и std::less
выполнять работу напрямую?
EDIT: я понимаю, что могу написать отдельную функцию или класс для перехода к третьему аргументу для сортировки. Вопрос в том, смогу ли я построить его из стандартных вещей. Я бы действительно что-то вроде:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
Ответы:
РЕДАКТИРОВАТЬ : используя С ++ 14, лучшее решение очень легко написать благодаря лямбдам, которые теперь могут иметь параметры типа
auto
. Это мое любимое решение на данный моментПросто используйте собственный компаратор (это необязательный третий аргумент
std::sort
)Если вы используете компилятор C ++ 11, вы можете написать то же самое, используя лямбды:
РЕДАКТИРОВАТЬ : в ответ на ваши правки к вашему вопросу вот некоторые мысли ... если вы действительно хотите проявить творческий подход и иметь возможность многократно использовать эту концепцию, просто создайте шаблон:
тогда вы тоже можете это сделать:
или даже
Хотя, честно говоря, это все немного переборщило, просто напишите трехстрочную функцию и покончите с этим :-P
источник
operator<
inpair<T1,T2>
. Компаратор по умолчанию использует и первый, и второй элемент (если первые равны). Здесь используется только второй."is there and easy way to sort the list in increasing order based on the second element of the pair?"
Вы можете использовать ускорение следующим образом:
Я не знаю стандартного способа сделать это одинаково коротким и лаконичным, но вы можете взять
boost::bind
все, состоящее из заголовков.источник
Это довольно просто: вы используете функцию сортировки из алгоритма и добавляете свою собственную функцию сравнения
Теперь вам нужно провести сравнение на основе второго выбора, поэтому объявите «myComparison» как
источник
С C ++ 0x мы можем использовать лямбда-функции:
В этом примере тип возвращаемого значения
bool
выводится неявно.Типы возврата лямбда
Когда лямбда-функция имеет один оператор, и это оператор возврата, компилятор может определить тип возвращаемого значения. Из C ++ 11, §5.1.2 / 4:
Чтобы явно указать тип возвращаемого значения, используйте форму
[]() -> Type { }
, например:источник
if (lhs.second == 0)
?lhs.second < rhs.second
может вернутьtrue
илиfalse
компилятор может ясно вывестиbool
. Просто хотел продемонстрировать[]() -> Type { }
дело.Для чего-то многоразового:
Вы можете использовать его как
или
источник
Вам придется полагаться на нестандартный select2nd
источник
Попробуйте поменять местами элементы пар, чтобы вы могли использовать их
std::sort()
как обычно.источник