Сортировка вектора вектора в Cpp

#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).