我有一个向量,它的元素由两个整数组成。我想首先计算每个元素的这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表达式。
请注意,按照我的方式比较乘法具有更好的划分精度(因为发生整数除法),但可能导致溢出。