【问题标题】:C++ custom comparator not working MWEC++ 自定义比较器不工作 MWE
【发布时间】:2018-09-07 20:27:02
【问题描述】:

我知道已经很少有关于这个的帖子了,所以请随意删除我的帖子,但是这段代码:

#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

【问题讨论】:

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


    【解决方案1】:

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

    当你写作时

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

    您为向量vec 保留大小n,也就是说,您正在指示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

    【讨论】:

    • @BenVoigt - 哦!我必须倒转更多的睡眠时间……预留更多的睡眠时间!已更正。谢谢!
    • 另外vec.clear()是多余的,要求capacity()不要改
    【解决方案2】:

    我认为你真的应该在你的 - 用我的话 - 笔迹上工作。 sn-p 看起来真的不可读。循环初始化程序中有这么多语句。第三个循环可以使用基于范围的语法。我倾向于尽可能避免传统的 for 循环。 您可以在开始时保留并继续使用 push_back 直到假定容量耗尽。

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2013-11-27
      • 1970-01-01
      • 2017-11-02
      • 2020-10-22
      • 2020-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多