我有一对配对。 我想以这样的方式对这些对进行排序,即它们之间的差异最小的是第一个元素。例如
(1,10),(2,5), (5,8), (1,2), (8,10)
排序后:
(1,2), (8,10), (2,5), (5,8) , (1,10)
我试过这样但是我遇到了运行时错误:
bool compare(const pair<int, int>&i, const pair<int, int>&j)
{
if( (i.first-i.second) < (j.first-j.second) )
return i.first < j.first ;
else
return j.first < j.second;
}
答案 0 :(得分:3)
我认为您的比较功能不正确。要实现排序,您需要以下内容:
bool compare(const pair<int, int>&i, const pair<int, int>&j)
{
return abs(i.first-i.second) < abs(j.first-j.second);
}
答案 1 :(得分:2)
您的比较运算符并不好,因为它不是传递和不对称的。传递本质上意味着如果你有三对a,b和c,compare(a,b)
为真,compare(b,c)
为真,则compare(a,c)
应为真。非对称意味着如果compare(a,b)
为真,则compare(b, a)
应该为假。如果你想首先按差异进行比较,然后按字典顺序使用某种类型:
bool compare(const pair<int, int>&i, const pair<int, int>&j)
{
if( (i.first-i.second) != (j.first-j.second) )
return i.first - i.second< j.first - j.second;
else
return i < j;
}
答案 2 :(得分:0)
这是在lambda表达式中使用C ++ 14自动功能的代码:
#include <vector>
#include <utility>
#include <cstdlib> // for std::abs(int)
#include <iostream>
#include <algorithm>
int main()
{
using namespace std;
vector<pair<int, int>> v =
{ {1,10}
, {2,5}
, {5,8}
, {1,2}
, {8,10}
};
auto abs_distance = [](auto const& v) { return abs(v.first - v.second); };
sort( v.begin(), v.end()
, [&abs_distance](auto const& lhs, auto const& rhs)
{ return abs_distance(lhs) < abs_distance(rhs); }
)
;
for(auto const& p: v)
cout << "("<< p.first << ", " << p.second << ") ";
cout << endl;
return 0;
}
您可以使用例如铿锵道:
clang++ -std=c++1y main.cpp