【问题标题】:Problem in using comparator function [c++]使用比较器函数的问题 [c+​​+]
【发布时间】:2020-03-20 17:38:39
【问题描述】:

在使用下面给出的比较器功能时,我遇到了分段错误:-

    class Solution {
    public:
static bool comp( pair<int,pair<int,int> > &a, pair<int,pair<int,int> > &b )
{
    if(a.first <= b.first)
        return 1;
    else
        return 0;
}
int t1(vector<int>& nums, int target)
{
    vector< pair<int,pair<int,int> > > sum_of_two;
    int n=nums.size();
    for(int i=0;i<n;i++)
    {
        for(int j=i+1;j<n;j++)
        {
            sum_of_two.push_back( make_pair( nums[i]+nums[j] ,make_pair(i,j) ) ); 
        }
    }
    sort(sum_of_two.begin(),sum_of_two.end() ,comp );
    return 1;  
}
    };

但是下面的 comp 函数工作正常,我找不到原因?

      static bool comp( pair<int,pair<int,int> > &a, pair<int,pair<int,int> > &b )
      {
            if(a.first < b.first)
                  return 1;
             else
                  return 0;
      }

【问题讨论】:

  • 在您致电sort() 时肯定会发生段错误吗?
  • 另外,需要注意的是t1()不返回值,但是它期望返回一个int
  • sort() 函数发生段错误
  • “比较”函数实际上是排序函数,你说任何元素都应该在自身之前排序,这是不可能的。

标签: c++ comparator


【解决方案1】:

这两个比较是不同的。第一个没有实现严格的弱排序,因为如果a.first == b.first 那么comp(a, b)comp(b, a) 都将返回true。由于这违反了比较函数的要求,所以行为是未定义的。

修复很简单:将测试更改为

if(a.first < b.first)

这样当两个值相等时它返回false

【讨论】:

  • 如果我们使用 if(a.first
  • @vikasyadav 是的。当2==2 时,你会认为2&lt;2 是假的,对吧?
  • @vikasyadav "a is not ordered before b" 和 "b is not ordered before a" 可以同时为真(例如,如果a == b 或如果它们不能被排序完全)。 “a 在 b 之前排序”和“b 在 a 之前排序”不能同时为真。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 1970-01-01
  • 2019-06-07
相关资源
最近更新 更多