【问题标题】:C++ vector of pairsC++ 向量对
【发布时间】:2015-01-05 19:57:56
【问题描述】:

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

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

【问题讨论】:

  • 什么运行时错误?什么代码在调用它?尽量提供一个最小的完整代码示例。
  • 呵呵。对问题的完全误读导致我写了这个有创意的位:coliru.stacked-crooked.com/a/b9fb36b7fba6d4a9
  • 通常,尤其是在排序的情况下,您会希望使用函数对象而不是直接使用比较函数,因为对函数对象的 operator() 的调用通常可以内联。函数对象基本上实现了这里的人通过 operator() 建议作为比较函数的函数之一。在 c++11 中,您可以使用 function<...> 模板。

标签: c++ algorithm data-structures stl


【解决方案1】:

我认为您的比较函数不正确。要实现排序,您需要以下内容:

bool compare(const pair<int, int>&i, const pair<int, int>&j)
{
    return abs(i.first-i.second) < abs(j.first-j.second);
}

【讨论】:

  • 它的工作。但你能说出导致这种情况的思维过程吗?我只是在学习高级 stl
  • 在您的程序中,您正在计算第一次和第二次的差异并检查差异。但是,根据您的答案要求,您需要比较单个对的元素之间的差异。
  • 是的,您希望该函数通过其值的差异来比较两对。因此,如果第一对的差值小于第二对,它应该返回 true。对 abs() 的调用只是他们获取差值的绝对值。如果 i.first 为 2 且 i.second 为 1,则 i.first-i.second 等于 -1。但是,两者的区别是abs(-1),也就是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;
}

【讨论】:

    【解决方案3】:

    这是在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 2011-02-11
      • 1970-01-01
      • 2012-06-21
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多