在 Cpp 中对 Vector of Vector 进行排序
Sorting a Vector of Vector in Cpp
假设我有这个vector[[5,10],[2,5],[4,7],[3,9]]
的vector,我想用cpp的sort()
方法对它进行排序,排序后变成这个[[5,10],[3,9],[4,7],[2,5]]
。那就是我想根据第二个索引进行排序。
现在我已经写了这段代码来对这个vector of vector进行排序,但是它不能正常工作。
static bool compareInterval( vector<vector<int>> &v1, vector<vector<int>> &v2)
{
return (v1[0][1]>v2[0][1]);
}
sort(boxTypes.begin(), boxTypes.end(), compareInterval);
谁能告诉我哪里错了,我能改正吗?提前致谢。
你的类型可能看起来像
std::sort(boxTypes.begin(), boxTypes.end(), [](auto const& lhs, auto const& rhs) {
return lhs[1] > rhs[1];
});
换句话说,按每个向量的 [1]
元素排序,并使用 >
降序排序。请注意,在 lambda 函数中 lhs
和 rhs
的类型为 const std::vector<int>&
.
距离投影对此会有一定的帮助。
ranges::sort
算法将收到:
- 只是要排序的向量;开始和结束没有迭代器。
- (可选)要用于排序的函数,在本例中为
greater
。
- (可选)投影:对于原始向量的每个元素
t
,它恰好是两个元素的另一个向量,获取它的第二个元素,即 t[1]
,然后对其进行排序.
std::ranges::sort(boxTypes, std::ranges::greater{}, [](auto&& bt) { return bt[1]; });
请注意,我只能在 msvc 上进行编译,不能在 gcc 或 clang 上进行编译(使用 /std:c++latest,甚至不能使用 /std:c++20;https://godbolt.org/z/9Kqfa9vhx ).
当您的代码对向量的向量进行排序时,它会将两个向量(不是向量的向量)传递给布尔函数,然后比较它们以确定它们是否需要互换,或者它们相对于每个向量的位置是否正确其他.
因此,这里您只需要比较 2 个向量(您已经尝试比较向量中的向量)。
您需要在 compareInterval
中进行的更改是:
static bool compareInterval( vector<int> &v1, vector<int> &v2)
{
return (v1[1]>v2[1]);
}
在下面找到我的测试代码:
#include <bits/stdc++.h>
using namespace std;
static bool compareInterval( vector<int> &v1, vector<int> &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";
}
假设我有这个vector[[5,10],[2,5],[4,7],[3,9]]
的vector,我想用cpp的sort()
方法对它进行排序,排序后变成这个[[5,10],[3,9],[4,7],[2,5]]
。那就是我想根据第二个索引进行排序。
现在我已经写了这段代码来对这个vector of vector进行排序,但是它不能正常工作。
static bool compareInterval( vector<vector<int>> &v1, vector<vector<int>> &v2)
{
return (v1[0][1]>v2[0][1]);
}
sort(boxTypes.begin(), boxTypes.end(), compareInterval);
谁能告诉我哪里错了,我能改正吗?提前致谢。
你的类型可能看起来像
std::sort(boxTypes.begin(), boxTypes.end(), [](auto const& lhs, auto const& rhs) {
return lhs[1] > rhs[1];
});
换句话说,按每个向量的 [1]
元素排序,并使用 >
降序排序。请注意,在 lambda 函数中 lhs
和 rhs
的类型为 const std::vector<int>&
.
距离投影对此会有一定的帮助。
ranges::sort
算法将收到:
- 只是要排序的向量;开始和结束没有迭代器。
- (可选)要用于排序的函数,在本例中为
greater
。 - (可选)投影:对于原始向量的每个元素
t
,它恰好是两个元素的另一个向量,获取它的第二个元素,即t[1]
,然后对其进行排序.
std::ranges::sort(boxTypes, std::ranges::greater{}, [](auto&& bt) { return bt[1]; });
请注意,我只能在 msvc 上进行编译,不能在 gcc 或 clang 上进行编译(使用 /std:c++latest,甚至不能使用 /std:c++20;https://godbolt.org/z/9Kqfa9vhx ).
当您的代码对向量的向量进行排序时,它会将两个向量(不是向量的向量)传递给布尔函数,然后比较它们以确定它们是否需要互换,或者它们相对于每个向量的位置是否正确其他.
因此,这里您只需要比较 2 个向量(您已经尝试比较向量中的向量)。
您需要在 compareInterval
中进行的更改是:
static bool compareInterval( vector<int> &v1, vector<int> &v2)
{
return (v1[1]>v2[1]);
}
在下面找到我的测试代码:
#include <bits/stdc++.h>
using namespace std;
static bool compareInterval( vector<int> &v1, vector<int> &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";
}