如何根据c +值的比例对c ++中的向量进行排序

时间:2014-03-19 09:09:10

标签: c++ sorting stdvector

我有一个向量,它的元素由两个整数组成。我想首先计算每个元素的这2个整数的比率,然后根据这个比率对向量进行排序。

2 个答案:

答案 0 :(得分:8)

看看std::sort。该函数允许您使用自己指定的谓词对集合进行排序。在下面的示例代码中,我创建了vector pair个。 cmp函数通过计算每个对的比率来比较其中两对,如果true的比率大于a,则返回b

因此,您需要指定一个函数(或函数对象,或lambda或其他),它接受集合元素类型的两个参数并进行比较。如果a应该在b之前,那么该函数应该返回true,如果没有,那么它应该返回false。该函数是std::sort

的第三个参数
#include <algorithm>
#include <vector>

bool cmp(const std::pair<int, int>& a, const std::pair<int, int>& b)
{
    // you should probably also add some code to prevent dividing by zero...
    return (static_cast<double>(a.first)/a.second) > (static_cast<double>(b.first)/b.second);
}

int main()
{
    std::vector<std::pair<int, int> > pairs;
    std::sort(pairs.begin(), pairs.end(), &cmp);
}

答案 1 :(得分:3)

在C ++ 11中:

#include <algorithm>
#include <vector>

int main ( )
{
    typedef std::pair<int, int> elem_t;
    std::vector<std::pair<int, int>> pairs;
    std::sort(pairs.begin(), pairs.end(), [](elem_t const & e1, elem_t const & e2)
    {
        e1.first * e2.second < e1.second * e2.first;
    });
}

如果您不了解[](...){...}语法,则它是来自c ++ 11的lambda表达式。

请注意,按照我的方式比较乘法具有更好的划分精度(因为发生整数除法),但可能导致溢出。