如何按第一个和第二个索引对 C++ 中的二维向量进行排序?
How can I sort a 2D vector in C++ by the first and second index?
我想知道如何在 C++ 中对 2D 向量进行排序,以便它按两个元素排序。按照第一个元素升序排列,如果第一个元素有多个,则按照第二个元素升序排列。这是我的意思的一个例子:
vector<vector<int>> vec = {{10, 23}, {10, 22}, {1, 100}, {13, 12}};
这将被分类为:
{{1, 100}, {10, 22}, {10, 23}, {13, 12}}
像这样:
int m = vec.size();
int n = vec[0].size();
sort(vec[0].begin(), vec[0].end());
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
cout << vec[i][j] << " ";
cout << endl;
}
我看到的时候觉得这很酷。使用与 std::sort 的比较函数,您可以编写如下内容。这很好地扩展并且在嵌套排序上非常灵活!
bool comp(vector<int> v1, vector<int> v2)
{
if(v1[0]<v2[0])
return true;
else if(v1[0]==v2[0])
return v1[1]<v2[1];
else
return false;
}
sort(vec.begin(), vec.end(), [&](vector<int> &a, vector<int> &b){
return a[0] < b[0]? true : (a[0] == b[0]) ? a[1] < b[1] : false;
});
如果您使用的是 C++20 std::ranges::sort
将是一个不错的选择:
#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>
int main() {
std::vector<std::vector<int>> vec = {{10, 25}, {10, 23}, {10, 22},
{10, 24}, {1, 100}, {13, 12}};
std::ranges::sort(vec);
for (const auto& row : vec)
for (const auto& col : row)
std::cout << col << " ";
}
输出:
1 100 10 22 10 23 10 24 10 25 13 12
如果不是 std::sort
也同样有效:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<std::vector<int>> vec = {{10, 25}, {10, 22}, {10, 26},
{10, 24}, {1, 100}, {13, 12}};
std::sort(vec.begin(), vec.end());
for (const auto& row : vec)
for (const auto& col : row)
std::cout << col << " ";
}
输出:
1 100 10 22 10 24 10 25 10 26 13 12
我想知道如何在 C++ 中对 2D 向量进行排序,以便它按两个元素排序。按照第一个元素升序排列,如果第一个元素有多个,则按照第二个元素升序排列。这是我的意思的一个例子:
vector<vector<int>> vec = {{10, 23}, {10, 22}, {1, 100}, {13, 12}};
这将被分类为:
{{1, 100}, {10, 22}, {10, 23}, {13, 12}}
像这样:
int m = vec.size();
int n = vec[0].size();
sort(vec[0].begin(), vec[0].end());
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++)
cout << vec[i][j] << " ";
cout << endl;
}
我看到的时候觉得这很酷。使用与 std::sort 的比较函数,您可以编写如下内容。这很好地扩展并且在嵌套排序上非常灵活!
bool comp(vector<int> v1, vector<int> v2)
{
if(v1[0]<v2[0])
return true;
else if(v1[0]==v2[0])
return v1[1]<v2[1];
else
return false;
}
sort(vec.begin(), vec.end(), [&](vector<int> &a, vector<int> &b){
return a[0] < b[0]? true : (a[0] == b[0]) ? a[1] < b[1] : false;
});
如果您使用的是 C++20 std::ranges::sort
将是一个不错的选择:
#include <algorithm>
#include <iostream>
#include <ranges>
#include <vector>
int main() {
std::vector<std::vector<int>> vec = {{10, 25}, {10, 23}, {10, 22},
{10, 24}, {1, 100}, {13, 12}};
std::ranges::sort(vec);
for (const auto& row : vec)
for (const auto& col : row)
std::cout << col << " ";
}
输出:
1 100 10 22 10 23 10 24 10 25 13 12
如果不是 std::sort
也同样有效:
#include <algorithm>
#include <iostream>
#include <vector>
int main() {
std::vector<std::vector<int>> vec = {{10, 25}, {10, 22}, {10, 26},
{10, 24}, {1, 100}, {13, 12}};
std::sort(vec.begin(), vec.end());
for (const auto& row : vec)
for (const auto& col : row)
std::cout << col << " ";
}
输出:
1 100 10 22 10 24 10 25 10 26 13 12