使用自定义比较器进行排序,但如果条件返回 false 则保持未排序

问题描述 投票:0回答:1
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 值相同,则不将某些值包含到排序中?

c++ sorting vector
1个回答
0
投票

为了实现您正在寻找的排序行为,您希望根据每个内部向量的第三个元素对

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”的向量的相对顺序与原来相同。

© www.soinside.com 2019 - 2024. All rights reserved.