#c #sorting #stdvector
Вопрос:
Допустим, у меня есть этот вектор вектора [[5,10],[2,5],[4,7],[3,9]]
, и я хочу отсортировать его с помощью sort()
метода cpp, чтобы он стал таким [[5,10],[3,9],[4,7],[2,5]]
после сортировки. То есть я хочу сортировать по второму индексу.
Теперь я написал этот код для сортировки этого вектора вектора, но он работает неправильно.
static bool compareInterval( vector<vector<int>> amp;v1, vector<vector<int>> amp;v2)
{
return (v1[0][1]>v2[0][1]);
}
sort(boxTypes.begin(), boxTypes.end(), compareInterval);
Может ли кто-нибудь сказать мне, где я ошибаюсь, и как я могу это исправить. Заранее спасибо.
Комментарии:
1. Я бы предположил
compare
, что функция должна принимать (ссылку на) вектор int, а не вектор векторов.
Ответ №1:
Ваш вид может выглядеть так
std::sort(boxTypes.begin(), boxTypes.end(), [](auto constamp; lhs, auto constamp; rhs) {
return lhs[1] > rhs[1];
});
другими словами, сортировка по [1]
элементу каждого вектора и использование >
для сортировки в порядке убывания. Обратите внимание, что в лямбда — функции lhs
и rhs
имеют тип const std::vector<int>amp;
.
Ответ №2:
Когда ваш код сортирует вектор векторов, затем в булеву функцию он передает два вектора (не вектор векторов) и сравнивает их, чтобы определить, нужно ли их менять местами или они находятся в правильном положении относительно друг друга.
Следовательно, здесь вам нужно сравнить только 2 вектора (вы пытались сравнить вектор векторов).
Изменения, которые вам нужно внести, compareInterval
это:
static bool compareInterval( vector<int> amp;v1, vector<int> amp;v2)
{
return (v1[1]>v2[1]);
}
Найдите мой тестовый код ниже:
#include <bits/stdc .h>
using namespace std;
static bool compareInterval( vector<int> amp;v1, vector<int> amp;v2)
{
return (v1[1]>v2[1]);
}
int main() {
vector<vector<int>> boxTypes = {{5,10},{2,5},{4,7},{3,9}};
sort(boxTypes.begin(), boxTypes.end(), compareInterval);
for(int i=0;i<4;i )
cout<<boxTypes[i][0]<<" "<<boxTypes[i][1]<<"n";
}
Ответ №3:
Прогнозы диапазона будут несколько полезны для этого.
ranges::sort
алгоритм получил бы:
- только вектор для сортировки; никаких итераторов в начале и в конце.
- (необязательно) функция, которую вы хотите использовать для сортировки,
greater
в данном случае. - (необязательно) проекция: для каждого элемента
t
исходного вектора, который оказывается другим вектором из двух элементов, получите его второй элемент, т. Е.t[1]
и отсортируйте по нему.
std::ranges::sort(boxTypes, std::ranges::greater{}, [](autoamp;amp; bt) { return bt[1]; });
Примечание. Я смог выполнить эту компиляцию только в msvc, а не в gcc или clang (и с последней версией /std:c , даже с /std:c 20; https://godbolt.org/z/9Kqfa9vhx).