C ++自定义比较器不工作MWE

时间:2018-03-29 01:19:46

标签: c++ c++11 stl comparator stl-algorithm

我知道关于这个的帖子很少,所以随时删除我的帖子,但是这段代码:

#include <bits/stdc++.h>
#define tol 1e-9
using namespace std;

int n;
vector<pair<double,double>> vec;

struct comparator {
    bool operator () ( pair<double,double> &a, pair<double,double> &b ) {
        if ( fabs(a.first-b.first) < tol )
            return a.second < b.second;
        return a.first > b.first;
    }
};

int main() {
    int i,j,k,ts,cs= 0,m,sz;
    for ( ; 1 == scanf("%d",&n); ) {
        for ( vec.clear(), vec.reserve(n), i = 0; i < n; ++i )
            scanf("%lf %lf",&vec[i].second,&vec[i].first);
        sort(vec.begin(),vec.end(),comparator());
        for ( i = 0; i < n; ++i )
            printf("%lf %lf\n",vec[i].first,vec[i].second);
    }
    return 0;
}

不适用于此示例:

2
120 60
60 90

我将其编译为g++ -std=c++11 -o a mwe.cpp,我的是g++ version 5.4

2 个答案:

答案 0 :(得分:0)

您将resize()reserve()混淆了。

写作时

for ( vec.clear(), vec.reserve(n), i = 0; i < n; ++i )

您为向量n保留了大小vec,即您正在指示vec为将来扩展到n元素保留内存大小。但是,目前,vec的大小仍为零。

所以,当你写

scanf("%lf %lf",&vec[i].second,&vec[i].first); 

你正在写未初始化的对象。

非常非常糟糕。

从技术上讲:你在UB(未定义行为)。

实际上说:一切都可以发生。

写作时

sort(vec.begin(),vec.end(),comparator());

您正在对零大小的向量vec进行排序,其中vec.begin()等于vec.end()

换句话说:std::sort()绝对不做任何事。

解决方案:避免使用clear()(正如Caleth指出的那样,如果您在resize()后重置并重置所有元素,这是多余的)并使用resize()代替reserve()

// -------vvvvvv
for ( vec.resize(n), i = 0; i < n; ++i )

关闭主题建议:

  • 避免非标准包括bits/stdc++.h
  • 避免旧的C I / O并使用新的C ++;所以没有std::scanf()std::printf()并使用std::cinstd::cout

答案 1 :(得分:0)

我认为你应该真正按照我的条件 - 笔迹工作。该片段看起来真的难以理解。循环初始化器中有如此多的语句。第三个循环可以使用基于范围的语法。我尽可能避免传统的for循环。 您可以在开始时保留并继续使用push_back,直到假定的容量为止。