2个参数上的排序向量

sorting vector on 2 parameters

本文关键字:排序 向量 参数 2个      更新时间:2023-10-16
struct bvp{
    unsigned b;
    unsigned v;
    unsigned p;
};

矢量bvpVec;

现在我想先对向量bvpVec按b排序,然后按v排序。我可以使用std::sort()只使用b进行排序。但是我不知道如何使用bvpVec先按b排序,然后按p排序。例如,如果我的向量是:

(b,v,p)
(1,4,2)
(0,82,0)
(55,1,0)
(0,81,0)
(2,30,0)

那么我想按如下方式排序:

(b,v,p)
(0,81,0)
(0,82,0)
(1,4,2)
(2,30,0)
(55,1,0)

我的向量bvpVec也很大,所以如果有人能建议任何比std::sort()更快的排序过程,它将被添加到我的情况下。

可以提供自定义比较,并将其作为第三个参数传递给std::sort。

bool comp(const bvp& lhs, const bvp& rhs) {
    return lhs.b < rhs.b || (lhs.b == rhs.b && lhs.p < rhs.p);
}
std::sort(bvpVec.begin(), bvpVec.end(), comp);

或者您可以提供operator<bvp。>

bool operator<(const bvp& lhs, const bvp& rhs) {
    return lhs.b < rhs.b || (lhs.b == rhs.b && lhs.p < rhs.p);
}
std::sort(bvpVec.begin(), bvpVec.end());

如果你使用c++ 11,你甚至可以尝试lambda

std::sort(bvpVec.being(), bvpVec.end(), 
          [](const bvp& lhs, const bvp& rhs) { 
              return lhs.b < rhs.b || (lhs.b == rhs.b && lhs.p < rhs.p);
          });

std::sort可以很好地做到这一点。您只需要适当地编写比较函数。

struct bvp{
    unsigned b;
    unsigned v;
    unsigned p;
    bool operator<(bvp const &other) const  { 
        if (b < other.b)
            return true;
        if (b > other.b)
            return false;
        return v < other.v;
    }
};

你只需要:

std::vector<bvp> bvpvec;
// ...
std::sort(bvpvec.begin(), bvpvec.end());
就优化而言,一种可能性是在单独的类中实现比较:
struct comp { 
    bool operator()(bvp const &a, bvp const &b) const { 
        if (a.b < b.b)
            return true;
        if (a.b > b.b)
            return false;
        return a.v < b.v; 
    }
};

这通常有助于编译器能够为比较生成内联代码,从而消除了在排序的最内层循环中的函数调用。

std::sort(bvpvec.begin(), bvpvec.end(), comp());

使用自定义比较器,如

bool comp(const bvp& lhs, const bvp& rhs)
{
    return std::tie(lhs.b, lhs.v, lhs.p) < std::tie(rhs.b, rhs.v, rhs.p);
}

std::tie创建了一个引用元组,而operator<按字典顺序对元组进行排序,因此最终效果是先按b排序,然后按v排序,然后按p排序。