2个参数上的排序向量
sorting vector on 2 parameters
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
排序。
相关文章:
- 计算排序向量的向量中唯一值的计数
- 查找两个排序向量中共有的元素
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何从C++的对的排序向量中获取有关给定值的相应对
- 对象接收堆栈溢出异常 c++ 的排序向量
- "x"的所有元素都存在于"y"(排序向量)中吗?
- 指向指针排序向量的指针向量的 C++ 向量
- 未排序向量上的lower_bound/upper_bound
- 智能指针的排序向量:神秘崩溃
- 按类型排序向量并按类型或派生类型搜索
- 如何在不使用标准算法的情况下在排序向量中添加 c 元素?
- C++排序向量<double>与在<Object>双成员变量上键控的向量
- 字符串指针的排序向量
- 具有前导数字的字符串的排序向量
- 保证重新排序向量
- 结构解释的C 排序向量
- 更新排序向量的一个条目
- 通过在排序向量上使用二叉搜索来定位未排序向量中的元素
- 排序向量上 std::find_if 和 std::bind2nd 的替代品
- 使用QuickSort算法以降序排序向量