对的C ++向量

时间:2015-01-05 19:57:57

标签: c++ algorithm data-structures stl

我有一对配对。 我想以这样的方式对这些对进行排序,即它们之间的差异最小的是第一个元素。例如

(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;
}

3 个答案:

答案 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