std::vector<std::vector<std::string>> vect{
{"abc","def","2"},
{"def","ghi","2"},
{"abc","def","2"},
{"abc","def","3"}};
std::sort(vect.begin(),vect.end(),
[](const std::vector<std::string>& a,const std::vector<std::string>& b){
/*if(a[2]!=b[2]) return a[2]>b[2];*/});
我想要的是如果它们的第二个索引元素相同,则保留初始顺序。更具体地说,我的预期结果是
vect={
{"abc","def","3"},
{"abc","def","2"},
{"def","ghi","2"},
{"abc","def","2"}};
我希望带有
"3"
的元素行上升,但订单的其余部分保持不变。但它也会根据索引 0 和 1 进行自动排序。 (就好像它写成 return a[2]!=b[2]?a[2]>b[2]:a[0]!=b[0]?a[0]<b[0]:a[1]<b[1];
它会自动添加类似 std::less
的延续,从而保持按字母顺序对剩余元素进行排序)如何仅根据索引 2 值进行排序,并且如果索引 2 值相同,则不将某些值包含到排序中?
为了实现您正在寻找的排序行为,您希望根据每个内部向量的第三个元素对
std::vector<std::vector<std::string>>
进行排序,但如果第三个元素相等,则希望保持原始顺序。这称为带有自定义比较器的稳定排序。
在 C++ 中,
std::stable_sort
用于此目的。它维护比较函数未建立严格顺序的元素的相对顺序(即,当比较函数针对 false
和 a < b
都返回 b < a
时)。
以下是编写比较器并使用
std::stable_sort
对向量进行排序的方法:
#include <vector>
#include <string>
#include <algorithm>
int main() {
std::vector<std::vector<std::string>> vect{
{"abc", "def", "2"},
{"def", "ghi", "2"},
{"abc", "def", "2"},
{"abc", "def", "3"}
};
std::stable_sort(vect.begin(), vect.end(),
[](const std::vector<std::string>& a, const std::vector<std::string>& b) {
// Compare only the third element of each vector
return a[2] > b[2];
}
);
// vect is now sorted according to your requirements
}
提供给
std::stable_sort
的 lambda 函数仅比较内部向量的第三个元素(索引 2)。如果它们相等,std::stable_sort
将保持其原始相对顺序。
运行此代码后,
vect
应根据第三个元素按降序排序,但具有相同第三个元素的任何元素将保留其相对于彼此的原始顺序。这应该会给你预期的结果:
vect = {
{"abc", "def", "3"},
{"abc", "def", "2"},
{"def", "ghi", "2"},
{"abc", "def", "2"}
};
第一个内部向量被移动到顶部,因为它的第三个元素“3”大于其他向量中的“2”。第三个元素为“2”的向量的相对顺序与原来相同。